✨ feat(gvg): 使用诸葛连弩
This commit is contained in:
@@ -7,7 +7,7 @@ import { Application, BackendSession, ChannelService, HandlerService, pinus } fr
|
||||
import { resResult, genCode } from "../../../pubUtils/util";
|
||||
import { GVGLeagueModel } from '../../../db/GVGLeague';
|
||||
import { checkGVGPeriod, getGroupIdOfServer, getGVGConfig, getGVGPeriodData, getGVGServerType } from '../../../services/gvg/gvgService';
|
||||
import { addBattleRankScore, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanks, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechReviveMinus, initRobots, pushTeamMoveMessage } from '../../../services/gvg/gvgBattleService';
|
||||
import { addBattleRankScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanks, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage } from '../../../services/gvg/gvgBattleService';
|
||||
import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory';
|
||||
import { GVGBattleRecModel } from '../../../db/GVGBattleRec';
|
||||
import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService';
|
||||
@@ -329,6 +329,7 @@ export class GVGBattleHandler {
|
||||
// areaId: 要移动的目标据点 id
|
||||
async startMove(msg: { cityId: number, areaId: number, teamCode: string }, session: BackendSession) {
|
||||
const roleId = session.get('roleId');
|
||||
const sid = session.get('sid');
|
||||
const serverId = session.get('serverId');
|
||||
const { areaId, cityId, teamCode } = msg;
|
||||
|
||||
@@ -345,6 +346,7 @@ export class GVGBattleHandler {
|
||||
let teamObj = getGVGBattleData(groupId, serverType);
|
||||
teamObj.move(teamCode, areaId, team.fromAreaId, team.startMoveTime, team.stopMoveTime);
|
||||
|
||||
await addRoleToAreaTeamChannel(roleId, groupId, serverType, areaId, sid);
|
||||
await pushTeamMoveMessage(team);
|
||||
return resResult(STATUS.SUCCESS, { areaId, cityId, stopMoveTime: team.stopMoveTime });
|
||||
}
|
||||
@@ -353,6 +355,7 @@ export class GVGBattleHandler {
|
||||
// areaId: 移动到的目标据点 id
|
||||
async stopMove(msg: { cityId: number, areaId: number, teamCode: string }, session: BackendSession) {
|
||||
const roleId = session.get('roleId');
|
||||
const sid = session.get('sid');
|
||||
const serverId = session.get('serverId');
|
||||
const { areaId, cityId, teamCode } = msg;
|
||||
|
||||
@@ -368,6 +371,8 @@ export class GVGBattleHandler {
|
||||
let teamObj = getGVGBattleData(groupId, serverType);
|
||||
teamObj.move(teamCode, areaId, 0, team.startMoveTime, team.stopMoveTime);
|
||||
|
||||
await leaveGVGAreaTeamChannel(roleId, sid);
|
||||
await addRoleToAreaTeamChannel(roleId, groupId, serverType, areaId, sid);
|
||||
return resResult(STATUS.SUCCESS, { areaId, cityId, curTeam: new MyTeamInfo(team) });
|
||||
}
|
||||
|
||||
@@ -470,46 +475,85 @@ export class GVGBattleHandler {
|
||||
|
||||
// 计算并更新两支队伍耐久
|
||||
let { win, fail } = gameData.gvgBattleDurabilityMinus;
|
||||
let attackScore = calBattleScoreByCe(isSuccess, attackTeam.lineupCe);
|
||||
let defenseScore = calBattleScoreByCe(!isSuccess, defenseTeam.lineupCe);
|
||||
attackTeam = await GVGTeamModel.battleEndAttack(attackTeam.teamCode, isSuccess? -win: -fail, attackScore, getBirthAreaOfCity(city, attackTeam.leagueCode), await getTechReviveMinus(configId, attackTeam.leagueCode));
|
||||
defenseTeam = await GVGTeamModel.battleEndDefense(defenseTeam.teamCode, isSuccess? -fail: -win, defenseScore, getBirthAreaOfCity(city, defenseTeam.leagueCode), await getTechReviveMinus(configId, defenseTeam.leagueCode));
|
||||
attackTeam = await GVGTeamModel.battleEndAttack(attackTeam.teamCode, isSuccess? -win: -fail, getBirthAreaOfCity(city, attackTeam.leagueCode), await getTechReviveMinus(configId, attackTeam.leagueCode));
|
||||
defenseTeam = await GVGTeamModel.battleEndDefense(defenseTeam.teamCode, isSuccess? -fail: -win, getBirthAreaOfCity(city, defenseTeam.leagueCode), await getTechReviveMinus(configId, defenseTeam.leagueCode));
|
||||
if(defenseTeam.curTeamBreak && defenseTeam.originPointId > 0 && !attackTeam.curTeamBreak) { // 打败的对手原来占领着一个位置,现在这个位置是你的了
|
||||
attackTeam = await GVGTeamModel.settlePoint(attackTeam.teamCode, defenseTeam.originPointId);
|
||||
}
|
||||
await addBattleRankScore(attackTeam, attackScore);
|
||||
await addBattleRankScore(defenseTeam, defenseScore);
|
||||
if(defenseTeam.curTeamBreak) {
|
||||
let attackScore = calBattleScoreByCe(isSuccess, defenseTeam.lineupCe);
|
||||
await addBattleRankScore(attackTeam, attackScore);
|
||||
}
|
||||
|
||||
// 更新内存
|
||||
let teamObj = getGVGBattleData(groupId, serverType);
|
||||
teamObj.battleEnd([attackTeam, defenseTeam]);
|
||||
// 更新rec
|
||||
await GVGBattleRecModel.battleEnd(battleCode, isSuccess);
|
||||
|
||||
await battleEndSendMessage(groupId, serverType, cityId, defenseTeam, attackTeam);
|
||||
|
||||
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(attackTeam) });
|
||||
}
|
||||
|
||||
// 使用道具
|
||||
// teamCode: 要使用道具的队伍
|
||||
async useItem(msg: { cityId: number, itemId: number, teamCode: string }, session: BackendSession) {
|
||||
const { itemId, teamCode } = msg;
|
||||
// const targetTeam = await GVGTeamModel.findByCode(teamCode);
|
||||
// ! 检查道具是否存在
|
||||
// ! 检查道具是否可以使用在该队伍
|
||||
const team = await GVGTeamModel.findOneAndUpdate({ teamCode }, {}).lean();
|
||||
// ! 根据 item 使用效果更新 team
|
||||
return resResult(STATUS.SUCCESS, { team });
|
||||
async useItem(msg: { cityId: number, itemId: number, teamCode: string, oppoTeamCode: string }, session: BackendSession) {
|
||||
const roleId = session.get('roleId');
|
||||
const sid = session.get('sid');
|
||||
const guildCode = session.get('guildCode');
|
||||
const serverId = session.get('serverId');
|
||||
const { cityId, itemId, teamCode, oppoTeamCode } = msg;
|
||||
|
||||
if(itemId != GVG_ITEM.KNIFE) return resResult(STATUS.GVG_ITEM_CANNOT_USE);
|
||||
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
|
||||
|
||||
let groupId = await getGroupIdOfServer(serverId);
|
||||
let serverType = await getGVGServerType(serverId);
|
||||
|
||||
let { attackTeam, defenseTeam } = await GVGTeamModel.findBattleTeams(teamCode, oppoTeamCode);
|
||||
let checkStatus = checkGVGBattleStart(roleId, attackTeam, defenseTeam);
|
||||
if(checkStatus.code != 0) return resResult(checkStatus);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
|
||||
let costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, [{ id: GVG_ITEM.KNIFE, count: 1 }], [], ITEM_CHANGE_REASON.GVG_USE_ITEM);
|
||||
if(!costResult) return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
|
||||
|
||||
let city = await GVGCityModel.findByCityId(configId, groupId, serverType, cityId);
|
||||
if (!city) return resResult(STATUS.GVG_CITY_NOT_FOUND);
|
||||
|
||||
defenseTeam = await GVGTeamModel.battleEndDefense(teamCode, await getTechKnifeHurt(configId, attackTeam.leagueCode), getBirthAreaOfCity(city, defenseTeam.leagueCode), await getTechReviveMinus(configId, defenseTeam.leagueCode));
|
||||
if(defenseTeam.curTeamBreak && defenseTeam.originPointId > 0 && !attackTeam.curTeamBreak) { // 打败的对手原来占领着一个位置,现在这个位置是你的了
|
||||
attackTeam = await GVGTeamModel.settlePoint(attackTeam.teamCode, defenseTeam.originPointId);
|
||||
}
|
||||
if(defenseTeam.curTeamBreak) {
|
||||
let attackScore = calBattleScoreByCe(true, defenseTeam.lineupCe);
|
||||
await addBattleRankScore(attackTeam, attackScore);
|
||||
}
|
||||
|
||||
// 更新内存
|
||||
let teamObj = getGVGBattleData(groupId, serverType);
|
||||
teamObj.battleEnd([attackTeam, defenseTeam]);
|
||||
|
||||
await battleEndSendMessage(groupId, serverType, cityId, defenseTeam, attackTeam);
|
||||
|
||||
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(attackTeam) });
|
||||
}
|
||||
|
||||
// 复活队伍
|
||||
async reviveTeam(msg: { cityId: number, teamCode: string }, session: BackendSession) {
|
||||
const roleId = session.get('roleId');
|
||||
const sid = session.get('sid');
|
||||
const serverId = session.get('serverId');
|
||||
const guildCode = session.get('guildCode');
|
||||
|
||||
const { teamCode } = msg;
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
let groupId = await getGroupIdOfServer(serverId);
|
||||
let serverType = await getGVGServerType(serverId);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
@@ -534,6 +578,10 @@ export class GVGBattleHandler {
|
||||
}
|
||||
team = await GVGTeamModel.reviveTeam(teamCode);
|
||||
|
||||
// 更新内存
|
||||
let teamObj = getGVGBattleData(groupId, serverType);
|
||||
teamObj.battleEnd([team]);
|
||||
|
||||
// 更新成功返回队伍信息
|
||||
return resResult(STATUS.SUCCESS, { reviveCnt, curTeam: new MyTeamInfo(team) });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user