From 0e3756978c79fb08b798eb3fe9c9432248c2ac5c Mon Sep 17 00:00:00 2001 From: luying Date: Wed, 18 Aug 2021 20:24:57 +0800 Subject: [PATCH] =?UTF-8?q?=E9=95=87=E5=BF=B5=E5=A1=94=EF=BC=9A=E7=A6=81?= =?UTF-8?q?=E7=94=A8=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game-server/app/services/battleService.ts | 29 ++++++++++++++++++++++- shared/consts/constModules/battleConst.ts | 6 +++++ shared/consts/statusCode.ts | 1 + shared/pubUtils/dictionary/DicWar.ts | 16 +++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/game-server/app/services/battleService.ts b/game-server/app/services/battleService.ts index 260c246e1..d096c213d 100644 --- a/game-server/app/services/battleService.ts +++ b/game-server/app/services/battleService.ts @@ -1,7 +1,7 @@ import { HeroModel } from './../db/Hero'; import { HangUpRecordModel } from './../db/HangUpRecord'; import { pinus } from 'pinus'; -import { HANG_UP_CONSTS, REDIS_KEY, TASK_TYPE, TIME_OUTPUT_TYPE, GOLD_COST_RATIO, TOWER_TASK_STATUS, MAIL_TYPE } from './../consts'; +import { HANG_UP_CONSTS, REDIS_KEY, TASK_TYPE, TOWER_FORBIDDEN_CHARA_TYPE, TOWER_TASK_STATUS, MAIL_TYPE } from './../consts'; import { BattleRecordModel } from './../db/BattleRecord'; import { TowerRecordModel } from './../db/TowerRecord'; import { RoleModel, RoleType } from './../db/Role'; @@ -158,10 +158,16 @@ export async function checkTowerWar(roleId: string, battleId: number, heroes: Ar return { status: -1, resResult: resResult(STATUS.TOWER_NOT_FOUND) }; } let { heroes: recHeroes = [], warStatus = [] } = tower; + let dicWar = gameData.war.get(battleId); + let { fobiddenCharactor } = dicWar; for (let hid of heroes) { if (recHeroes.indexOf(hid) !== -1) { return { status: -1, resResult: resResult(STATUS.TOWER_DUPLICATE_HERO) }; } + if(checkForbiddenChar(hid, fobiddenCharactor)) { + return { status: -1, resResult: resResult(STATUS.TOWER_HERO_FORBIDDEN) }; + } + } const curWarStatus = warStatus.find(elem => elem.warId == battleId); if (curWarStatus && curWarStatus.status) { @@ -175,6 +181,27 @@ export async function checkTowerWar(roleId: string, battleId: number, heroes: Ar }; } +function checkForbiddenChar(hid: number, fobiddenCharactor: {type: number, id: number}[]) { + let dicHero = gameData.hero.get(hid); + let dicJob = gameData.job.get(dicHero.jobid); + let flag = false; + for(let { type, id } of fobiddenCharactor) { + switch(type) { + case TOWER_FORBIDDEN_CHARA_TYPE.CHAR: + if(id == hid) flag = true; + break; + case TOWER_FORBIDDEN_CHARA_TYPE.JOB: + if(id == dicJob.job_class) flag = true; + break; + case TOWER_FORBIDDEN_CHARA_TYPE.CAMP: + if(id == dicHero.camp) flag = true; + break; + } + if(flag) break; + } + return flag; +} + export async function towerBattleEnd(sid: string, funcs: number[], roleId: string, serverId: number, battleCode: string, battleId: number, succeed: boolean, heroes: Array) { if (succeed) { let battleRec = await BattleRecordModel.getBattleRecordByCode(battleCode); diff --git a/shared/consts/constModules/battleConst.ts b/shared/consts/constModules/battleConst.ts index b43ba9df1..20fb58283 100644 --- a/shared/consts/constModules/battleConst.ts +++ b/shared/consts/constModules/battleConst.ts @@ -166,4 +166,10 @@ export enum TOWER_TASK_STATUS { DOINING = 1, // 已派遣,进行中 FINISH = 2, // 派遣结束 RECEIVED = 3, // 已领取 +} + +export enum TOWER_FORBIDDEN_CHARA_TYPE { + CHAR = 1, // 角色 + JOB = 2, // 职业 + CAMP = 3, // 国家 } \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 30a4849af..0c52c7c99 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -89,6 +89,7 @@ export const STATUS = { TOWER_TASK_MISSING: { code: 20517, simStr: '未找到该任务' }, TOWER_HANG_UP_NOT_START: { code: 20518, simStr: '挂机尚未开启' }, TOWER_REF_CNT_NOT_ENOUGH: { code: 20519, simStr: '派遣刷新次数不足' }, + TOWER_HERO_FORBIDDEN: { code: 20520, simStr: '该武将不可使用' }, // 寻宝(共斗) 20600 - 20699 COM_BATTLE_DUP_ENTER: { code: 20601, simStr: '不能重复加入' }, COM_BATTLE_BLUEPRT_NOT_FOUND: { code: 20602, simStr: '藏宝图不足' }, diff --git a/shared/pubUtils/dictionary/DicWar.ts b/shared/pubUtils/dictionary/DicWar.ts index 50c80dbc8..df2046323 100644 --- a/shared/pubUtils/dictionary/DicWar.ts +++ b/shared/pubUtils/dictionary/DicWar.ts @@ -34,6 +34,8 @@ export interface DicWar { readonly jackpotReward: Array<{id: number, weight: number}>; // 寻宝队友奖励 readonly teammateReward: Array<{id: number, count: number}>; + // 镇念塔禁用角色 + readonly fobiddenCharactor: Array<{type: number, id: number}>; } export const dicWar = new Map(); @@ -51,6 +53,7 @@ export function loadWar() { o.detailUIBg = parseDetailUIBg(o.detailUIBg); o.jackpotReward = parseJackpotReward(o.jackpotReward); o.teammateReward = parseFixReward(o.teammateReward); + o.fobiddenCharactor = parseForbiddenChara(o.fobiddenCharactor); dicWar.set(o.war_id, o); if(o.warType == WAR_TYPE.PVP) { @@ -122,4 +125,17 @@ function parseJackpotReward(str: string = '') { result.push({id: parseInt(id), weight: parseInt(weight)}); } return result +} + +function parseForbiddenChara(str: string = '') { + let result = new Array<{type: number, id: number}>(); + if(!str) return result; + let decodeArr = decodeArrayListStr(str); + for(let [type, id] of decodeArr) { + if(isNaN(parseInt(type)) || isNaN(parseInt(id))) { + throw new Error('data table format wrong'); + } + result.push({type: parseInt(type), id: parseInt(id)}); + } + return result } \ No newline at end of file