game_sync/gamesrv/base/scene_policy.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) {}