✨ feat(gvg): 保存阵容、刷新对手、战报
This commit is contained in:
@@ -1,14 +1,15 @@
|
||||
import { Application, BackendSession, ChannelService, HandlerService } from "pinus";
|
||||
import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_PERIOD, ITEM_CHANGE_REASON, STATUS, VESTIGE_OPP_STATUS, VESTIGE_STATUS } from "../../../consts";
|
||||
import { Application, BackendSession, ChannelService, HandlerService, pinus } from "pinus";
|
||||
import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_PERIOD, ITEM_CHANGE_REASON, STATUS, VESTIGE_OPP_STATUS, VESTIGE_STATUS, WAR_TYPE } from "../../../consts";
|
||||
import { BattleRecordModel } from "../../../db/BattleRecord";
|
||||
import { GVGLeagueModel } from "../../../db/GVGLeague";
|
||||
import { GVGUserItemModel } from "../../../db/GVGUserItem";
|
||||
import { GVGVestigeLockModel } from "../../../db/GVGVestigeLock";
|
||||
import { GVGVestigeRankModel, GVGVestigeRankType } from "../../../db/GVGVestigeRank";
|
||||
import { GVGVestigeRecModel } from "../../../db/GVGVestigeRec";
|
||||
import { GVGVestigeRankModel } from "../../../db/GVGVestigeRank";
|
||||
import { GVGVestigeRecModel, GVGVestigeRecUpdate } from "../../../db/GVGVestigeRec";
|
||||
import { HeroModel } from "../../../db/Hero";
|
||||
import { RoleModel } from "../../../db/Role";
|
||||
import { GVGVestigeOppLineup } from "../../../domain/gvgField/returnData";
|
||||
import { getRemoteRplFilePath, getRemoteRplPrefix } from "../../../pubUtils/battleUtils";
|
||||
import { gameData } from "../../../pubUtils/data";
|
||||
import { GVG } from "../../../pubUtils/dicParam";
|
||||
import { resResult } from "../../../pubUtils/util";
|
||||
@@ -74,6 +75,40 @@ export class GVGProduceHandler {
|
||||
// 编辑阵容
|
||||
async saveLineup(msg: { vestigeId: number, lineup: [{ actorId: number, dataId: number, order: number }] }, session: BackendSession) {
|
||||
|
||||
const roleId = session.get('roleId');
|
||||
const serverId = session.get('serverId');
|
||||
const { vestigeId, lineup: heroes } = msg;
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
let groupId = await getGroupIdOfServer(serverId);
|
||||
|
||||
let myVestigeRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
if(!myVestigeRank) {
|
||||
let role = await RoleModel.findByRoleId(roleId, 'roleId');
|
||||
let oppRanks = refreshVestigeOppRanks(-1);
|
||||
myVestigeRank = await GVGVestigeRankModel.initRank(configId, vestigeId, groupId, role, oppRanks );
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
let lineup = heroes.map(hero => {
|
||||
let curHero = dbHeroes.find(cur => cur.hid == hero.actorId);
|
||||
return { actorId: curHero.hid, dataId: hero.dataId, order: hero.order, ce: curHero.ce }
|
||||
});
|
||||
let vestigeRank = await GVGVestigeRankModel.updateByRoleId(vestigeId, roleId, { lineup, hasDefense: true });
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
vestigeId,
|
||||
lineup: vestigeRank.lineup,
|
||||
lineupCe: vestigeRank.lineup.reduce((pre, cur) => pre + cur.ce, 0),
|
||||
});
|
||||
}
|
||||
|
||||
// 获取对手阵容消息
|
||||
@@ -111,8 +146,33 @@ export class GVGProduceHandler {
|
||||
}
|
||||
|
||||
// 刷新对手
|
||||
async refreshOpp(msg: {}, session: BackendSession) {
|
||||
async refreshOpp(msg: { vestigeId: number }, session: BackendSession) {
|
||||
|
||||
let roleId = session.get('roleId');
|
||||
let serverId = session.get('serverId');
|
||||
|
||||
let { vestigeId } = msg;
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
let groupId = await getGroupIdOfServer(serverId);
|
||||
|
||||
let myVestigeRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
if(!myVestigeRank) {
|
||||
let role = await RoleModel.findByRoleId(roleId, 'roleId');
|
||||
let oppRanks = refreshVestigeOppRanks(-1);
|
||||
myVestigeRank = await GVGVestigeRankModel.initRank(configId, vestigeId, groupId, role, oppRanks );
|
||||
}
|
||||
|
||||
let refreshCnt = myVestigeRank.refreshCnt||0;
|
||||
if(refreshCnt >= GVG.GVG_REFRESH_TIME) return resResult(STATUS.GVG_VESTIGE_REFESH_CNT_MAX);
|
||||
|
||||
let oppRanks = refreshVestigeOppRanks(myVestigeRank.rank);
|
||||
myVestigeRank = await GVGVestigeRankModel.refreshOpp(roleId, vestigeId, oppRanks );
|
||||
|
||||
let oppPlayers = await getOppPlayerByRanks(serverId, groupId, vestigeId, myVestigeRank.oppRanks);
|
||||
|
||||
// 返回
|
||||
return resResult(STATUS.SUCCESS, { vestigeId, refreshCnt: myVestigeRank.refreshCnt, oppPlayers });
|
||||
}
|
||||
|
||||
// 选择对手
|
||||
@@ -165,8 +225,6 @@ export class GVGProduceHandler {
|
||||
const oppDetail = await getOppDetailData(rec);
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
battleCode: rec.battleCode,
|
||||
time: Math.floor(rec.checkTime/100) + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN,
|
||||
active,
|
||||
...oppDetail
|
||||
});
|
||||
@@ -195,7 +253,7 @@ export class GVGProduceHandler {
|
||||
|
||||
let rec = await GVGVestigeRecModel.findByBattleCode(battleCode);
|
||||
if(!rec || rec.attackRoleId != roleId) return resResult(STATUS.LADDER_REC_NOT_FOUND);
|
||||
let status = getVestigeRecStatus(rec);
|
||||
let status = getVestigeRecStatus(rec).status;
|
||||
if(status == VESTIGE_STATUS.COMPLETE || status == VESTIGE_STATUS.NO) return resResult(STATUS.LADDER_REC_STATUS_IS_COMPLETE);
|
||||
|
||||
let result = await getOppDetailData(rec);
|
||||
@@ -212,7 +270,7 @@ export class GVGProduceHandler {
|
||||
|
||||
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);
|
||||
if(getVestigeRecStatus(rec).status != VESTIGE_STATUS.CHECK) return resResult(STATUS.GVG_VESTIGE_CHECK_BATTLE_STATUS_ERR);
|
||||
const { vestigeId, defenseInfo: { oldRank: rank }, warId } = rec;
|
||||
|
||||
for(let { actorId } of heroes) {
|
||||
@@ -229,8 +287,8 @@ export class GVGProduceHandler {
|
||||
if(!lock) return resResult(STATUS.GVG_VESTIGE_CHECK_BATTLE_STATUS_ERR);
|
||||
|
||||
// 向vestigerec保存阵容
|
||||
const attackHeroes = await generateAttackHeroInfo(heroes, dbHeroes);
|
||||
rec = await GVGVestigeRecModel.startBattle(battleCode, attackHeroes);
|
||||
const info = await generateAttackHeroInfo(heroes, dbHeroes);
|
||||
rec = await GVGVestigeRecModel.startBattle(battleCode, info.heroes, info.ce);
|
||||
|
||||
// 更新battleRecord
|
||||
let warInfo = gameData.war.get(warId);
|
||||
@@ -256,7 +314,7 @@ export class GVGProduceHandler {
|
||||
|
||||
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);
|
||||
if(getVestigeRecStatus(rec).status != 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);
|
||||
@@ -267,7 +325,7 @@ export class GVGProduceHandler {
|
||||
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);
|
||||
rec = await GVGVestigeRecModel.battleEnd(battleCode, isSuccess, endTime, atkData?.rank, defData?.rank||rec.attackInfo.oldRank);
|
||||
// 更新锁
|
||||
await GVGVestigeLockModel.releaseLock(rec.groupId, rec.vestigeId, rec.defenseInfo.oldRank);
|
||||
// 更新battleRecord
|
||||
@@ -286,8 +344,7 @@ export class GVGProduceHandler {
|
||||
rank: atkData.rank,
|
||||
score: gameData.gvgVestige.get(rec.vestigeId)?.get(atkData.rank)?.score,
|
||||
historyRank: atkData.historyRank,
|
||||
status: getVestigeRecStatus(rec),
|
||||
time: endTime,
|
||||
...getVestigeRecStatus(rec),
|
||||
oppPlayers: await getOppPlayerByRanks(serverId, rec.groupId, rec.vestigeId, atkData.oppRanks),
|
||||
breakGoods,
|
||||
lineup: atkData.lineup,
|
||||
@@ -295,6 +352,24 @@ export class GVGProduceHandler {
|
||||
});
|
||||
}
|
||||
|
||||
// 获取战报信息
|
||||
async getRec(msg: { vestigeId: number }, session: BackendSession) {
|
||||
let roleId = session.get('roleId');
|
||||
let { vestigeId } = msg;
|
||||
let list = await GVGVestigeRecModel.findRec(roleId, vestigeId);
|
||||
let result: (GVGVestigeRecUpdate & {rplFileUrl: string})[] = [];
|
||||
for(let rec of list) {
|
||||
const { attackRoleId, battleCode, hasRpl } = rec;
|
||||
const rplFileUrl = battleCode && hasRpl ? getRemoteRplFilePath(attackRoleId, WAR_TYPE.GVG_VESTIGE, battleCode) : '';
|
||||
const obj = getVestigeRecStatus(rec);
|
||||
if(obj.status == VESTIGE_STATUS.COMPLETE) result.push({ ...rec, endTime: Math.floor(obj.time/1000), rplFileUrl });
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
list: result,
|
||||
rplPrefixUrl: getRemoteRplPrefix(pinus.app.get('env'))
|
||||
});
|
||||
}
|
||||
|
||||
// 征战中原简单小排行榜
|
||||
async getLeagueRank(msg: {}, session: BackendSession) {
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import { getRandEelm, getRandValueByMinMax, resResult } from "../../pubUtils/uti
|
||||
import { getNumberArr, uniqueArr } from "../ladderService";
|
||||
import { getHeroesAttributes } from "../playerCeService";
|
||||
import { getAllServerName } from "../redisService";
|
||||
import { combineItems } from "../role/util";
|
||||
import { getGroupIdOfServer, getGVGServerType } from "./gvgService";
|
||||
|
||||
// 备战期的遗迹和激战期的开始结束战斗时间
|
||||
@@ -170,7 +171,7 @@ export async function generateDefenseInfo(roleId: string, vestigeId: number, ran
|
||||
let dicRank = gameData.gvgVestige.get(vestigeId)?.get(rank); // 调用之前已经验证过了
|
||||
let dicWar = gameData.war.get(dicRank?.warId);
|
||||
let dicWarJson = gameData.warJson.get(dicWar?.dispatchJsonId);
|
||||
if(!dicWarJson) return null;
|
||||
if(!dicWarJson) return new OppPlayerInfo();
|
||||
|
||||
let heroes: OppPlayerHeroInfo[] = [];
|
||||
for(let json of dicWarJson) {
|
||||
@@ -208,13 +209,13 @@ export async function generateAttackInfo(roleId: string, rank: number) {
|
||||
export async function generateAttackHeroInfo(lineup: { actorId: number, dataId: number, order: number }[], dbHeroes: HeroType[]) {
|
||||
let info = new OppPlayerInfo();
|
||||
info.setPlayerHeroes(dbHeroes, lineup);
|
||||
return info.heroes;
|
||||
return info;
|
||||
}
|
||||
|
||||
export async function getOppDetailData(rec: GVGVestigeRecType) {
|
||||
let isRobot = rec.defenseInfo.isRobot;
|
||||
let dicLadderDifficultRatio = gameData.ladderDifficultRatio.get(rec.defenseInfo.oldRank);
|
||||
let result = new OppDetailData();
|
||||
let result = new OppDetailData(rec, getVestigeRecStatus(rec));
|
||||
if(!isRobot) {
|
||||
const dicWar = gameData.war.get(dicLadderDifficultRatio.gkId);
|
||||
const dicWarJson = gameData.warJson.get(dicWar.dispatchJsonId);
|
||||
@@ -237,12 +238,14 @@ export async function getOppDetailData(rec: GVGVestigeRecType) {
|
||||
// 根据记录里的时间判断当前状态
|
||||
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;
|
||||
if(cancel) return { status: VESTIGE_STATUS.COMPLETE, time: endTime };
|
||||
if(endTime > 0 && endTime <= Date.now()) return { status: VESTIGE_STATUS.COMPLETE, time: endTime };
|
||||
if(battleTime > 0 && battleTime <= Date.now() && battleTime + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN * 1000 > Date.now()) return { status: VESTIGE_STATUS.BATTLE, time: battleTime + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN * 1000 };
|
||||
if(checkTime > 0 && checkTime <= Date.now() && checkTime + GVG.GVG_VESTIGE_PREPARE_COUNTDOWN * 1000 > Date.now()) return { status: VESTIGE_STATUS.CHECK, time: checkTime + GVG.GVG_VESTIGE_PREPARE_COUNTDOWN * 1000 };
|
||||
// 超时的
|
||||
if(battleTime > 0 && endTime == 0 && battleTime + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN * 1000 <= Date.now()) return { status: VESTIGE_STATUS.COMPLETE, time: battleTime + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN };
|
||||
if(checkTime > 0 && battleTime == 0 && checkTime + GVG.GVG_VESTIGE_PREPARE_COUNTDOWN * 1000 <= Date.now()) return { status: VESTIGE_STATUS.COMPLETE, time: checkTime + GVG.GVG_VESTIGE_PREPARE_COUNTDOWN };
|
||||
return { status: VESTIGE_STATUS.NO, time: 0 };
|
||||
}
|
||||
|
||||
// 将开始战斗时候的阵容存到防守阵容
|
||||
@@ -253,6 +256,7 @@ export async function updateMyVestigeRank(isChange: boolean, atkData: GVGVestige
|
||||
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;
|
||||
update.hasDefense = true;
|
||||
needUpdate = true;
|
||||
}
|
||||
if(atkData && atkData.rank > historyRank) { // 更新历史最高排名
|
||||
@@ -262,6 +266,7 @@ export async function updateMyVestigeRank(isChange: boolean, atkData: GVGVestige
|
||||
if(atkData) { // 排名变化时刷新对手
|
||||
let oppRanks = refreshVestigeOppRanks(atkData.rank);
|
||||
update.oppRanks = oppRanks;
|
||||
needUpdate = true;
|
||||
}
|
||||
}
|
||||
if(needUpdate) {
|
||||
@@ -277,8 +282,22 @@ 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;
|
||||
rewards.push(...dicRank.onceReward);
|
||||
leagueRewards.push(...dicRank.onceLeagueReward);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
return { rewards, leagueRewards }
|
||||
}
|
||||
@@ -34,6 +34,7 @@ export const WAR_TYPE = {
|
||||
TRY: 19, // 试用关卡
|
||||
BOSS: 20, // 演武台
|
||||
LADDER: 21, // 名将擂台
|
||||
GVG_VESTIGE: 22, // GVG征战中原
|
||||
};
|
||||
|
||||
// 藏宝图掉落参数
|
||||
|
||||
@@ -579,6 +579,7 @@ export const FILENAME = {
|
||||
DIC_GVG_VESTIGE: 'dic_zyz_GVGVestige',
|
||||
DIC_GVG_VESTIGE_RANGE: 'dic_zyz_GVGVestigeRange',
|
||||
DIC_GVG_VESTIGE_LEAGUE_RANK: 'dic_zyz_GVGVestigeLeagueRank',
|
||||
DIC_GK_GVG_VESTIGE: 'dic_zyz_gk_GVGVestige',
|
||||
}
|
||||
|
||||
export const WAR_RELATE_TABLES = [
|
||||
@@ -602,6 +603,7 @@ export const WAR_RELATE_TABLES = [
|
||||
FILENAME.DIC_GK_ARMY_BOSS,
|
||||
FILENAME.DIC_GK_LADDER,
|
||||
FILENAME.DIC_GK_BRANCH_ELITE,
|
||||
FILENAME.DIC_GK_GVG_VESTIGE,
|
||||
]
|
||||
|
||||
// 装备栏强化类型
|
||||
|
||||
@@ -346,6 +346,7 @@ export const STATUS = {
|
||||
GVG_VESTIGE_HERO_USED: { code: 21364, simStr: '该武将在其他遗迹已使用' },
|
||||
GVG_VESTIGE_BATTLE_END_STATUS_ERR: { code: 21365, simStr: '挑战时间超时' },
|
||||
GVG_VESTIGE_RANK_NOT_INIT: { code: 21366, simStr: '玩家数据未初始' },
|
||||
GVG_VESTIGE_REFESH_CNT_MAX: { code: 21367, simStr: '遗迹刷新次数不足' },
|
||||
|
||||
// 通用 30000 - 30099
|
||||
DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' },
|
||||
|
||||
@@ -135,6 +135,13 @@ export default class GVGVestigeRank extends BaseModel {
|
||||
session.endSession()
|
||||
}
|
||||
}
|
||||
|
||||
public static async refreshOpp(roleId: string, vestigeId: number, oppRanks: number[]) {
|
||||
let today = getZeroPoint();
|
||||
let result: GVGVestigeRankType = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId }, { $set: { oppRanks }, $inc: { refreshCnt: 1 } }, { new: true, upsert: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export const GVGVestigeRankModel = getModelForClass(GVGVestigeRank);
|
||||
|
||||
@@ -3,6 +3,7 @@ import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { OppPlayerInfo, OppPlayerHeroInfo } from '../domain/gvgField/gvgDb';
|
||||
import { genCode } from '../pubUtils/util';
|
||||
import { getTimeFunD } from '../pubUtils/timeUtil';
|
||||
|
||||
class LeagueGood {
|
||||
@prop({ required: true })
|
||||
@@ -16,7 +17,7 @@ class LeagueGood {
|
||||
}
|
||||
|
||||
@index({ battleCode: 1 })
|
||||
@index({ day: 1, groupId: 1, vestigeId: 1, rank: 1 })
|
||||
@index({ groupId: 1, vestigeId: 1, rank: 1 })
|
||||
export default class GVGVestigeRec extends BaseModel {
|
||||
|
||||
@prop({ required: true })
|
||||
@@ -74,14 +75,16 @@ export default class GVGVestigeRec extends BaseModel {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async startBattle(battleCode: string, attackHeroes: OppPlayerHeroInfo[]) {
|
||||
public static async startBattle(battleCode: string, attackHeroes: OppPlayerHeroInfo[], ce: number) {
|
||||
const result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ battleCode }, {
|
||||
$set: { battleTime: Date.now(), 'attackInfo.heroes': attackHeroes }
|
||||
$set: { battleTime: Date.now(), 'attackInfo.heroes': attackHeroes, 'attackInfo.ce': ce }
|
||||
}, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async battleEnd(battleCode: string, isSuccess: boolean, endTime: number, atkNewRank?: number, defNewRank?: number) {
|
||||
console.log('battleEnd', battleCode, isSuccess, endTime, atkNewRank, defNewRank)
|
||||
|
||||
let update: GVGVestigeRecUpdate = { endTime };
|
||||
if(isSuccess) {
|
||||
update['attackInfo.isSuccess'] = true;
|
||||
@@ -99,9 +102,23 @@ export default class GVGVestigeRec extends BaseModel {
|
||||
}
|
||||
|
||||
public static async giveup(roleId: string, battleCode: string) {
|
||||
const result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ attackRoleId: roleId, battleCode }, { $set: { cancel: true }}, { new: true }).lean();
|
||||
const result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ attackRoleId: roleId, battleCode }, { $set: { cancel: true, endTime: Date.now() }}, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public static async updateRplStatus(battleCode: string, hasRpl: boolean) {
|
||||
let result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ battleCode }, { hasRpl }, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findRec(roleId: string, vestigeId: number) {
|
||||
let recs: GVGVestigeRecType[] = await GVGVestigeRecModel.find({
|
||||
vestigeId, $or: [{attackRoleId: roleId}, { defenseRoleId: roleId }],
|
||||
createdAt: { $gte: <Date>getTimeFunD().getBeforeDayWithHour(3) },
|
||||
}).select({ battleCode: 1, attackRoleId: 1, defenseRoleId: 1, _id: 0, endTime: 1, attackInfo: 1, defenseInfo: 1, hasRpl: 1 }).limit(1000).lean();
|
||||
return recs;
|
||||
}
|
||||
}
|
||||
|
||||
export const GVGVestigeRecModel = getModelForClass(GVGVestigeRec);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { prop } from "@typegoose/typegoose";
|
||||
import { ArtifactModelType } from "../../db/Artifact";
|
||||
import { GVGVestigeRecType } from "../../db/GVGVestigeRec";
|
||||
import { HeroType, Talent } from "../../db/Hero";
|
||||
import { RoleType } from "../../db/Role";
|
||||
import { gameData } from "../../pubUtils/data";
|
||||
@@ -203,9 +204,23 @@ export class OppDetailHeroData {
|
||||
}
|
||||
|
||||
export class OppDetailData{
|
||||
roleId: string; // 对手的id
|
||||
isRobot: boolean;
|
||||
vestigeId: number;
|
||||
battleCode: string;
|
||||
status: number;
|
||||
time: number;
|
||||
heroes: OppDetailHeroData[] = [];
|
||||
lineupCe: number = 0;
|
||||
|
||||
constructor(rec: GVGVestigeRecType, obj: {status: number, time: number}) {
|
||||
this.vestigeId = rec.vestigeId;
|
||||
this.battleCode = rec.battleCode;
|
||||
this.roleId = rec.defenseRoleId;
|
||||
this.isRobot = rec.defenseInfo.isRobot;
|
||||
this.status = obj.status;
|
||||
this.time = obj.time;
|
||||
}
|
||||
|
||||
setByPlayer(dicWarJson: DicWarJson[], defenseHeroes: OppPlayerHeroInfo[], heroes: HeroType[], artifacts: ArtifactModelType[]) {
|
||||
for(let warJson of dicWarJson) {
|
||||
|
||||
@@ -77,6 +77,9 @@ export class GVGMainData {
|
||||
// 内政相关
|
||||
resources: LeagueResource = new LeagueResource(); // 联盟的物资
|
||||
activeTech: number[] = []; // 已激活了的科技树的id
|
||||
maxMemberCnt: number; // 进入备战期总玩家人数
|
||||
producerCnt: number; // 贤臣人数
|
||||
fighterCnt: number; // 猛将人数
|
||||
|
||||
sumTime: number = 0; // 今日贡献结算时间 10位时间戳
|
||||
|
||||
@@ -109,6 +112,9 @@ export class GVGMainData {
|
||||
this.lv = leaguePrepare.lv;
|
||||
this.resources = leaguePrepare.resources;
|
||||
this.activeTech = leaguePrepare.activeTech||[];
|
||||
this.maxMemberCnt = leaguePrepare.maxMemberCnt;
|
||||
this.producerCnt = leaguePrepare.producerCnt;
|
||||
this.fighterCnt = leaguePrepare.fighterCnt;
|
||||
}
|
||||
|
||||
setPlayerInfo(userData: GVGUserDataType, auth: number, canPrepare: boolean, canChooseJob: boolean, items: GVGItem[], tasks: GVGTask[]) {
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"name": "小麦",
|
||||
"name": "菽豆",
|
||||
"quality": 1,
|
||||
"type": 1,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "shudou",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "10&1",
|
||||
@@ -17,10 +18,11 @@
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "玉米",
|
||||
"name": "粟米",
|
||||
"quality": 2,
|
||||
"type": 1,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "sumi",
|
||||
"info": "&",
|
||||
"consume": "31002&100",
|
||||
"leagueConsume": "10&1",
|
||||
@@ -34,9 +36,10 @@
|
||||
{
|
||||
"id": 3,
|
||||
"name": "水稻",
|
||||
"quality": 3,
|
||||
"type": 1,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "shuidao",
|
||||
"info": "&",
|
||||
"consume": "31002&200",
|
||||
"leagueConsume": "10&1",
|
||||
@@ -50,9 +53,10 @@
|
||||
{
|
||||
"id": 4,
|
||||
"name": "普通铲子",
|
||||
"quality": 1,
|
||||
"type": 2,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "putongchanzi",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "10&2",
|
||||
@@ -66,9 +70,10 @@
|
||||
{
|
||||
"id": 5,
|
||||
"name": "中级铲子",
|
||||
"quality": 2,
|
||||
"type": 2,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "zhongjichanzi",
|
||||
"info": "&",
|
||||
"consume": "31002&100",
|
||||
"leagueConsume": "10&2",
|
||||
@@ -82,9 +87,10 @@
|
||||
{
|
||||
"id": 6,
|
||||
"name": "高级铲子",
|
||||
"quality": 3,
|
||||
"type": 2,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "gaojichanzi",
|
||||
"info": "&",
|
||||
"consume": "31002&200",
|
||||
"leagueConsume": "10&2",
|
||||
@@ -98,9 +104,10 @@
|
||||
{
|
||||
"id": 7,
|
||||
"name": "石斧",
|
||||
"quality": 1,
|
||||
"type": 3,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "shifu",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "10&2",
|
||||
@@ -114,9 +121,10 @@
|
||||
{
|
||||
"id": 8,
|
||||
"name": "铜斧",
|
||||
"quality": 2,
|
||||
"type": 3,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "tongfu",
|
||||
"info": "&",
|
||||
"consume": "31002&100",
|
||||
"leagueConsume": "10&2",
|
||||
@@ -130,9 +138,10 @@
|
||||
{
|
||||
"id": 9,
|
||||
"name": "铁斧",
|
||||
"quality": 3,
|
||||
"type": 3,
|
||||
"refreshType": 1,
|
||||
"image_id": "&",
|
||||
"image_id": "tiefu",
|
||||
"info": "&",
|
||||
"consume": "31002&200",
|
||||
"leagueConsume": "10&2",
|
||||
@@ -146,9 +155,10 @@
|
||||
{
|
||||
"id": 10,
|
||||
"name": "内政令",
|
||||
"quality": 3,
|
||||
"type": 4,
|
||||
"refreshType": 2,
|
||||
"image_id": "&",
|
||||
"image_id": "neizhengling",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "&",
|
||||
@@ -162,9 +172,10 @@
|
||||
{
|
||||
"id": 11,
|
||||
"name": "征战令",
|
||||
"quality": 3,
|
||||
"type": 4,
|
||||
"refreshType": 2,
|
||||
"image_id": "&",
|
||||
"image_id": "zhengzhanling",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "&",
|
||||
@@ -178,9 +189,10 @@
|
||||
{
|
||||
"id": 12,
|
||||
"name": "战功",
|
||||
"quality": 3,
|
||||
"type": 5,
|
||||
"refreshType": 2,
|
||||
"image_id": "&",
|
||||
"image_id": "zhangong",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "&",
|
||||
@@ -194,9 +206,10 @@
|
||||
{
|
||||
"id": 13,
|
||||
"name": "复活令",
|
||||
"quality": 3,
|
||||
"type": 6,
|
||||
"refreshType": 2,
|
||||
"image_id": "&",
|
||||
"image_id": "fuhuoling",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "&",
|
||||
@@ -209,10 +222,11 @@
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"name": "匕首",
|
||||
"name": "诸葛连弩",
|
||||
"quality": 3,
|
||||
"type": 6,
|
||||
"refreshType": 2,
|
||||
"image_id": "&",
|
||||
"image_id": "zhugeliannu",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "&",
|
||||
@@ -225,10 +239,11 @@
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"name": "箭塔",
|
||||
"name": "攻城车",
|
||||
"quality": 3,
|
||||
"type": 6,
|
||||
"refreshType": 2,
|
||||
"image_id": "&",
|
||||
"image_id": "gongchengche",
|
||||
"info": "&",
|
||||
"consume": "&",
|
||||
"leagueConsume": "&",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
6752
shared/resource/jsons/dic_zyz_gk_GVGVestige.json
Normal file
6752
shared/resource/jsons/dic_zyz_gk_GVGVestige.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -17,6 +17,7 @@ import { RegionModel } from '@db/Region';
|
||||
import { getRandEelmWithWeight } from 'app/pubUtils/util';
|
||||
import { getLocalRplUrl, getRemoteRplUrl } from 'app/pubUtils/battleUtils'
|
||||
import { ChannelInfoModel } from '@db/ChannelInfo';
|
||||
import { GVGVestigeRecModel } from '@db/GVGVestigeRec';
|
||||
const sendToWormhole = require('stream-wormhole');
|
||||
const pump = require('mz-modules/pump');
|
||||
|
||||
@@ -246,6 +247,8 @@ export default class GameController extends Controller {
|
||||
updateDBRes = await PvpRecordModel.updateRplStatus(battleCode, true);
|
||||
} else if (warType === WAR_TYPE.LADDER) {
|
||||
updateDBRes = await LadderMatchRecModel.updateRplStatus(battleCode, true);
|
||||
} else if (warType == WAR_TYPE.GVG_VESTIGE) {
|
||||
updateDBRes = await GVGVestigeRecModel.updateRplStatus(battleCode, true);
|
||||
}
|
||||
if (!updateDBRes) return ctx.body = ctx.service.utils.resResult(STATUS.BATTLE_RPL_UPDATE_ERR);
|
||||
remoteUrl = `${getRemoteRplUrl(ctx.app.config.realEnv, roleId, warType, battleCode)}/${battleCode}.bin`;
|
||||
|
||||
Reference in New Issue
Block a user