From e75c040c6c806eb0f71a7e6b23fa66c12dd6f3c1 Mon Sep 17 00:00:00 2001 From: zhl Date: Thu, 4 Mar 2021 12:49:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E8=83=BD=E5=90=A6=E5=90=83=E7=89=8C?= =?UTF-8?q?=E7=AD=89=E9=85=8D=E7=BD=AE=E9=A1=B9=E6=94=BE=E5=85=A5state,=20?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=87=B3=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cfg/RoomOptions.ts | 25 +++++++++++++++++++------ src/constants/GameRuleConst.ts | 21 +++++++++++++++++++++ src/robot/Robot.ts | 3 ++- src/robot/RobotClient.ts | 3 ++- src/rooms/GeneralRoom.ts | 2 ++ src/rooms/commands/DiscardCommand.ts | 6 ++++-- src/rooms/commands/SelectPetCommand.ts | 4 +++- src/rooms/schema/CardGameState.ts | 3 +++ src/utils/clock.util.ts | 4 +++- 9 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 src/constants/GameRuleConst.ts diff --git a/src/cfg/RoomOptions.ts b/src/cfg/RoomOptions.ts index b157c3f..fac55a1 100644 --- a/src/cfg/RoomOptions.ts +++ b/src/cfg/RoomOptions.ts @@ -1,5 +1,11 @@ import { singleton } from '../decorators/singleton.decorator' import { GameEnv } from './GameEnv' +import { CardGameState } from '../rooms/schema/CardGameState' +import { + RULE_CANEAT, + RULE_DROPCARD, + RULE_MULTIPLEEAT, RULE_SINGLEEAT +} from '../constants/GameRuleConst' @singleton export class RoomOptions { @@ -9,11 +15,11 @@ export class RoomOptions { * @param opt */ public canEat(opt: {advMode: boolean}) { - let result = false + let result = 0 if (opt.advMode && new GameEnv().canEatAdv) { - result = true + result = 1 } else if (!opt.advMode && new GameEnv().canEatBase) { - result = true + result = 1 } return result } @@ -24,7 +30,7 @@ export class RoomOptions { * @param opt */ public multipleEat(opt?: any) { - return false + return 0 } /** @@ -32,7 +38,7 @@ export class RoomOptions { * @param opt */ public autoDiscard(opt?: any) { - return true + return 1 } /** @@ -40,7 +46,14 @@ export class RoomOptions { * @param opt */ public singleEat(opt?: any) { - return true + return 0 + } + + public initGameRule(state: CardGameState) { + state.rules.set(RULE_CANEAT, this.canEat({advMode: state.advMode})) + state.rules.set(RULE_MULTIPLEEAT, this.multipleEat()) + state.rules.set(RULE_DROPCARD, this.autoDiscard()) + state.rules.set(RULE_SINGLEEAT, this.singleEat()) } } diff --git a/src/constants/GameRuleConst.ts b/src/constants/GameRuleConst.ts new file mode 100644 index 0000000..69c5959 --- /dev/null +++ b/src/constants/GameRuleConst.ts @@ -0,0 +1,21 @@ +/** + * 一个回合是否能多次吃牌 + * @type {string} + */ +export const RULE_MULTIPLEEAT = 'multipeat' +/** + * 是否必须弃牌 + * @type {string} + */ +export const RULE_DROPCARD = 'dropcard' +/** + * 当前游戏能否吃牌 + * @type {string} + */ +export const RULE_CANEAT = 'caneat' + +/** + * 单张牌能否下随从 + * @type {string} + */ +export const RULE_SINGLEEAT = 'singleeat' diff --git a/src/robot/Robot.ts b/src/robot/Robot.ts index 63dfad4..6a89089 100644 --- a/src/robot/Robot.ts +++ b/src/robot/Robot.ts @@ -5,6 +5,7 @@ import { Player } from '../rooms/schema/Player' import assistantUtil from '../utils/assistant.util' import { delay, wait } from '../decorators/cfg' import { RoomOptions } from '../cfg/RoomOptions' +import { RULE_CANEAT } from '../constants/GameRuleConst' export class Robot { host: string @@ -164,7 +165,7 @@ export class Robot { @wait('maxDiscardTime') private async discard() { let targetCard - let canEat = new RoomOptions().canEat({advMode: this.room.state.advMode}) + let canEat = !!this.room.state.rules.get(RULE_CANEAT) if (this.room.state.cards.size == 1 && canEat) { targetCard = [...this.room.state.cards.values()][0] } diff --git a/src/robot/RobotClient.ts b/src/robot/RobotClient.ts index 2a2059c..12f546f 100644 --- a/src/robot/RobotClient.ts +++ b/src/robot/RobotClient.ts @@ -9,6 +9,7 @@ import { Player } from '../rooms/schema/Player' import assistantUtil from '../utils/assistant.util' import { wait } from '../decorators/cfg' import { RoomOptions } from '../cfg/RoomOptions' +import { RULE_CANEAT } from '../constants/GameRuleConst' /** * 服务端辅助机器人 @@ -141,7 +142,7 @@ export class RobotClient implements Client { @wait('maxDiscardTime') private async discard() { let targetCard - let canEat = new RoomOptions().canEat({advMode: this.svrstate.advMode}) + let canEat = !!this.svrstate.rules.get(RULE_CANEAT) if (this.svrstate.cards.size == 1 && canEat) { targetCard = [...this.svrstate.cards.values()][0] } diff --git a/src/rooms/GeneralRoom.ts b/src/rooms/GeneralRoom.ts index 4bcfbe7..ad74070 100644 --- a/src/rooms/GeneralRoom.ts +++ b/src/rooms/GeneralRoom.ts @@ -22,6 +22,7 @@ import { ChangePetCommand } from './commands/ChangePetCommand' import { createRobot } from '../common/WebApi' import { Service } from '../service/Service' import { ManualTurnEndCommand } from './commands/ManualTurnEndCommand' +import { RoomOptions } from '../cfg/RoomOptions' export class GeneralRoom extends Room { dispatcher = new Dispatcher(this) @@ -60,6 +61,7 @@ export class GeneralRoom extends Room { if (options.score) { this.score = options.score } + new RoomOptions().initGameRule(this.state) this.battleMan.init(cs, this) this.clock.start() this.state.gameState = GameStateConst.STATE_WAIT_JOIN diff --git a/src/rooms/commands/DiscardCommand.ts b/src/rooms/commands/DiscardCommand.ts index bc8141c..f63fe97 100644 --- a/src/rooms/commands/DiscardCommand.ts +++ b/src/rooms/commands/DiscardCommand.ts @@ -12,6 +12,7 @@ import { StateTypeEnum } from '../enums/StateTypeEnum' import { RoomOptions } from '../../cfg/RoomOptions' import { ClockNameConst } from '../../constants/ClockNameConst' import { stopDrawCardClock } from '../../utils/clock.util' +import { RULE_CANEAT, RULE_SINGLEEAT } from '../../constants/GameRuleConst' /** * 出牌 @@ -60,7 +61,7 @@ export class DiscardCommand extends Command 1) { + const multipEat = !!this.state.rules.get(RULE_MULTIPLEEAT) + if (multipEat && assistantUtil.checkDiscard([...player.cards.values()]).length > 1) { this.state.updateGameState(GameStateConst.STATE_BEGIN_DRAW) this.state.updateGameTurn(player.id, this.state.eatCount + 1) debugRoom(`more eatcount for player ${player.id}, ${this.state.eatCount}`) diff --git a/src/rooms/schema/CardGameState.ts b/src/rooms/schema/CardGameState.ts index f34e94d..58d77a8 100644 --- a/src/rooms/schema/CardGameState.ts +++ b/src/rooms/schema/CardGameState.ts @@ -83,6 +83,9 @@ export class CardGameState extends Schema { */ maxCardId = 0; + @type({map: "number"}) + rules = new MapSchema(); + updateGameState(val: number) { let preVal = this.gameState; this.gameState = val; diff --git a/src/utils/clock.util.ts b/src/utils/clock.util.ts index 661b27f..e478ef4 100644 --- a/src/utils/clock.util.ts +++ b/src/utils/clock.util.ts @@ -6,6 +6,7 @@ import { TurnEndCommand } from '../rooms/commands/TurnEndCommand' import { ClockNameConst } from '../constants/ClockNameConst' import { GameEnv } from '../cfg/GameEnv' import { Player } from '../rooms/schema/Player' +import { RULE_DROPCARD } from '../constants/GameRuleConst' /** * 添加出牌计时器 @@ -17,7 +18,8 @@ export function addDrawCardClock(room: Room) { const player = room.state.players.get(sessionId) let timeOverDraw = function () { if (sessionId == room.state.currentTurn) { - if (new RoomOptions().autoDiscard()) { + const autoDiscard = !!room.state.rules.get(RULE_DROPCARD) + if (autoDiscard) { const client = room.getClient(sessionId) const card = player.cards.values().next().value debugRoom('出牌时间到, 自动出牌: ', card.id)