feat(gvg): 使用诸葛连弩

This commit is contained in:
luying
2023-02-17 19:48:09 +08:00
parent 8595c8d4ae
commit 0a65a0863d
5 changed files with 106 additions and 41 deletions

View File

@@ -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) });
}