diff --git a/game-server/app/servers/battle/handler/ladderHandler.ts b/game-server/app/servers/battle/handler/ladderHandler.ts index 58846c06f..826317604 100644 --- a/game-server/app/servers/battle/handler/ladderHandler.ts +++ b/game-server/app/servers/battle/handler/ladderHandler.ts @@ -275,7 +275,7 @@ export class LadderHandler { } // 9. 设置防守阵容 - async saveDefense(msg: { warId: number, heroes: { actorId: number, ai: number, dataId: number, order: number }[] }, session: BackendSession) { + async saveDefense(msg: { warId: number, heroes: { actorId: number, ai: number, dataId: number, order: number, subHid?: number }[] }, session: BackendSession) { let { warId, heroes } = msg; let roleId = session.get('roleId'); @@ -284,6 +284,12 @@ export class LadderHandler { let hids: number[] = heroes.map(cur => cur.actorId); if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN); + for(let { actorId, subHid } of heroes) { + let dicHero = gameData.hero.get(actorId); + if(!dicHero || dicHero.urType != 1) return resResult(STATUS.HERO_CAN_NOT_SET_SUB); + if(subHid && hids.indexOf(subHid) != -1) return resResult(STATUS.HERO_SUB_DUPLICATE); + } + let dbHeroes = await HeroModel.findByHidRange(hids, roleId, '_id hid ce', true); let defenseHeroes = heroes.map(cur => { diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index 2b80d7970..c681cabd1 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -449,7 +449,7 @@ export class PvpHandler { } //3. 保存防守阵容 - async saveDefense(msg: { heroes: { actorId: number, dataId: number, order: number, ai: number }[], warId: number, buff: number }, session: BackendSession) { + async saveDefense(msg: { heroes: { actorId: number, dataId: number, order: number, ai: number, subHid?: number }[], warId: number, buff: number }, session: BackendSession) { let { heroes, warId, buff } = msg; let roleId = session.get('roleId'); if (heroes.length > LINEUP_NUM || heroes.length <= 0) { @@ -467,8 +467,11 @@ export class PvpHandler { let refChallengeObj = await refChallengeCnt(pvpDefense.challengeCnt, pvpDefense.challengeRefTime, seasonEndTime, roleId, session.get('vipStartTime')); // 更新防守阵容 let scores: number[] = [], heroIdMap = new Map(), hids: number[] = []; - for(let { actorId } of heroes) { + for(let { actorId, subHid } of heroes) { if(isHeroHidden(actorId)) return resResult(STATUS.HERO_IS_HIDDEN); + let dicHero = gameData.hero.get(actorId); + if(!dicHero || dicHero.urType != 1) return resResult(STATUS.HERO_CAN_NOT_SET_SUB); + if(subHid && heroes.findIndex(hero => hero.actorId == subHid) != -1) return resResult(STATUS.HERO_SUB_DUPLICATE); let heroScore = pvpDefense.heroScores.find(cur => cur.hid == actorId); if(heroScore) { @@ -486,6 +489,7 @@ export class PvpHandler { hids.push(actorId); } } + let dbHeroes = await HeroModel.findByHidRange(hids, roleId, '_id hid ce', true); for(let hero of dbHeroes) { heroIdMap.set(hero.hid, hero._id); diff --git a/game-server/app/servers/guild/handler/gvgBattleHandler.ts b/game-server/app/servers/guild/handler/gvgBattleHandler.ts index b562a813e..70bb8c6cd 100644 --- a/game-server/app/servers/guild/handler/gvgBattleHandler.ts +++ b/game-server/app/servers/guild/handler/gvgBattleHandler.ts @@ -7,7 +7,7 @@ import { Application, BackendSession, ChannelService, HandlerService, pinus } fr import { resResult, genCode, getRandSingleEelm } from "../../../pubUtils/util"; import { GVGLeagueModel } from '../../../db/GVGLeague'; import { getGroupKey, getGVGConfig, getGVGPeriodData, getGVGServerType } from '../../../services/gvg/gvgService'; -import { redisAddBattleScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanksByCity, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage, getAllGVGCitiesInfo, leaveCity, refreshTeams, checkEnterCityTime, generNewLineup, getBattleRank, checkSettleStatus, getSpineCnt, getPlayerRanksByCity, getPlayerSettleRanksByCity } from '../../../services/gvg/gvgBattleService'; +import { redisAddBattleScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanksByCity, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage, getAllGVGCitiesInfo, leaveCity, refreshTeams, checkEnterCityTime, generNewLineup, getBattleRank, checkSettleStatus, getSpineCnt, getPlayerRanksByCity, getPlayerSettleRanksByCity, checkGVGLineupWhenSave } from '../../../services/gvg/gvgBattleService'; import { getGVGBattleData } from '../../../services/memoryCache/gvgBattleData'; import { GVGBattleRecModel } from '../../../db/GVGBattleRec'; import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService'; @@ -69,6 +69,9 @@ export class GVGBattleHandler { let { configId, period } = getGVGPeriodData(); if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); + let checkLineupResult = await checkGVGLineupWhenSave(roleId, index, lineup); + if(checkLineupResult.code != 0) return resResult(checkLineupResult); + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); let { leagueCode, name: leagueName } = myLeague; @@ -78,7 +81,12 @@ export class GVGBattleHandler { let role = await RoleModel.findByRoleId(roleId, 'lv title'); let updateParam: SaveTeamUpdateParam = { index, head, spine, frame, roleName, serverId, leagueCode, leagueName, lv: role.lv, title: role.title } if(lineup) { - let { isOK, heroes } = await checkBattleHeroesByHid(roleId, lineup.map(cur => cur.actorId)); + let hids: number[] = []; + for(let { actorId, subHid } of lineup) { + hids.push(actorId); + if(subHid) hids.push(subHid); + } + let { isOK, heroes } = await checkBattleHeroesByHid(roleId, hids); if(!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); let { newLineup, newLineupCe } = await generNewLineup(roleId, heroes, lineup); updateParam.lineup = newLineup; diff --git a/game-server/app/servers/guild/handler/gvgFightHandler.ts b/game-server/app/servers/guild/handler/gvgFightHandler.ts index 02feef591..932d896de 100644 --- a/game-server/app/servers/guild/handler/gvgFightHandler.ts +++ b/game-server/app/servers/guild/handler/gvgFightHandler.ts @@ -87,7 +87,7 @@ export class GVGProduceHandler { } // 编辑阵容 - async saveLineup(msg: { vestigeId: number, lineup: [{ actorId: number, dataId: number, order: number, correspondingVar: number }] }, session: BackendSession) { + async saveLineup(msg: { vestigeId: number, lineup: [{ actorId: number, dataId: number, order: number, correspondingVar: number, subHid: number }] }, session: BackendSession) { const roleId = session.get('roleId'); const serverId = session.get('serverId'); @@ -113,7 +113,7 @@ export class GVGProduceHandler { let lineup = heroes.map(hero => { let curHero = dbHeroes.find(cur => cur.hid == hero.actorId); - return { actorId: curHero.hid, dataId: hero.dataId, order: hero.order, correspondingVar: hero.correspondingVar, ce: curHero.ce } + return { actorId: curHero.hid, dataId: hero.dataId, order: hero.order, subHid: hero.subHid, correspondingVar: hero.correspondingVar, ce: curHero.ce } }); let vestigeRank = await GVGVestigeRankModel.updateByRoleId(vestigeId, roleId, { lineup, hasDefense: true }); @@ -296,7 +296,7 @@ export class GVGProduceHandler { } // 布完阵开始挑战 - async checkBattle(msg: { battleCode: string, heroes: [{ actorId: number, dataId: number, order: number }] }, session: BackendSession) { + async checkBattle(msg: { battleCode: string, heroes: { actorId: number, dataId: number, order: number, subHid: number }[] }, session: BackendSession) { const roleId = session.get('roleId'); const roleName = session.get('roleName'); diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index ecab1be50..bf80d99f1 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -778,11 +778,11 @@ export class HeroHandler { let subHero = await HeroModel.findByHidAndRole(subHid, roleId); if(!subHero) return resResult(STATUS.HERO_NOT_FIND); - await LadderMatchModel.removeBySub(roleId, subHid); - await PvpSaveDataModel.removeBySub(roleId, subHid); - await PvpDefenseModel.removeBySub(roleId, subHid); - await GVGVestigeRankModel.removeBySub(roleId, subHid); - await GVGTeamModel.removeBySub(roleId, subHid, subHero.ce); + // await LadderMatchModel.removeBySub(roleId, subHid); + // await PvpSaveDataModel.removeBySub(roleId, subHid); + // await PvpDefenseModel.removeBySub(roleId, subHid); + // await GVGVestigeRankModel.removeBySub(roleId, subHid); + // await GVGTeamModel.removeBySub(roleId, subHid, subHero.ce); } else { // 卸下 if(!hero.subHid) return resResult(STATUS.HERO_CAN_NOT_REMOVE_SUB); diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index e9e1f9879..7b500ec22 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -30,6 +30,7 @@ import { ArtifactModel } from "../../db/Artifact"; import { getHeroesAttributes } from "../playerCeService"; import { CounterModel } from "../../db/Counter"; import { getGroupIdOfServer } from "../serverService"; +import { LineupHero } from "../../domain/roleField/hero"; /** * 获取本联军上周占领的城池 @@ -200,16 +201,18 @@ export async function refreshTeams(configId: number, groupKey: string, roleId: s return teams } -export async function generNewLineup(roleId: string, heroes: HeroType[], lineup: { actorId: number, dataId: number, order: number }[]) { +export async function generNewLineup(roleId: string, heroes: HeroType[], lineup: { actorId: number, dataId: number, order: number, subHid?: number }[]) { let attrByHid = await getHeroesAttributes(roleId); let newLineup: GVGHeroInfo[] = [], newLineupCe = 0; - for(let { actorId, dataId, order } of lineup) { + for(let { actorId, dataId, order, subHid } of lineup) { let hero = heroes.find(cur => cur.hid == actorId); if(hero) { let artifact = hero.artifact? await ArtifactModel.findbySeqId(roleId, hero.artifact): null; let heroInfo = new GVGHeroInfo(); heroInfo.setHeroInfo(hero, artifact, []); heroInfo.setDataId(dataId, order); + let subHero = heroes.find(cur => cur.hid == subHid); + if(subHero) heroInfo.setSubHero(subHero); let attr = attrByHid.get(actorId); if(!attr) continue; @@ -860,4 +863,36 @@ async function dispatchTeam(groupKey: string, cityId: number) { let servers = pinus.app.getServersByType('guild'); let sid = (await dispatch(redisClient(), `${groupId}_${cityId}`, servers, 'guild'))?.id; return sid; +} + +/** + * 查询队伍中的武将是否可以使用 + * @param roleId + * @param index + * @param lineup + * @returns + */ +export async function checkGVGLineupWhenSave(roleId: string, index: number, lineup: LineupHero[]) { + const teams = await GVGTeamModel.findByRole(roleId, '-_id index lineup'); + for(let { actorId, subHid } of lineup) { + let dicHero = gameData.hero.get(actorId); + if(!dicHero || dicHero.urType != 1) return STATUS.HERO_CAN_NOT_SET_SUB; + + for(let team of teams) { + // 查actorId没有在其他队伍中使用 + if(team.index != index) { + let hasActor = team.lineup.find(hero => hero.actorId == actorId); + if(hasActor) return STATUS.GVG_TEAM_HERO_DUPLICATE; + } + // 查actorId没有在其他队伍作为副将 + let hasActorIsSubHero = team.lineup.find(hero => hero.subHid == actorId); + if(hasActorIsSubHero) return STATUS.GVG_TEAM_HERO_USED_AS_SUB_HERO; + // 查副将 + if(subHid) { + let hasSubHero = team.lineup.find(hero => hero.actorId == subHid); + if(hasSubHero) return STATUS.GVG_TEAM_SUB_HERO_DUPLICATE; + } + } + } + return STATUS.SUCCESS } \ No newline at end of file diff --git a/game-server/app/services/gvg/gvgFightService.ts b/game-server/app/services/gvg/gvgFightService.ts index 6f1a28d85..2b88569b0 100644 --- a/game-server/app/services/gvg/gvgFightService.ts +++ b/game-server/app/services/gvg/gvgFightService.ts @@ -156,10 +156,14 @@ export async function getVestigeUsedHeroes(roleId: string, curVestigeId: number) } // 是否在其他遗迹中使用过这个武将 -export async function checkHeroIsUsedInOtherVestige(roleId: string, curVestigeId: number, heroes: { actorId: number }[]) { +export async function checkHeroIsUsedInOtherVestige(roleId: string, curVestigeId: number, heroes: { actorId: number, subHid: number }[]) { let usedHeroes = await getVestigeUsedHeroes(roleId, curVestigeId); - for(let { actorId } of heroes) { + for(let { actorId, subHid } of heroes) { if(usedHeroes.indexOf(actorId) != -1) return true; + // 查副将 + if(subHid) { + if(usedHeroes.indexOf(subHid) != -1) return true; + } } return false; } @@ -251,7 +255,7 @@ export async function generateAttackInfo(roleId: string, league: GVGLeagueType, return info; } -export async function generateAttackHeroInfo(lineup: { actorId: number, dataId: number, order: number }[], dbHeroes: HeroType[]) { +export async function generateAttackHeroInfo(lineup: { actorId: number, dataId: number, order: number, subHid: number }[], dbHeroes: HeroType[]) { let info = new OppPlayerInfo(); info.setPlayerHeroes(dbHeroes, lineup); return info; @@ -265,7 +269,11 @@ export async function getOppDetailData(rec: GVGVestigeRecType) { const dicWar = gameData.war.get(dicLadderDifficultRatio.gkId); const dicWarJson = gameData.warJson.get(dicWar.dispatchJsonId); const defenseInfo = rec.defenseInfo.heroes||[]; - const hids = defenseInfo.map(cur => cur.hid); + const hids: number[] = []; + for(let { hid, subHid } of defenseInfo) { + hids.push(hid); + if(subHid) hids.push(subHid); + } const heroes = await HeroModel.findByHidRange(hids, rec.defenseRoleId, 'hid lv quality star colorStar skins ce skinId'); const artifactSeids = heroes.map(hero => hero.artifact); const artifacts = await ArtifactModel.findbySeqIds(rec.defenseRoleId, artifactSeids); @@ -299,7 +307,7 @@ export async function updateMyVestigeRank(isChange: boolean, atkData: GVGVestige if(isChange) { if(atkData && !atkData.hasDefense) { // 只有第一次挑战且自己没有主动保存过阵容的时候才会这么保存 let heroes = rec.attackInfo.heroes||[]; - let lineup = heroes.map(hero => ({ actorId: hero.hid, dataId: hero.dataId, order: hero.order, ce: hero.ce })); + let lineup = heroes.map(hero => ({ actorId: hero.hid, dataId: hero.dataId, order: hero.order, ce: hero.ce, subHid: hero.subHid })); update.lineup = lineup; update.hasDefense = true; needUpdate = true; diff --git a/game-server/app/services/ladderService.ts b/game-server/app/services/ladderService.ts index e14bed131..ba2c9346b 100644 --- a/game-server/app/services/ladderService.ts +++ b/game-server/app/services/ladderService.ts @@ -1,6 +1,6 @@ import { ITEM_CHANGE_REASON, LADDER_OPP_STATUS, LADDER_SERVER_GAP_TIME, LADDER_STATUS, MAIL_TYPE, PUSH_ROUTE, REDIS_KEY, TA_USERSET_TYPE } from "../consts"; import { ArtifactModel } from "../db/Artifact"; -import { HeroType } from "../db/Hero"; +import { HeroModel, HeroType } from "../db/Hero"; import { LadderMatchModel, LadderMatchType, LadderUpdateInter } from "../db/LadderMatch"; import { LadderMatchRecModel, LadderMatchRecType } from "../db/LadderMatchRec"; import { RoleModel, RoleType } from "../db/Role"; @@ -270,6 +270,10 @@ export async function generateInitRecInfo(isRobot: boolean, isDefense: boolean, let artifact = await ArtifactModel.findbySeqId(role.roleId, dbHero.artifact); hero.setArtifact(artifact); } + if(defenseHero.subHid) { + let subHero = await HeroModel.findByHidAndRole(defenseHero.subHid, role.roleId, 'hid skinId'); + hero.setSubHero(subHero) + } heroes.push(hero); } } @@ -419,9 +423,16 @@ export async function getLadderOppDetailData(rec: LadderMatchRecType) { let hisLadderData = await LadderMatchModel.findByRoleIdAndInclude(rec.roleId2); let dicWar = gameData.war.get(dicLadderDifficultRatio.gkId); let dicWarJson = gameData.warJson.get(dicWar.dispatchJsonId); - let artifactSeids = hisLadderData.defense.heroes.map(cur => (cur.hero).artifact); + let artifactSeids = [], subHids: number[] = []; + for(let { hero, subHid } of hisLadderData.defense.heroes) { + let dbHero = hero; + if(dbHero) artifactSeids.push(dbHero.artifact); + if(subHid) subHids.push(subHid); + } + let artifacts = await ArtifactModel.findbySeqIds(rec.roleId2, artifactSeids); - result.setByPlayer(hisLadderData, dicWarJson, artifacts); + let subHeroes = await HeroModel.findByHidRange(subHids, rec.roleId2, 'hid skinId'); + result.setByPlayer(hisLadderData, dicWarJson, artifacts, subHeroes); let attrByHid = await getHeroesAttributes(rec.roleId2); for(let [hid, attribute] of attrByHid) { result.setAttribute(hid, attribute.getAttributesToString()); diff --git a/game-server/app/services/pvpService.ts b/game-server/app/services/pvpService.ts index f6e78ff46..3041cb910 100644 --- a/game-server/app/services/pvpService.ts +++ b/game-server/app/services/pvpService.ts @@ -256,7 +256,8 @@ async function generPlayerOppHis(pvpdefense: PvpDefenseType, roleId: string, pos let ce = attr.calCe(); if(isNaN(ce)) ce = 0; heroInfo.setAttribute(attribute); - let enemy = new PvpEnemies(warJson, heroInfo, hs ? hs.score : 0, ce); + let subHero = h.subHid? dbHeroes.find(hero => hero.hid == h.subHid): null; + let enemy = new PvpEnemies(warJson, heroInfo, hs ? hs.score : 0, ce, subHero); enemy.setOutIndex(h.order); enemy.initial_ai = h.ai; heroes.push(enemy); diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 8aa0e6050..d8601b33e 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -361,6 +361,9 @@ export const STATUS = { GVG_TECH_HAS_PROGRESS: { code: 21344, simStr: '该科技进度不为0' }, GVG_LV_RESOURCE: { code: 21345, simStr: '该联军等级下该资源已满' }, GVG_BATTLE_IS_END: { code: 21346, simStr: '激战期已结束' }, + GVG_TEAM_HERO_DUPLICATE: { code: 21347, simStr: '您的武将在其他队伍中已使用' }, + GVG_TEAM_SUB_HERO_DUPLICATE: { code: 21348, simStr: '该副将在其他队伍中已使用' }, + GVG_TEAM_HERO_USED_AS_SUB_HERO: { code: 21349, simStr: '该武将其他队伍中作为副将' }, // GVG征战中原 GVG_VESTIGE_ERR: { code: 21350, simStr: '今日未开放该遗迹' }, diff --git a/shared/db/GVGVestigeRank.ts b/shared/db/GVGVestigeRank.ts index 9f3d91bba..06b47d04a 100644 --- a/shared/db/GVGVestigeRank.ts +++ b/shared/db/GVGVestigeRank.ts @@ -14,6 +14,8 @@ export class Lineup { ce: number; // 战力 @prop({ required: true }) correspondingVar?: number; + @prop({ required: true }) + subHid: number; // 战力 } @index({ day: 1, groupKey: 1, vestigeId: 1, rank: 1 }) diff --git a/shared/domain/battleField/ladder.ts b/shared/domain/battleField/ladder.ts index a6521b125..ee63a64ee 100644 --- a/shared/domain/battleField/ladder.ts +++ b/shared/domain/battleField/ladder.ts @@ -25,14 +25,17 @@ export class LadderDefenseHero { hero: Ref; @prop({ required: true }) ce: number; + @prop({ required: false }) + subHid: number; - constructor(param: { actorId: number, ai: number, dataId: number, order: number }, heroId: string, ce: number) { + constructor(param: { actorId: number, ai: number, dataId: number, order: number, subHid?: number }, heroId: string, ce: number) { this.actorId = param.actorId; this.ai = param.ai; this.dataId = param.dataId; this.order = param.order; this.hero = heroId; this.ce = ce; + this.subHid = param.subHid||0; } } @@ -80,6 +83,10 @@ export class LadderOppPlayerHeroInfo { colorStar: number; // 彩星 @prop({ required: true }) lv: number; // 等级 + @prop({ required: true }) + subHid: number; // 副将 + @prop({ required: true }) + subActorId: number; // 副将(纯武将) @prop({ required: true, type: HeroArtifact, _id: false }) artifact: HeroArtifact[] = []; // 等级 @@ -112,6 +119,11 @@ export class LadderOppPlayerHeroInfo { setArtifact(artifact: ArtifactModelType) { if(artifact) this.artifact.push({ artifactId: artifact.artifactId, lv: artifact.lv }); } + + setSubHero(hero: HeroType) { + this.subHid = hero?.skinId||0; + this.subActorId = hero?.hid||0; + } } // ladderMatchRec @@ -180,12 +192,14 @@ export class LadderDefenseHeroReturn { ai: number; // ai逻辑,1-进攻型 2-防守型 dataId: number; order: number; + subHid: number; constructor(defenseHero: LadderDefenseHero) { this.actorId = defenseHero.actorId; this.ai = defenseHero.ai; this.dataId = defenseHero.dataId; this.order = defenseHero.order; + this.subHid = defenseHero.subHid||0; } } @@ -362,7 +376,7 @@ export class LadderOppDetailHeroReturn { subActorId: number = 0; artifacts: HeroArtifact[] = []; - constructor(warJson: DicWarJson, defensHero: LadderDefenseHero, artifacts: ArtifactModelType[]) { + constructor(warJson: DicWarJson, defensHero: LadderDefenseHero, artifacts: ArtifactModelType[], subHero: HeroType) { this.dataId = warJson.dataId; this.relation = warJson.relation; this.dirction = warJson.dirction; @@ -390,12 +404,14 @@ export class LadderOppDetailHeroReturn { let skin = hero.skins.find(cur => cur.enable); if(skin) this.talent = skin.talent; this.job = hero.job; - this.subHid = hero.subHid; - this.subActorId = hero.subActorId; let artifact = artifacts.find(cur => cur.seqId == hero.artifact); if(artifact) this.artifacts.push({ artifactId: artifact.artifactId, lv: artifact.lv }); } } + if(subHero) { + this.subHid = subHero?.skinId||0; + this.subActorId = subHero?.hid||0; + } } setAttribute(attribute: string) { @@ -426,7 +442,7 @@ export class LadderOppDetailReturn { } } - setByPlayer(ladderMatch: LadderMatchType, warJsons: DicWarJson[], artifacts: ArtifactModelType[]) { + setByPlayer(ladderMatch: LadderMatchType, warJsons: DicWarJson[], artifacts: ArtifactModelType[], subHeroes: HeroType[]) { this.isRobot = false; let role = ladderMatch.role; this.title = role.title; @@ -436,7 +452,8 @@ export class LadderOppDetailReturn { for(let hero of heroes) { let warJson = warJsons.find(cur => cur.dataId == hero.dataId); if(warJson) { - let obj = new LadderOppDetailHeroReturn(warJson, hero, artifacts); + let subHero = subHeroes.find(sub => sub.hid == hero.subHid); + let obj = new LadderOppDetailHeroReturn(warJson, hero, artifacts, subHero); this.heroes.push(obj); this.defCe += hero.ce; } diff --git a/shared/domain/battleField/pvp.ts b/shared/domain/battleField/pvp.ts index 336cef067..9621bbe5f 100644 --- a/shared/domain/battleField/pvp.ts +++ b/shared/domain/battleField/pvp.ts @@ -18,12 +18,15 @@ export class DefenseHeroInSaveData { dataId: number; @prop({ required: true }) order: number; + @prop({ required: false }) + subHid: number; - constructor(param: { actorId: number, ai: number, dataId: number, order: number }) { + constructor(param: { actorId: number, ai: number, dataId: number, order: number, subHid?: number }) { this.actorId = param.actorId; this.ai = param.ai; this.dataId = param.dataId; this.order = param.order; + this.subHid = param.subHid||0; } } @@ -33,7 +36,7 @@ export class DefenseHero extends DefenseHeroInSaveData { @prop({ ref: 'Hero', type: mongoose.Schema.Types.ObjectId }) hero: Ref; - constructor(param: { actorId: number, ai: number, dataId: number, order: number }, heroId: string) { + constructor(param: { actorId: number, ai: number, dataId: number, order: number, subHid?: number }, heroId: string) { super(param); this.hero = heroId; } @@ -153,12 +156,14 @@ export class DefenseHeroReturn { ai: number; // ai逻辑,1-进攻型 2-防守型 dataId: number; order: number; + subHid: number; constructor(defenseHero: DefenseHero) { this.actorId = defenseHero.actorId; this.ai = defenseHero.ai; this.dataId = defenseHero.dataId; this.order = defenseHero.order; + this.subHid = defenseHero.subHid; } } diff --git a/shared/domain/dbGeneral.ts b/shared/domain/dbGeneral.ts index 441727003..828700bfb 100644 --- a/shared/domain/dbGeneral.ts +++ b/shared/domain/dbGeneral.ts @@ -134,8 +134,6 @@ export class PvpHeroInfo { this.quality = hero.quality; let skin = hero.skins?.find(cur => cur.enable); if(skin) this.talent = skin.talent; - this.subHid = hero.subHid; - this.subActorId = hero.subActorId; if(artifact) this.artifact.push(artifact); this.ePlace = ePlace; } @@ -158,6 +156,12 @@ export class PvpHeroInfo { setOutIndex(order: number) { this.outIndex = order; } + + setSubHero(subHero: HeroType) { + console.log('#### setSubHero', subHero) + this.subHid = subHero?.skinId||0; + this.subActorId = subHero?.hid||0; + } } export class GVGHeroInfo extends PvpHeroInfo { @@ -250,7 +254,7 @@ export class PvpEnemies extends Enemies { // score: 这个武将的军功 - constructor(warjson: DicWarJson, heroInfo: PvpHeroInfo, score?: number, ce?: number) { + constructor(warjson: DicWarJson, heroInfo: PvpHeroInfo, score?: number, ce?: number, subHero?: HeroType) { super(warjson, heroInfo, ce); this.star = heroInfo.star; this.colorStar = heroInfo.colorStar; @@ -258,8 +262,8 @@ export class PvpEnemies extends Enemies { this.lv = heroInfo.lv; this.talent = heroInfo.talent; this.job = heroInfo.job; - this.subHid = heroInfo.subHid; - this.subActorId = heroInfo.subActorId; + this.subHid = subHero?.hid||heroInfo.subHid||0; + this.subActorId = subHero?.skinId||heroInfo.subActorId||0; this.artifact = heroInfo.artifact||[]; this.ePlace = heroInfo.ePlace||[]; if(score != undefined) this.score = score; diff --git a/shared/domain/gvgField/gvgDb.ts b/shared/domain/gvgField/gvgDb.ts index a2152688d..f5a21f687 100644 --- a/shared/domain/gvgField/gvgDb.ts +++ b/shared/domain/gvgField/gvgDb.ts @@ -30,6 +30,8 @@ export class OppPlayerHeroInfo { order: number; // 行动顺序 @prop({ required: true }) ce: number; // 战力 + @prop({ required: true }) + subHid: number; // 副将 setByWarJson(warJson: DicWarJson) { this.hid = warJson.actorId; @@ -51,7 +53,7 @@ export class OppPlayerHeroInfo { } } - setByDefenseHero(hero: HeroType, lineup: {actorId: number, dataId: number, order: number}[]) { + setByDefenseHero(hero: HeroType, lineup: {actorId: number, dataId: number, order: number, subHid: number}[]) { this.hid = hero.hid; this.skinId = hero.skinId; this.quality = hero.quality; @@ -63,6 +65,7 @@ export class OppPlayerHeroInfo { if(curLineup) { this.dataId = curLineup.dataId; this.order = curLineup.order; + this.subHid = curLineup.subHid; } } } @@ -116,7 +119,7 @@ export class OppPlayerInfo { this.leagueName = league.name; } - setPlayerHeroes(heroes: HeroType[], lineup: {actorId: number, dataId: number, order: number}[]) { + setPlayerHeroes(heroes: HeroType[], lineup: {actorId: number, dataId: number, order: number, subHid: number}[]) { for(let hero of heroes) { let obj = new OppPlayerHeroInfo(); obj.setByDefenseHero(hero, lineup); @@ -174,7 +177,7 @@ export class OppDetailHeroData { subActorId: number = 0; artifact: HeroArtifact[] = []; - constructor(warJson: DicWarJson, defensHero: OppPlayerHeroInfo, hero: HeroType, artifacts: ArtifactModelType[]) { + constructor(warJson: DicWarJson, defensHero: OppPlayerHeroInfo, hero: HeroType, artifacts: ArtifactModelType[], subHero: HeroType) { this.dataId = warJson.dataId; this.relation = warJson.relation; this.dirction = warJson.dirction; @@ -201,12 +204,14 @@ export class OppDetailHeroData { let skin = hero.skins.find(cur => cur.enable); if(skin) this.talent = skin.talent; this.job = hero.job; - this.subHid = hero.subHid; - this.subActorId = hero.subActorId; let artifact = artifacts.find(cur => cur.seqId == hero.artifact); if(artifact) this.artifact.push({ artifactId: artifact.artifactId, lv: artifact.lv }); } } + if(subHero) { + this.subHid = subHero?.skinId||0; + this.subActorId = subHero?.hid||0; + } } setAttribute(attribute: string) { @@ -240,7 +245,8 @@ export class OppDetailData{ let defenseHero = defenseHeroes.find(cur => cur.dataId == warJson.dataId); if(!defenseHero) continue; let curHero = heroes.find(cur => cur.hid == defenseHero.hid); - let hero = new OppDetailHeroData(warJson, defenseHero, curHero, artifacts); + let subHero = defenseHero.subHid? heroes.find(cur => cur.hid == defenseHero.subHid): null; + let hero = new OppDetailHeroData(warJson, defenseHero, curHero, artifacts, subHero); this.heroes.push(hero); this.lineupCe += curHero.ce; } diff --git a/shared/domain/gvgField/returnData.ts b/shared/domain/gvgField/returnData.ts index d4aeaffdc..7e5e973c4 100644 --- a/shared/domain/gvgField/returnData.ts +++ b/shared/domain/gvgField/returnData.ts @@ -775,6 +775,7 @@ export class MyTeamSimpleInfo { actorId: number; // 武将 dataId: number; // 出兵表上的位置 order: number; // 行动 + subHid: number; }[]; hasConfirm: boolean; @@ -784,7 +785,7 @@ export class MyTeamSimpleInfo { this.head = team.head; this.frame = team.frame; this.spine = team.spine; - this.lineup = team.lineup.map(({ actorId, dataId, outIndex }) => ({ actorId, dataId, order: outIndex })); + this.lineup = team.lineup.map(({ actorId, dataId, outIndex, subActorId }) => ({ actorId, dataId, order: outIndex, subHid: subActorId })); this.hasConfirm = team.confirmConfigId == configId; } } diff --git a/shared/domain/roleField/hero.ts b/shared/domain/roleField/hero.ts index 348067266..b9b2f6b88 100644 --- a/shared/domain/roleField/hero.ts +++ b/shared/domain/roleField/hero.ts @@ -164,4 +164,6 @@ export class LineupHero { dataId: number; // 出兵表上的位置 @prop({ required: true }) order: number; // 行动 + @prop({ required: false }) + subHid?: number; // 行动 }