269 lines
8.2 KiB
Go
269 lines
8.2 KiB
Go
package base
|
|
|
|
// 根据不同的房间模式,选择不同的房间业务逻辑
|
|
var ScenePolicyPool = make(map[int]map[int]ScenePolicy) // gameId:gameMode
|
|
|
|
type ScenePolicy interface {
|
|
//场景开启事件
|
|
OnStart(s *Scene)
|
|
//场景关闭事件
|
|
OnStop(s *Scene)
|
|
//场景心跳事件
|
|
OnTick(s *Scene)
|
|
//玩家进入事件
|
|
OnPlayerEnter(s *Scene, p *Player)
|
|
//玩家离开事件
|
|
OnPlayerLeave(s *Scene, p *Player, reason int)
|
|
//玩家掉线
|
|
OnPlayerDropLine(s *Scene, p *Player)
|
|
//玩家重连
|
|
OnPlayerRehold(s *Scene, p *Player)
|
|
//玩家 返回房间
|
|
OnPlayerReturn(s *Scene, p *Player)
|
|
//玩家操作
|
|
OnPlayerOp(s *Scene, p *Player, opcode int, params []int64) bool
|
|
//玩家操作
|
|
OnPlayerOperate(s *Scene, p *Player, params interface{}) bool
|
|
//玩家事件
|
|
OnPlayerEvent(s *Scene, p *Player, evtcode int, params []int64)
|
|
//观众进入事件
|
|
OnAudienceEnter(s *Scene, p *Player)
|
|
//观众离开事件
|
|
OnAudienceLeave(s *Scene, p *Player, reason int)
|
|
//观众坐下事件
|
|
OnAudienceSit(s *Scene, p *Player)
|
|
//观众掉线
|
|
OnAudienceDropLine(s *Scene, p *Player)
|
|
//
|
|
GetSceneState(s *Scene, stateid int) SceneState
|
|
//是否完成了整个牌局
|
|
IsCompleted(s *Scene) bool
|
|
//是否可以强制开始
|
|
IsCanForceStart(s *Scene) bool
|
|
//强制开始
|
|
ForceStart(s *Scene)
|
|
//当前状态能否加币
|
|
CanAddCoin(s *Scene, p *Player, val int64) bool
|
|
//当前状态能否换桌
|
|
CanChangeCoinScene(s *Scene, p *Player) bool
|
|
//创建场景扩展数据
|
|
CreateSceneExData(s *Scene) interface{}
|
|
//创建玩家扩展数据
|
|
CreatePlayerExData(s *Scene, p *Player) interface{}
|
|
//
|
|
PacketGameData(s *Scene) interface{}
|
|
InterventionGame(s *Scene, data interface{}) interface{}
|
|
//通知分场状态
|
|
NotifyGameState(s *Scene)
|
|
|
|
GetJackPotVal(s *Scene) int64
|
|
}
|
|
|
|
// 场景状态接口
|
|
type SceneState interface {
|
|
GetState() int //状态ID
|
|
CanChangeTo(s SceneState) bool //切换到指定状态
|
|
CanChangeCoinScene(s *Scene, p *Player) bool //当前状态能否换桌
|
|
GetTimeout(s *Scene) int //超时时间
|
|
OnEnter(s *Scene) //状态进入时
|
|
OnLeave(s *Scene) //状态离开时
|
|
OnTick(s *Scene) //状态tick
|
|
OnPlayerOp(s *Scene, p *Player, opcode int, params []int64) bool //玩家操作
|
|
OnPlayerEvent(s *Scene, p *Player, evtcode int, params []int64) //玩家事件
|
|
}
|
|
|
|
type SceneStateOperate interface {
|
|
OnPlayerOperate(s *Scene, p *Player, params interface{}) bool
|
|
}
|
|
|
|
func GetScenePolicy(gameId, mode int) ScenePolicy {
|
|
if g, exist := ScenePolicyPool[gameId]; exist {
|
|
if p, exist := g[mode]; exist {
|
|
return p
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func RegisteScenePolicy(gameId, mode int, sp ScenePolicy) {
|
|
pool := ScenePolicyPool[gameId]
|
|
if pool == nil {
|
|
pool = make(map[int]ScenePolicy)
|
|
ScenePolicyPool[gameId] = pool
|
|
}
|
|
if pool != nil {
|
|
pool[mode] = sp
|
|
}
|
|
}
|
|
|
|
type BaseScenePolicy struct {
|
|
}
|
|
|
|
func (bsp *BaseScenePolicy) OnStart(s *Scene) {
|
|
if s.aiMgr != nil {
|
|
s.aiMgr.OnStart(s)
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnStop(s *Scene) {
|
|
if s.aiMgr != nil {
|
|
s.aiMgr.OnStop(s)
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnTick(s *Scene) {
|
|
if s.aiMgr != nil {
|
|
s.aiMgr.OnTick(s)
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnPlayerEnter(s *Scene, p *Player) {
|
|
if s.WithLocalAI {
|
|
if p.ai != nil && p.IsLocal {
|
|
p.ai.OnSelfEnter(s, p)
|
|
}
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnPlayerEnter(s, p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnPlayerLeave(s *Scene, p *Player, reason int) {
|
|
if s.WithLocalAI {
|
|
if p.ai != nil && p.IsLocal {
|
|
p.ai.OnSelfLeave(s, p, reason)
|
|
}
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnPlayerLeave(s, p, reason)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnPlayerDropLine(s *Scene, p *Player) {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnPlayerDropLine(s, p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnPlayerRehold(s *Scene, p *Player) {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnPlayerRehold(s, p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 玩家返回房间
|
|
func (bsp *BaseScenePolicy) OnPlayerReturn(s *Scene, p *Player) {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnPlayerReturn(s, p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnPlayerOp(s *Scene, p *Player, op int, params []int64) bool {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnPlayerOp(s, p, op, params)
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
func (bsp *BaseScenePolicy) OnPlayerOperate(s *Scene, p *Player, params interface{}) bool {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnPlayerOperate(s, p, params)
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
func (bsp *BaseScenePolicy) OnPlayerEvent(s *Scene, p *Player, evtcode int, params []int64) {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnPlayerEvent(s, p, evtcode, params)
|
|
}
|
|
}
|
|
}
|
|
switch evtcode {
|
|
case PlayerEventRecharge, PlayerEventAddCoin:
|
|
p.SetTakeCoin(p.GetTakeCoin() + params[0]) // 为了保持游戏事件统计中的输赢分计算正确
|
|
}
|
|
}
|
|
|
|
func (bsp *BaseScenePolicy) OnAudienceEnter(s *Scene, p *Player) {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnAudienceEnter(s, p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnAudienceLeave(s *Scene, p *Player, reason int) {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnAudienceLeave(s, p, reason)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnAudienceSit(s *Scene, p *Player) {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnAudienceSit(s, p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) OnAudienceDropLine(s *Scene, p *Player) {
|
|
if s.WithLocalAI {
|
|
for _, pp := range s.Players {
|
|
if pp.ai != nil && pp != p {
|
|
pp.ai.OnAudienceDropLine(s, p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (bsp *BaseScenePolicy) GetSceneState(s *Scene, stateid int) SceneState { return G_BaseSceneState }
|
|
func (bsp *BaseScenePolicy) IsCompleted(s *Scene) bool { return false }
|
|
func (bsp *BaseScenePolicy) IsCanForceStart(s *Scene) bool { return false }
|
|
func (bsp *BaseScenePolicy) ForceStart(s *Scene) {}
|
|
func (bsp *BaseScenePolicy) CanAddCoin(s *Scene, p *Player, val int64) bool { return true } /*百人牛牛,百人金华多倍结算,且当前是减币的情况下,需要判断*/
|
|
func (bsp *BaseScenePolicy) CanChangeCoinScene(s *Scene, p *Player) bool { return false }
|
|
func (bsp *BaseScenePolicy) CreateSceneExData(s *Scene) interface{} { return false }
|
|
func (bsp *BaseScenePolicy) CreatePlayerExData(s *Scene, p *Player) interface{} { return false }
|
|
func (bsp *BaseScenePolicy) PacketGameData(s *Scene) interface{} { return nil }
|
|
func (bsp *BaseScenePolicy) InterventionGame(s *Scene, data interface{}) interface{} { return nil }
|
|
func (bsp *BaseScenePolicy) NotifyGameState(s *Scene) {}
|
|
func (bsp *BaseScenePolicy) GetJackPotVal(s *Scene) int64 { return 0 }
|
|
|
|
var G_BaseSceneState = &BaseSceneState{}
|
|
|
|
type BaseSceneState struct {
|
|
}
|
|
|
|
func (bst *BaseSceneState) GetState() int { return -1 }
|
|
func (bst *BaseSceneState) CanChangeTo(s SceneState) bool { return false }
|
|
func (bst *BaseSceneState) CanChangeCoinScene(s *Scene, p *Player) bool { return false }
|
|
func (bst *BaseSceneState) GetTimeout(s *Scene) int { return 0 }
|
|
func (bst *BaseSceneState) OnEnter(s *Scene) {}
|
|
func (bst *BaseSceneState) OnLeave(s *Scene) {}
|
|
func (bst *BaseSceneState) OnTick(s *Scene) {}
|
|
func (bst *BaseSceneState) OnPlayerOp(s *Scene, p *Player, opcode int, params []int64) bool {
|
|
return false
|
|
}
|
|
func (bst *BaseSceneState) OnPlayerEvent(s *Scene, p *Player, evtcode int, params []int64) {}
|