✨ 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) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user