feat(gvg): 投石车攻击对手范围调整

This commit is contained in:
luying
2023-02-28 10:51:18 +08:00
parent 78777a1437
commit 9d369ee0a9
6 changed files with 77 additions and 60 deletions
@@ -15,7 +15,7 @@ import { gameData, getReviveGold } from '../../../pubUtils/data';
import { getAllServerName } from '../../../services/redisService'; import { getAllServerName } from '../../../services/redisService';
import { checkBattleHeroesByHid } from '../../../services/normalBattleService'; import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb'; import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb';
import { GVG_AREA_TYPE, GVG_ITEM, GVG_PERIOD, GVG_REC_TYPE, ITEM_CHANGE_REASON, PUSH_ROUTE, REDIS_KEY, STATUS } from '../../../consts'; import { GVG_AREA_TYPE, GVG_ATTACK_TYPE, GVG_ITEM, GVG_PERIOD, GVG_REC_TYPE, ITEM_CHANGE_REASON, PUSH_ROUTE, REDIS_KEY, STATUS } from '../../../consts';
import { GVGHeroInfo } from '../../../domain/dbGeneral'; import { GVGHeroInfo } from '../../../domain/dbGeneral';
import { ArtifactModel } from '../../../db/Artifact'; import { ArtifactModel } from '../../../db/Artifact';
import { getHeroesAttributes } from '../../../services/playerCeService'; import { getHeroesAttributes } from '../../../services/playerCeService';
@@ -561,7 +561,7 @@ export class GVGBattleHandler {
await battleEndSendMessage(groupKey, cityId, defenseTeam, attackTeam); await battleEndSendMessage(groupKey, cityId, defenseTeam, attackTeam);
await sendMessageToGVGAreaByTeamWithSuc(groupKey, defenseTeam.areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, { await sendMessageToGVGAreaByTeamWithSuc(groupKey, defenseTeam.areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, {
cityId, areaId: defenseTeam.areaId, attackType: 2, teams: [new GVGTeamInList(defenseTeam), new GVGTeamInList(attackTeam)] cityId, areaId: defenseTeam.areaId, attackType: GVG_ATTACK_TYPE.KNIFE, teams: [new GVGTeamInList(defenseTeam), new GVGTeamInList(attackTeam)]
}); });
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(attackTeam), oppTeam: new MyTeamInfo(defenseTeam) }); return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(attackTeam), oppTeam: new MyTeamInfo(defenseTeam) });
} }
@@ -645,13 +645,11 @@ export class GVGBattleHandler {
const points = await GVGCityAreaPointModel.findByConfig(configId, groupKey); const points = await GVGCityAreaPointModel.findByConfig(configId, groupKey);
let result: { cityId: number, guardLeagueName: string, areas: { areaId: number, points: { pointId: number, guardLeagueName: string }[] }[] }[] = []; let result: { cityId: number, guardLeagueName: string, areas: { areaId: number, points: { pointId: number, guardLeagueName: string }[] }[] }[] = [];
for(let [ cityId, { mapType, areaIds }] of gameData.gvgCity) { for(let [ cityId, { mapType, battleAreaIds }] of gameData.gvgCity) {
if(mapType != serverType) continue; if(mapType != serverType) continue;
let city = cities.find(cur => cur.cityId == cityId); let city = cities.find(cur => cur.cityId == cityId);
let areas: { areaId: number, points: {pointId: number, guardLeagueName: string }[]}[] = []; let areas: { areaId: number, points: {pointId: number, guardLeagueName: string }[]}[] = [];
for(let areaId of areaIds) { for(let areaId of battleAreaIds) {
let dicArea = gameData.gvgArea.get(areaId);
if(!dicArea || (dicArea.areaType != GVG_AREA_TYPE.BIG && dicArea.areaType != GVG_AREA_TYPE.MIDDLE && dicArea.areaType != GVG_AREA_TYPE.SMALL) ) continue;
let pointIds = gameData.gvgPointByAreaId.get(areaId)||[]; let pointIds = gameData.gvgPointByAreaId.get(areaId)||[];
let pointArrs: { pointId: number, guardLeagueName: string }[] = []; let pointArrs: { pointId: number, guardLeagueName: string }[] = [];
for(let pointId of pointIds) { for(let pointId of pointIds) {
@@ -33,18 +33,14 @@ class GVGBattleData {
return teams.slice(0, 20); return teams.slice(0, 20);
} }
public findCatapultAttackTeam(areaIds: number[], leagueCode: string) { public findCatapultAttackTeam(areaId: number, leagueCode: string) {
let teamsByArea = new Map<number, string[]>(); let teams: string[] = [];
for(let areaId of areaIds) { let teamCodes = this.areaToTeams.get(areaId)||new Set();
let teams: string[] = []; for(let teamCode of teamCodes) {
let teamCodes = this.areaToTeams.get(areaId)||new Set(); let team = this.teams.get(teamCode);
for(let teamCode of teamCodes) { if(team && team.leagueCode != leagueCode && !team.isRobot) teams.push(teamCode);
let team = this.teams.get(teamCode);
if(team && team.leagueCode != leagueCode && !team.isRobot) teams.push(teamCode);
}
teamsByArea.set(areaId, teams);
} }
return teamsByArea; return teams;
} }
public leaveCity(roleId: string) { public leaveCity(roleId: string) {
@@ -3,7 +3,7 @@ import { GVGLeagueModel, GVGLeagueType } from "../../db/GVGLeague";
import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from "../../db/GVGTeam"; import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from "../../db/GVGTeam";
import { GVGCityModel, GVGCityType } from "../../db/GVGCity"; import { GVGCityModel, GVGCityType } from "../../db/GVGCity";
import { gameData, getGVGBattleRankReward } from "../../pubUtils/data"; import { gameData, getGVGBattleRankReward } from "../../pubUtils/data";
import { GVG_AREA_TYPE, GVG_BATTLE_RANK_TYPE, GVG_PERIOD, GVG_TECH_TYPE, MAIL_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts"; import { GVG_AREA_TYPE, GVG_ATTACK_TYPE, GVG_BATTLE_RANK_TYPE, GVG_PERIOD, GVG_POINT_TYPE, GVG_TECH_TYPE, MAIL_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts";
import { getTimeFun, nowSeconds } from "../../pubUtils/timeUtil"; import { getTimeFun, nowSeconds } from "../../pubUtils/timeUtil";
import { DicGVGAreaPoint } from "../../pubUtils/dictionary/DicGVGAreaPoint"; import { DicGVGAreaPoint } from "../../pubUtils/dictionary/DicGVGAreaPoint";
import { getGVGBattleData, getGVGBattleMap } from "./gvgBattleMemory"; import { getGVGBattleData, getGVGBattleMap } from "./gvgBattleMemory";
@@ -24,6 +24,7 @@ import { addCityGuardMessage } from "./gvgRecService";
import { GVGUserDataModel } from "../../db/GVGUserData"; import { GVGUserDataModel } from "../../db/GVGUserData";
import { RoleModel } from "../../db/Role"; import { RoleModel } from "../../db/Role";
import { getFightTimeByPeriod } from "./gvgFightService"; import { getFightTimeByPeriod } from "./gvgFightService";
import { getRandSingleEelm } from "../../pubUtils/util";
/** /**
* 获取本联军上周占领的城池 * 获取本联军上周占领的城池
@@ -114,13 +115,16 @@ export async function initRobots(configId: number, groupKey: string, city: GVGCi
if(guardLeague) return []; if(guardLeague) return [];
let robotTeams = await GVGTeamModel.findRobotTeams(groupKey, cityId); let robotTeams = await GVGTeamModel.findRobotTeams(groupKey, cityId);
let updateDicPoints: DicGVGAreaPoint[] = []; let updateDicPoints: DicGVGAreaPoint[] = [];
let { areaIds = []} = gameData.gvgCity.get(cityId); let { battleAreaIds = []} = gameData.gvgCity.get(cityId);
for(let [_, point] of gameData.gvgAreaPoint) { for(let areaId of battleAreaIds) {
if(point.type != 1) continue; let pointIds = gameData.gvgPointByAreaId.get(areaId)||[];
if(areaIds.indexOf(point.areaId) == -1) continue; for(let pointId of pointIds) {
let robotTeam = robotTeams.find(team => team.pointId == point.pointId); let dicPoint = gameData.gvgAreaPoint.get(pointId);
if(!robotTeam || (!robotTeam.isBroken && robotTeam.configId != configId) ) { if(!dicPoint || dicPoint.type != GVG_POINT_TYPE.ROBOT) continue;
updateDicPoints.push(point); let robotTeam = robotTeams.find(team => team.pointId == dicPoint.pointId);
if(!robotTeam || (!robotTeam.isBroken && robotTeam.configId != configId) ) {
updateDicPoints.push(dicPoint);
}
} }
} }
if(updateDicPoints.length > 0) { if(updateDicPoints.length > 0) {
@@ -298,12 +302,14 @@ export async function initCatapult(cityId: number, groupKey: string, leagueCode:
} }
if(hasCatapult) { if(hasCatapult) {
let updateDicPoints: DicGVGAreaPoint[] = []; let updateDicPoints: DicGVGAreaPoint[] = [];
let { areaIds = []} = gameData.gvgCity.get(cityId); let { catapultAreaIds = []} = gameData.gvgCity.get(cityId);
for(let [_, point] of gameData.gvgAreaPoint) { for(let areaId of catapultAreaIds) {
let pointIds = gameData.gvgPointByAreaId.get(areaId)||[];
if(point.type != 2) continue; for(let pointId of pointIds) {
if(areaIds.indexOf(point.areaId) == -1) continue; let dicPoint = gameData.gvgAreaPoint.get(pointId);
updateDicPoints.push(point); if(!dicPoint || dicPoint.type != GVG_POINT_TYPE.CATAPULT) continue;
updateDicPoints.push(dicPoint);
}
} }
let lv = gameData.war.get(GVG.GVG_CATAPULT_WARJSON)?.level||50; let lv = gameData.war.get(GVG.GVG_CATAPULT_WARJSON)?.level||50;
@@ -320,26 +326,26 @@ export async function catapultHurt() {
for(let [_key, teamObj] of getGVGBattleMap()) { for(let [_key, teamObj] of getGVGBattleMap()) {
let teams = teamObj.findCatapult(); let teams = teamObj.findCatapult();
for(let catapult of teams) { for(let catapult of teams) {
if(catapult.isBroken) continue; let dicGVGCity = gameData.gvgCity.get(catapult?.cityId);
let dicArea = gameData.gvgArea.get(catapult.areaId); let battleAreaIds = dicGVGCity?.battleAreaIds||[]
let relateArea = dicArea?.relateArea||[]; if(!catapult || catapult.isBroken || !dicGVGCity || battleAreaIds.length <= 0) continue;
let teamCodeByArea = teamObj.findCatapultAttackTeam(relateArea, catapult.leagueCode); let areaId = getRandSingleEelm(battleAreaIds);
let dicGVGCity = gameData.gvgCity.get(catapult.cityId); let teamCodes = teamObj.findCatapultAttackTeam(areaId, catapult.leagueCode);
for(let [ areaId, teamCodes ] of teamCodeByArea) { console.log('##### targetAreaId', catapult.teamCode, areaId);
let teams = await GVGTeamModel.attackByCatapult(teamCodes, catapult.captapultAtk, dicGVGCity.attackBirth);
teamObj.battleEnd(teams); let teams = await GVGTeamModel.attackByCatapult(teamCodes, catapult.captapultAtk, dicGVGCity.attackBirth);
if(teams.length > 0) { teamObj.battleEnd(teams);
await sendMessageToGVGAreaByTeamWithSuc(teamObj.groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, { if(teams.length > 0) {
cityId: catapult.cityId, areaId, attackType: 1, teams: teams.map(team => new GVGTeamInList(team)) await sendMessageToGVGAreaByTeamWithSuc(teamObj.groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, {
}); cityId: catapult.cityId, areaId, attackType: GVG_ATTACK_TYPE.CATAPULT, teams: teams.map(team => new GVGTeamInList(team))
await sendMessageToGVGCityWithSuc(teamObj.groupKey, catapult.cityId, PUSH_ROUTE.GVG_SPINE_ATTACKED, { });
cityId: catapult.cityId, areaId, attackType: 1, teams: teams.map(team => new GVGAttackSpine(team, catapult.captapultAtk)) await sendMessageToGVGCityWithSuc(teamObj.groupKey, catapult.cityId, PUSH_ROUTE.GVG_SPINE_ATTACKED, {
}); cityId: catapult.cityId, areaId, attackType: GVG_ATTACK_TYPE.CATAPULT, teams: teams.map(team => new GVGAttackSpine(team, catapult.captapultAtk))
for(let team of teams) { });
await pushTeamBeHurtMessage(team); for(let team of teams) {
if(team.curTeamBreak && team.originPointId > 0) { await pushTeamBeHurtMessage(team);
await GVGCityAreaPointModel.leavePoint(configId, teamObj.groupKey, team.originPointId); if(team.curTeamBreak && team.originPointId > 0) {
} await GVGCityAreaPointModel.leavePoint(configId, teamObj.groupKey, team.originPointId);
} }
} }
} }
@@ -532,7 +538,7 @@ export async function battleEndSendMessage(groupKey: string, cityId: number, def
let areaId = defenseTeam.curTeamBreak? defenseTeam.fromAreaId: defenseTeam.areaId; let areaId = defenseTeam.curTeamBreak? defenseTeam.fromAreaId: defenseTeam.areaId;
// 推送伤害 // 推送伤害
await sendMessageToGVGAreaByTeamWithSuc(groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, { await sendMessageToGVGAreaByTeamWithSuc(groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, {
cityId, areaId, attackType: 3, teams: [new GVGTeamInList(defenseTeam), new GVGTeamInList(attackTeam)] cityId, areaId, attackType: GVG_ATTACK_TYPE.PLAYER, teams: [new GVGTeamInList(defenseTeam), new GVGTeamInList(attackTeam)]
}); });
await pushTeamBeHurtMessage(defenseTeam, attackTeam); await pushTeamBeHurtMessage(defenseTeam, attackTeam);
await pushTeamBeHurtMessage(attackTeam); await pushTeamBeHurtMessage(attackTeam);
+14
View File
@@ -155,9 +155,23 @@ export enum GVG_AREA_TYPE {
} }
export const GVG_CATAPULT = 'catapult'; export const GVG_CATAPULT = 'catapult';
export const GVG_ROBOT = 'robot';
export enum GVG_BATTLE_RANK_TYPE { export enum GVG_BATTLE_RANK_TYPE {
PLAYER = 1, PLAYER = 1,
GUILD = 2, // 废弃 GUILD = 2, // 废弃
LEAGUE = 3 LEAGUE = 3
}
// 据点上的守卫类型
export enum GVG_POINT_TYPE {
NO = 0,
ROBOT = 1, // 守卫者
CATAPULT = 2, // 投石车
}
export enum GVG_ATTACK_TYPE {
CATAPULT = 1, // 投石车
KNIFE = 2, // 道具
PLAYER = 3, // 玩家
} }
+3 -3
View File
@@ -7,7 +7,7 @@ import { EXTERIOR, GVG } from "../pubUtils/dicParam";
import { DicGVGAreaPoint } from "../pubUtils/dictionary/DicGVGAreaPoint"; import { DicGVGAreaPoint } from "../pubUtils/dictionary/DicGVGAreaPoint";
import { InitTeamParam, SaveTeamUpdateParam } from "../domain/gvgField/gvgDb"; import { InitTeamParam, SaveTeamUpdateParam } from "../domain/gvgField/gvgDb";
import { GVGHeroInfo } from "../domain/dbGeneral"; import { GVGHeroInfo } from "../domain/dbGeneral";
import { GVG_CATAPULT } from "../consts"; import { GVG_CATAPULT, GVG_ROBOT } from "../consts";
@index({ roleId: 1, index: 1 }) @index({ roleId: 1, index: 1 })
@index({ teamCode: 1 }) @index({ teamCode: 1 })
@@ -215,7 +215,7 @@ export default class GVGTeam extends BaseModel {
let teams: GVGTeamType[] = []; let teams: GVGTeamType[] = [];
for(let { pointId, areaId, name, head, spine, ce, durability } of dicPoints) { for(let { pointId, areaId, name, head, spine, ce, durability } of dicPoints) {
let team: GVGTeamType = await GVGTeamModel.findOneAndUpdate({ groupKey, cityId, areaId, pointId }, { let team: GVGTeamType = await GVGTeamModel.findOneAndUpdate({ groupKey, cityId, areaId, pointId }, {
$setOnInsert: {teamCode: genCode(8), maxDurability: durability, roleName: name, head, spine, frame: EXTERIOR.EXTERIOR_FACECASE, lineupCe: ce, isRobot: true, lv, isBroken: false, startMoveTime: 0, stopMoveTime: 0, guildCode: '', leagueCode: '', leagueName: '', fromAreaId: areaId, $setOnInsert: {teamCode: genCode(8), maxDurability: durability, roleName: name, head, spine, frame: EXTERIOR.EXTERIOR_FACECASE, lineupCe: ce, isRobot: true, lv, isBroken: false, startMoveTime: 0, stopMoveTime: 0, guildCode: '', leagueCode: '', leagueName: '', fromAreaId: areaId, roleId: GVG_ROBOT,
}, $set: { configId, durability } }, $set: { configId, durability }
}, { new: true, upsert: true }).lean(); }, { new: true, upsert: true }).lean();
teams.push(team); teams.push(team);
@@ -235,7 +235,7 @@ export default class GVGTeam extends BaseModel {
let team: GVGTeamType = await GVGTeamModel.findOneAndUpdate({ groupKey, cityId, areaId, pointId }, { let team: GVGTeamType = await GVGTeamModel.findOneAndUpdate({ groupKey, cityId, areaId, pointId }, {
$setOnInsert: { $setOnInsert: {
teamCode: genCode(8), maxDurability: durability, roleName: name, head, spine, frame: EXTERIOR.EXTERIOR_FACECASE, lineupCe: ce, lv, leagueCode, leagueName, captapultAtk: atk, teamCode: genCode(8), maxDurability: durability, roleName: name, head, spine, frame: EXTERIOR.EXTERIOR_FACECASE, lineupCe: ce, lv, leagueCode, leagueName, captapultAtk: atk,
isRobot: true, isCatapult: true, isBroken: false, startMoveTime: 0, stopMoveTime: 0, guildCode: '', fromAreaId: areaId, isRobot: true, isCatapult: true, isBroken: false, startMoveTime: 0, stopMoveTime: 0, guildCode: '', fromAreaId: areaId, roleId: GVG_CATAPULT,
}, $set: { configId, durability } }, $set: { configId, durability }
}, { new: true, upsert: true }).lean(); }, { new: true, upsert: true }).lean();
teams.push(team); teams.push(team);
+8 -5
View File
@@ -1,5 +1,5 @@
// GVG城池 // GVG城池
import { FILENAME } from '../../consts' import { FILENAME, GVG_AREA_TYPE } from '../../consts'
import { parseNumberList, readFileAndParse } from '../util' import { parseNumberList, readFileAndParse } from '../util'
export interface DicGVGArea { export interface DicGVGArea {
@@ -26,7 +26,7 @@ export interface DicGVGArea {
} }
export const dicGVGArea = new Map<number, DicGVGArea>(); export const dicGVGArea = new Map<number, DicGVGArea>();
export const dicGVGCity = new Map<number, { cityType: number, mapType: number, areaIds: number[], defenseBirth: number, attackBirth: number, cityName: string }>(); export const dicGVGCity = new Map<number, { cityType: number, mapType: number, battleAreaIds: number[], catapultAreaIds: number[], areaIds: number[], defenseBirth: number, attackBirth: number, cityName: string }>();
export function loadGVGArea() { export function loadGVGArea() {
dicGVGArea.clear(); dicGVGArea.clear();
dicGVGCity.clear(); dicGVGCity.clear();
@@ -35,11 +35,14 @@ export function loadGVGArea() {
arr.forEach(o => { arr.forEach(o => {
o.relateArea = parseNumberList(o.relateArea); o.relateArea = parseNumberList(o.relateArea);
if(!dicGVGCity.has(o.cityId)) { if(!dicGVGCity.has(o.cityId)) {
dicGVGCity.set(o.cityId, { cityType: o.cityType, mapType: o.mapType, areaIds: [], defenseBirth: 0, attackBirth: 0, cityName: o.cityName }); dicGVGCity.set(o.cityId, { cityType: o.cityType, mapType: o.mapType, battleAreaIds: [], catapultAreaIds: [], areaIds: [], defenseBirth: 0, attackBirth: 0, cityName: o.cityName });
} }
if(o.areaType == GVG_AREA_TYPE.BIG || o.areaType == GVG_AREA_TYPE.MIDDLE || o.areaType == GVG_AREA_TYPE.SMALL)
dicGVGCity.get(o.cityId)?.battleAreaIds.push(o.areaId);
if(o.areaType == GVG_AREA_TYPE.CATAPULT) dicGVGCity.get(o.cityId)?.catapultAreaIds.push(o.areaId);
if(o.areaType == GVG_AREA_TYPE.DEFENSER) dicGVGCity.get(o.cityId).defenseBirth = o.areaId;
if(o.areaType == GVG_AREA_TYPE.ATTACKER) dicGVGCity.get(o.cityId).attackBirth = o.areaId;
dicGVGCity.get(o.cityId)?.areaIds.push(o.areaId); dicGVGCity.get(o.cityId)?.areaIds.push(o.areaId);
if(o.areaType == 1) dicGVGCity.get(o.cityId).defenseBirth = o.areaId;
if(o.areaType == 2) dicGVGCity.get(o.cityId).attackBirth = o.areaId;
dicGVGArea.set(o.areaId, o); dicGVGArea.set(o.areaId, o);
}); });
arr = undefined; arr = undefined;