card_svr/src/cfg/RoomOptions.ts

85 lines
1.9 KiB
TypeScript

import { singleton } from '../decorators/singleton.decorator'
import { GameEnv } from './GameEnv'
import { CardGameState } from '../rooms/schema/CardGameState'
import { checkBitIdx, checkBitNumber } from '../utils/number.util'
/**
* 一个回合是否能多次吃牌
* @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'
@singleton
export class RoomOptions {
/**
* 当前游戏能否吃牌
* @return {boolean}
* @param opt
*/
public canEat(opt: {advMode: boolean}) {
let result = 0
if (opt.advMode && new GameEnv().canEatAdv) {
result = 1
} else if (!opt.advMode && new GameEnv().canEatBase) {
result = 1
}
return result
}
/**
* 一个回合能不能吃多次
* //TODO: 根据配表判断
* @param opt
*/
public multipleEat(opt?: any) {
return 0
}
/**
* 当前轮时间到了后, 是否自动出牌
* @param opt
*/
public autoDiscard(opt?: any) {
return 1
}
/**
* 单张牌也能放技能和选随从
* @param opt
*/
public singleEat(opt?: any) {
return 0
}
public initGameRule(state: CardGameState, val: number) {
if (val) {
state.rules.set(RULE_CANEAT, checkBitNumber(val, 1))
state.rules.set(RULE_MULTIPLEEAT, checkBitNumber(val, 2))
state.rules.set(RULE_DROPCARD, checkBitNumber(val, 3))
state.rules.set(RULE_SINGLEEAT, checkBitNumber(val, 4))
} else {
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())
}
}
}