From f9605e9f26a139ad6059da49654852c911264091 Mon Sep 17 00:00:00 2001 From: tomas Date: Wed, 13 Nov 2024 10:11:12 +0800 Subject: [PATCH] add tiger game test --- gamerule/fortunetiger/constants.go | 22 + gamesrv/fortunetiger/action_fortunetiger.go | 46 ++ .../fortunetiger/playerdata_fortunetiger.go | 54 ++ .../fortunetiger/scenedata_fortunetiger.go | 45 ++ .../fortunetiger/scenepolicy_fortunetiger.go | 574 ++++++++++++++++++ 5 files changed, 741 insertions(+) create mode 100644 gamerule/fortunetiger/constants.go create mode 100644 gamesrv/fortunetiger/action_fortunetiger.go create mode 100644 gamesrv/fortunetiger/playerdata_fortunetiger.go create mode 100644 gamesrv/fortunetiger/scenedata_fortunetiger.go create mode 100644 gamesrv/fortunetiger/scenepolicy_fortunetiger.go diff --git a/gamerule/fortunetiger/constants.go b/gamerule/fortunetiger/constants.go new file mode 100644 index 0000000..ae36f3c --- /dev/null +++ b/gamerule/fortunetiger/constants.go @@ -0,0 +1,22 @@ +package fortunetiger + +// 房间类型 +const ( + RoomMode_Classic int = iota //经典 + RoomMode_Max +) + +// 场景状态 +const ( + FortuneTigerStateStart int = iota //默认状态 + FortuneTigerStateMax +) + +// 玩家操作 +const ( + FortuneTigerPlayerOpStart int = iota + FortuneTigerPlayerOpSwitch +) +const NowByte int64 = 10000 + +const GameDataKey = "FortuneData" diff --git a/gamesrv/fortunetiger/action_fortunetiger.go b/gamesrv/fortunetiger/action_fortunetiger.go new file mode 100644 index 0000000..334dee5 --- /dev/null +++ b/gamesrv/fortunetiger/action_fortunetiger.go @@ -0,0 +1,46 @@ +package fortunetiger + +import ( + "mongo.games.com/game/common" + "mongo.games.com/game/gamesrv/base" + "mongo.games.com/game/protocol/fortunetiger" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/netlib" +) + +type CSFortuneTigerOpPacketFactory struct { +} +type CSFortuneTigerOpHandler struct { +} + +func (this *CSFortuneTigerOpPacketFactory) CreatePacket() interface{} { + pack := &fortunetiger.CSFortuneTigerOp{} + return pack +} + +func (this *CSFortuneTigerOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { + if op, ok := data.(*fortunetiger.CSFortuneTigerOp); ok { + p := base.PlayerMgrSington.GetPlayer(sid) + if p == nil { + logger.Logger.Warn("CSFortuneTigerOpHandler p == nil") + return nil + } + scene := p.GetScene() + if scene == nil { + logger.Logger.Warn("CSFortuneTigerOpHandler p.scene == nil") + return nil + } + if !scene.HasPlayer(p) { + return nil + } + if scene.GetScenePolicy() != nil { + scene.GetScenePolicy().OnPlayerOp(scene, p, int(op.GetOpCode()), op.GetParams()) + } + return nil + } + return nil +} +func init() { + common.RegisterHandler(int(fortunetiger.FortuneTigerPID_PACKET_FORTUNETIGER_CSFORTUNETIGEROP), &CSFortuneTigerOpHandler{}) + netlib.RegisterFactory(int(fortunetiger.FortuneTigerPID_PACKET_FORTUNETIGER_CSFORTUNETIGEROP), &CSFortuneTigerOpPacketFactory{}) +} diff --git a/gamesrv/fortunetiger/playerdata_fortunetiger.go b/gamesrv/fortunetiger/playerdata_fortunetiger.go new file mode 100644 index 0000000..c35127b --- /dev/null +++ b/gamesrv/fortunetiger/playerdata_fortunetiger.go @@ -0,0 +1,54 @@ +package fortunetiger + +import ( + "mongo.games.com/game/gamerule/fortunetiger" + "mongo.games.com/game/gamesrv/base" + "mongo.games.com/game/gamesrv/slotspkg/slots" +) + +type FortuneTigerPlayerData struct { + *base.Player + leaveTime int32 //离开时间 + SlotsSession *base.SlotsSession + + BetSizeIndex int64 `json:"bsi"` //选中的单注下标 + BetLevelIndex int64 `json:"bli"` //选中的等级下标 + BetLineIndex int64 `json:"bii"` //选中的线数下标 + BetMode int64 `json:"bm,optional"` //0.常规 1.必中 + + taxCoin int64 + winCoin int64 + currentLogId string + totalBet int64 + + isRespin bool //只用于判断是否可以离开 +} + +type SpinLock struct { + ReSpinStatus int `json:"rs,omitempty"` //0.默认 1.第一次触发 2.进行中 3.结束 + ReSpinSymbol int64 `json:"rsy,omitempty"` //图标(respin) + Lock [][]int `json:"l,omitempty"` //原来锁定的位置 + AddLock [][]int `json:"al,omitempty"` //新增锁定的位置 + X10 int64 `json:"x10,omitempty"` //100.不同图标 88.wild 其他类型.按当前单一中奖图标类型 + WinLines map[int][][]int `json:"wls,omitempty"` +} + +func (p *FortuneTigerPlayerData) init() { + p.SlotsSession = base.NewSession(uint64(p.SnId), p.Coin*fortunetiger.NowByte) +} +func (p *FortuneTigerPlayerData) Clear() { + p.taxCoin = 0 + p.winCoin = 0 + p.currentLogId = "" +} + +// 需要带到world上进行数据处理 +func (p *FortuneTigerPlayerData) PushPlayer() map[string]string { + cache := slots.SlotsMgrSington.PushPlayer(p.SlotsSession) + return cache +} + +// 进房的时候需要带进来 +func (p *FortuneTigerPlayerData) PullPlayer(data map[string]string) { + slots.SlotsMgrSington.PullPlayer(p.SlotsSession, data) +} diff --git a/gamesrv/fortunetiger/scenedata_fortunetiger.go b/gamesrv/fortunetiger/scenedata_fortunetiger.go new file mode 100644 index 0000000..62fdc68 --- /dev/null +++ b/gamesrv/fortunetiger/scenedata_fortunetiger.go @@ -0,0 +1,45 @@ +package fortunetiger + +import ( + "mongo.games.com/game/gamesrv/base" + "mongo.games.com/game/gamesrv/slotspkg/assemble" +) + +type FortuneTigerSceneData struct { + *base.Scene //场景 + players map[int32]*FortuneTigerPlayerData //玩家信息 + BetConfig *assemble.BetConfig +} + +func NewFortuneTigerSceneData(s *base.Scene) *FortuneTigerSceneData { + sceneEx := &FortuneTigerSceneData{ + Scene: s, + players: make(map[int32]*FortuneTigerPlayerData), + } + sceneEx.Init() + return sceneEx +} +func (s *FortuneTigerSceneData) Init() { + +} + +func (s *FortuneTigerSceneData) Clear() { + //应该是水池变一次就判断修改一次 + //s.slotRateWeight = s.slotRateWeightTotal[0] +} +func (s *FortuneTigerSceneData) SceneDestroy(force bool) { + //销毁房间 + s.Scene.Destroy(force) +} + +func (s *FortuneTigerSceneData) delPlayer(SnId int32) { + if _, exist := s.players[SnId]; exist { + delete(s.players, SnId) + } +} +func (s *FortuneTigerSceneData) OnPlayerLeave(p *base.Player, reason int) { + if /*playerEx*/ _, ok := p.ExtraData.(*FortuneTigerPlayerData); ok { + + } + s.delPlayer(p.SnId) +} diff --git a/gamesrv/fortunetiger/scenepolicy_fortunetiger.go b/gamesrv/fortunetiger/scenepolicy_fortunetiger.go new file mode 100644 index 0000000..5cd4ab0 --- /dev/null +++ b/gamesrv/fortunetiger/scenepolicy_fortunetiger.go @@ -0,0 +1,574 @@ +package fortunetiger + +import ( + "encoding/json" + "mongo.games.com/game/common" + "mongo.games.com/game/gamerule/fortunetiger" + "mongo.games.com/game/gamesrv/base" + "mongo.games.com/game/gamesrv/slotspkg/assemble" + "mongo.games.com/game/gamesrv/slotspkg/slots" + "mongo.games.com/game/model" + "mongo.games.com/game/proto" + protocol "mongo.games.com/game/protocol/fortunetiger" + "mongo.games.com/game/protocol/server" + "mongo.games.com/goserver/core" + "mongo.games.com/goserver/core/logger" + "time" +) + +// //////////////////////////////////////////////////////////// +var ScenePolicyFortuneTigerSington = &ScenePolicyFortuneTiger{} + +type ScenePolicyFortuneTiger struct { + base.BaseScenePolicy + states [fortunetiger.FortuneTigerStateMax]base.SceneState +} + +// 创建场景扩展数据 +func (this *ScenePolicyFortuneTiger) CreateSceneExData(s *base.Scene) interface{} { + sceneEx := NewFortuneTigerSceneData(s) + if sceneEx != nil { + if sceneEx.GetInit() { + s.SetExtraData(sceneEx) + } + } + return sceneEx +} + +// 创建玩家扩展数据 +func (this *ScenePolicyFortuneTiger) CreatePlayerExData(s *base.Scene, p *base.Player) interface{} { + playerEx := &FortuneTigerPlayerData{Player: p} + p.SetExtraData(playerEx) + return playerEx +} + +// 场景开启事件 +func (this *ScenePolicyFortuneTiger) OnStart(s *base.Scene) { + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnStart, sceneId=", s.GetSceneId()) + sceneEx := NewFortuneTigerSceneData(s) + if sceneEx != nil { + if sceneEx.GetInit() { + s.SetExtraData(sceneEx) + s.ChangeSceneState(fortunetiger.FortuneTigerStateStart) + } + } +} + +// 场景关闭事件 +func (this *ScenePolicyFortuneTiger) OnStop(s *base.Scene) { + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnStop , sceneId=", s.GetSceneId()) +} + +// 场景心跳事件 +func (this *ScenePolicyFortuneTiger) OnTick(s *base.Scene) { + if s == nil { + return + } + if s.GetSceneState() != nil { + s.GetSceneState().OnTick(s) + } +} + +// 玩家进入事件 +func (this *ScenePolicyFortuneTiger) OnPlayerEnter(s *base.Scene, p *base.Player) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnPlayerEnter, sceneId=", s.GetSceneId(), " player=", p.Name) + if sceneEx, ok := s.GetExtraData().(*FortuneTigerSceneData); ok { + playerEx := &FortuneTigerPlayerData{Player: p} + + playerEx.init() + + d := p.GameData[fortunetiger.GameDataKey] + if d != nil { + m := make(map[string]string) + json.Unmarshal(d.Data.([]byte), &m) + playerEx.PullPlayer(m) + } else { + m := make(map[string]string) + //json.Unmarshal(d.Data.([]byte), &m) + playerEx.PullPlayer(m) + } + + playerEx.SlotsSession.SetCoin(playerEx.Coin * fortunetiger.NowByte) + + playerEx.Clear() + + sceneEx.players[p.SnId] = playerEx + + p.SetExtraData(playerEx) + FortuneTigerSendRoomInfo(s, sceneEx, playerEx) + + s.FirePlayerEvent(p, base.PlayerEventEnter, nil) + } +} + +// 玩家离开事件 +func (this *ScenePolicyFortuneTiger) OnPlayerLeave(s *base.Scene, p *base.Player, reason int) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnPlayerLeave, sceneId=", s.GetSceneId(), " player=", p.SnId) + if playerEx, ok := p.ExtraData.(*FortuneTigerPlayerData); ok { + m := playerEx.PushPlayer() + if m != nil && len(m) > 0 { + b, err := json.Marshal(m) + if err != nil { + logger.Logger.Error("OnPlayerLeave, json.Marshal error:", err) + } else { + p.GameData[fortunetiger.GameDataKey] = &model.PlayerGameData{ + Platform: p.Platform, + SnId: p.SnId, + Id: fortunetiger.GameDataKey, + Data: b, + } + } + } + } + if sceneEx, ok := s.ExtraData.(*FortuneTigerSceneData); ok { + s.FirePlayerEvent(p, base.PlayerEventLeave, nil) + sceneEx.OnPlayerLeave(p, reason) + } +} + +// 玩家掉线 +func (this *ScenePolicyFortuneTiger) OnPlayerDropLine(s *base.Scene, p *base.Player) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnPlayerDropLine, sceneId=", s.GetSceneId(), " player=", p.SnId) + s.FirePlayerEvent(p, base.PlayerEventDropLine, nil) +} + +// 玩家重连 +func (this *ScenePolicyFortuneTiger) OnPlayerRehold(s *base.Scene, p *base.Player) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnPlayerRehold, sceneId=", s.GetSceneId(), " player=", p.SnId) + if sceneEx, ok := s.GetExtraData().(*FortuneTigerSceneData); ok { + if playerEx, ok := p.GetExtraData().(*FortuneTigerPlayerData); ok { + FortuneTigerSendRoomInfo(s, sceneEx, playerEx) + } + } +} + +// 返回房间 +func (this *ScenePolicyFortuneTiger) OnPlayerReturn(s *base.Scene, p *base.Player) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnPlayerReturn, GetSceneId()=", s.GetSceneId(), " player=", p.Name) + if sceneEx, ok := s.GetExtraData().(*FortuneTigerSceneData); ok { + if playerEx, ok := p.GetExtraData().(*FortuneTigerPlayerData); ok { + //if p.IsMarkFlag(base.PlayerState_Auto) { + // p.UnmarkFlag(base.PlayerState_Auto) + // p.SyncFlag() + //} + //发送房间信息给自己 + FortuneTigerSendRoomInfo(s, sceneEx, playerEx) + s.FirePlayerEvent(p, base.PlayerEventReturn, nil) + } + } +} + +func FortuneTigerSendRoomInfo(s *base.Scene, sceneEx *FortuneTigerSceneData, playerEx *FortuneTigerPlayerData) { + pack := FortuneTigerCreateRoomInfoPacket(s, sceneEx, playerEx) + logger.Logger.Trace("RoomInfo: ", pack) + playerEx.SendToClient(int(protocol.FortuneTigerPID_PACKET_FORTUNETIGER_SCFORTUNETIGERROOMINFO), pack) +} +func FortuneTigerCreateRoomInfoPacket(s *base.Scene, sceneEx *FortuneTigerSceneData, playerEx *FortuneTigerPlayerData) interface{} { + //房间信息 + pack := &protocol.SCFortuneTigerRoomInfo{ + RoomId: s.SceneId, + GameId: s.GameId, + RoomMode: s.SceneMode, + SceneType: s.GetSceneType(), + Params: common.CopySliceInt64ToInt32(s.Params), + NumOfGames: proto.Int(sceneEx.NumOfGames), + State: proto.Int(s.SceneState.GetState()), + ParamsEx: s.GetDBGameFree().OtherIntParams, + GameFreeId: proto.Int32(s.GetDBGameFree().Id), + //BetLimit: s.GetDBGameFree().BetLimit, + } + + //自己的信息 + if playerEx != nil { + pd := &protocol.FortuneTigerPlayerData{ + SnId: proto.Int32(playerEx.SnId), + Name: proto.String(playerEx.Name), + Head: proto.Int32(playerEx.Head), + Sex: proto.Int32(playerEx.Sex), + Coin: proto.Int64(playerEx.Coin), + Pos: proto.Int(playerEx.Pos), + Flag: proto.Int(playerEx.GetFlag()), + City: proto.String(playerEx.City), + HeadOutLine: proto.Int32(playerEx.HeadOutLine), + VIP: proto.Int32(playerEx.VIP), + } + pack.Player = pd + } + + //get data + Response, err := slots.SlotsMgrSington.Enter(playerEx.SlotsSession, int64(s.GameId)) + if err == nil { + data := assemble.DataToCli(Response).(assemble.TableInfo) + pi, _ := json.Marshal(data) + pack.PlayerInfo = string(pi) + if sceneEx.BetConfig == nil { + sceneEx.BetConfig = &data.BetConfig + } + } else { + logger.Logger.Error("slots enter err:", err) + } + proto.SetDefaults(pack) + return pack +} +func (this *ScenePolicyFortuneTiger) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { + if s == nil || p == nil { + return false + } + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnPlayerOp, sceneId=", s.GetSceneId(), " player=", p.SnId, " opcode=", opcode, " params=", params) + if s.GetSceneState() != nil { + if s.GetSceneState().OnPlayerOp(s, p, opcode, params) { + p.SetLastOPTimer(time.Now()) + return true + } + return false + } + return true +} + +func (this *ScenePolicyFortuneTiger) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneTiger) OnPlayerEvent, sceneId=", s.GetSceneId(), " player=", p.SnId, " eventcode=", evtcode, " params=", params) + if s.GetSceneState() != nil { + s.GetSceneState().OnPlayerEvent(s, p, evtcode, params) + } +} + +// 当前状态能否换桌 +func (this *ScenePolicyFortuneTiger) CanChangeCoinScene(s *base.Scene, p *base.Player) bool { + if s == nil || p == nil { + return false + } + if s.GetSceneState() != nil { + return s.GetSceneState().CanChangeCoinScene(s, p) + } + return false +} + +// 状态基类 +type SceneBaseStateFortuneTiger struct { +} + +func (this *SceneBaseStateFortuneTiger) GetTimeout(s *base.Scene) int { + if sceneEx, ok := s.GetExtraData().(*FortuneTigerSceneData); ok { + return int(time.Now().Sub(sceneEx.GetStateStartTime()) / time.Second) + } + return 0 +} + +func (this *SceneBaseStateFortuneTiger) CanChangeTo(s base.SceneState) bool { + return true +} + +// 当前状态能否换桌 +func (this *SceneBaseStateFortuneTiger) CanChangeCoinScene(s *base.Scene, p *base.Player) bool { + return true +} +func (this *SceneBaseStateFortuneTiger) OnEnter(s *base.Scene) { + if sceneEx, ok := s.GetExtraData().(*FortuneTigerSceneData); ok { + sceneEx.SetStateStartTime(time.Now()) + } +} + +func (this *SceneBaseStateFortuneTiger) OnLeave(s *base.Scene) {} +func (this *SceneBaseStateFortuneTiger) OnTick(s *base.Scene) { + if time.Now().Sub(s.GameStartTime) > time.Second*3 { + if sceneEx, ok := s.ExtraData.(*FortuneTigerSceneData); ok { + for _, p := range sceneEx.players { + if p.IsOnLine() { + p.leaveTime = 0 + continue + } + p.leaveTime++ + if p.leaveTime < 60*2 { + continue + } + //踢出玩家 + sceneEx.PlayerLeave(p.Player, common.PlayerLeaveReason_LongTimeNoOp, true) + } + } + s.GameStartTime = time.Now() + } +} +func (this *SceneBaseStateFortuneTiger) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { + return false +} +func (this *SceneBaseStateFortuneTiger) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) { +} + +// //////////////////////////////////////////////////////////// +// 开始状态 +// //////////////////////////////////////////////////////////// +type SceneStateStartFortuneTiger struct { + SceneBaseStateFortuneTiger +} + +func (this *SceneStateStartFortuneTiger) GetState() int { + return fortunetiger.FortuneTigerStateStart +} + +func (this *SceneStateStartFortuneTiger) CanChangeTo(s base.SceneState) bool { + return false +} + +// 当前状态能否换桌 +func (this *SceneStateStartFortuneTiger) CanChangeCoinScene(s *base.Scene, p *base.Player) bool { + if playerEx, ok := p.GetExtraData().(*FortuneTigerPlayerData); ok { + if playerEx.isRespin { + return false + } + } + return true +} + +func (this *SceneStateStartFortuneTiger) GetTimeout(s *base.Scene) int { + return 0 +} + +func (this *SceneStateStartFortuneTiger) OnEnter(s *base.Scene) { + this.SceneBaseStateFortuneTiger.OnEnter(s) + if sceneEx, ok := s.GetExtraData().(*FortuneTigerSceneData); ok { + sceneEx.SetGameNowTime(time.Now()) + } +} + +// 状态离开时 +func (this *SceneStateStartFortuneTiger) OnLeave(s *base.Scene) { + this.SceneBaseStateFortuneTiger.OnLeave(s) + logger.Logger.Tracef("(this *SceneStateStartFortuneTiger) OnLeave, sceneid=%v", s.GetSceneId()) +} + +// 玩家操作 +func (this *SceneStateStartFortuneTiger) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { + logger.Logger.Tracef("(this *SceneStateStartFortuneTiger) OnPlayerOp, sceneid=%v params=%v", s.GetSceneId(), params) + if this.SceneBaseStateFortuneTiger.OnPlayerOp(s, p, opcode, params) { + return true + } + if sceneEx, ok := s.GetExtraData().(*FortuneTigerSceneData); ok { + if playerEx, ok := p.GetExtraData().(*FortuneTigerPlayerData); ok { + switch opcode { + case fortunetiger.FortuneTigerPlayerOpStart: + playerEx.Clear() + if len(params) < 3 { + pack := &protocol.SCFortuneTigerBilled{ + OpRetCode: proto.Int32(1), + } + proto.SetDefaults(pack) + logger.Logger.Trace("SCFortuneTigerBilled", pack.String()) + playerEx.SendToClient(int(protocol.FortuneTigerPID_PACKET_FORTUNETIGER_SCFORTUNETIGERBILLED), pack) + return true + } + playerEx.BetSizeIndex = params[0] + playerEx.BetLevelIndex = params[1] + playerEx.BetLineIndex = params[2] + //playerEx.BetMode = params[3] + needCoin := sceneEx.BetConfig.BetSize[params[0]] * float64(sceneEx.BetConfig.BetLevel[params[1]]) * + float64(sceneEx.BetConfig.BetLines[params[2]]) + if needCoin > float64(playerEx.Coin) { + pack := &protocol.SCFortuneTigerBilled{ + OpRetCode: proto.Int32(1), + } + proto.SetDefaults(pack) + logger.Logger.Trace("SCFortuneTigerBilled:", pack.String()) + playerEx.SendToClient(int(protocol.FortuneTigerPID_PACKET_FORTUNETIGER_SCFORTUNETIGERBILLED), pack) + return true + } + + //playerEx.SlotsSession.SetCoin(playerEx.Coin * fortunetiger.NowByte) + //logger.Logger.Trace("=============init dif coin", playerEx.Coin-playerEx.SlotsSession.Coin()/fortunetiger.NowByte) + + //get data + Response, err := slots.SlotsMgrSington.Play(playerEx.SlotsSession, &base.SpinReq{ + GameId: int64(sceneEx.GameId), + BetSizeIndex: playerEx.BetSizeIndex, + BetLevelIndex: playerEx.BetLevelIndex, + BetLineIndex: playerEx.BetLineIndex, + BetMode: playerEx.BetMode, + Ts: time.Now().Unix(), + }) + var gameEndStr string + var data assemble.GameEnd + if err == nil { + data = assemble.DataToCli(Response).(assemble.GameEnd) + var respinStatus int + if data.Results[0].ArrSpins[0].Special != nil { + respinStatus = data.Results[0].ArrSpins[0].Special.(SpinLock).ReSpinStatus + } + if respinStatus == 0 || respinStatus == 1 { + //第一次触发或者正常模式 + //logger.Logger.Trace("=============addcoin1111 ", -data.TotalBet) + playerEx.AddCoin(int64(-data.TotalBet), common.GainWay_HundredSceneLost, base.SyncFlag_ToClient, "system", s.GetSceneName()) + playerEx.totalBet = int64(data.TotalBet) + //logger.Logger.Trace("=======bet======dif++++ ", float64(playerEx.Coin)-data.BetAfterCoin) + } + var taxCoin float64 + if data.RoundReward > 0 { + //税收比例 + taxRate := sceneEx.GetDBGameFree().GetTaxRate() + if taxRate < 0 || taxRate > 10000 { + taxRate = 500 + } + taxCoin = data.RoundReward * float64(taxRate) / 10000 + data.RoundReward = data.RoundReward - taxCoin + playerEx.AddServiceFee(int64(taxCoin)) + playerEx.taxCoin = int64(taxCoin) + playerEx.winCoin = int64(data.RoundReward) + } + pi, _ := json.Marshal(data) + gameEndStr = string(pi) + if respinStatus == 0 || respinStatus == 3 { + //logger.Logger.Trace("===win==========addcoin222 ", data.RoundReward) + playerEx.AddCoin(int64(data.RoundReward), common.GainWay_HundredSceneWin, 0, "system", s.GetSceneName()) + //logger.Logger.Trace("=======win======dif++++ ", float64(playerEx.Coin)-data.FinalCoin) + //免费游戏结束或者正常模式 + sceneEx.StaticsLaba(&base.StaticLabaParam{ + SnId: playerEx.SnId, + Gain: int64(data.RoundReward - data.TotalBet), + GainTax: int64(taxCoin), + IsAddTimes: true, + }) + } + if respinStatus == 0 || respinStatus == 3 { + playerEx.isRespin = false + } else { + playerEx.isRespin = true + } + } else { + logger.Logger.Error("slots Play err:", err) + } + + playerEx.SlotsSession.SetCoin(int64(data.FinalCoin) * fortunetiger.NowByte) + + //logger.Logger.Trace("======end=======init dif coin", playerEx.Coin-playerEx.SlotsSession.Coin()/fortunetiger.NowByte) + + if playerEx.Coin != int64(data.FinalCoin) { + logger.Logger.Error("==========playerEx.Coin != data.FinalCoin==============", (float64(playerEx.Coin)-data.FinalCoin)/10000) + } + pack := &protocol.SCFortuneTigerBilled{ + OpRetCode: proto.Int32(0), + GameEndStr: proto.String(gameEndStr), + } + proto.SetDefaults(pack) + logger.Logger.Trace("SCFortuneTigerBilled", pack.String()) + playerEx.SendToClient(int(protocol.FortuneTigerPID_PACKET_FORTUNETIGER_SCFORTUNETIGERBILLED), pack) + + // 记录本次操作 + FortuneTigerAndSaveLog(sceneEx, playerEx, data) + } + } + } + return true +} + +// 玩家事件 +func (this *SceneStateStartFortuneTiger) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) { + logger.Logger.Trace("(this *SceneStateStartFortuneTiger) OnPlayerEvent, sceneId=", s.GetSceneId(), " player=", p.SnId, " evtcode=", evtcode) + this.SceneBaseStateFortuneTiger.OnPlayerEvent(s, p, evtcode, params) +} + +func (this *SceneStateStartFortuneTiger) OnTick(s *base.Scene) { + this.SceneBaseStateFortuneTiger.OnTick(s) +} + +// ////////////////////////////////////////////////////////////////////////////// +func (this *ScenePolicyFortuneTiger) RegisteSceneState(state base.SceneState) { + if state == nil { + return + } + stateid := state.GetState() + if stateid < 0 || stateid >= fortunetiger.FortuneTigerStateMax { + return + } + this.states[stateid] = state +} + +func (this *ScenePolicyFortuneTiger) GetSceneState(s *base.Scene, stateid int) base.SceneState { + if stateid >= 0 && stateid < fortunetiger.FortuneTigerStateMax { + return this.states[stateid] + } + return nil +} +func FortuneTigerAndSaveLog(sceneEx *FortuneTigerSceneData, playerEx *FortuneTigerPlayerData, data assemble.GameEnd) { + if !playerEx.IsRob { + data.SnId = playerEx.SnId + info, err := model.MarshalGameNoteByROLL(data) + if err == nil { + logid, _ := model.AutoIncGameLogId() + playerEx.currentLogId = logid + sceneEx.SaveGameDetailedLog(logid, info, &base.GameDetailedParam{}) + totalin := playerEx.totalBet + totalout := int64(data.RoundReward) + playerEx.taxCoin + validFlow := totalin + totalout + validBet := common.AbsI64(totalin - totalout) + logParam := &base.SaveGamePlayerListLogParam{ + Platform: playerEx.Platform, + Channel: playerEx.Channel, + Promoter: playerEx.BeUnderAgentCode, + PackageTag: playerEx.PackageID, + InviterId: playerEx.InviterId, + LogId: logid, + TotalIn: totalin, + TotalOut: totalout, + TaxCoin: playerEx.taxCoin, + BetAmount: playerEx.totalBet, + WinAmountNoAnyTax: int64(data.RoundReward) + playerEx.taxCoin, + ValidBet: validBet, + ValidFlow: validFlow, + IsFirstGame: sceneEx.IsPlayerFirst(playerEx.Player), + } + sceneEx.SaveGamePlayerListLog(playerEx.SnId, logParam) + } + } + + //统计输下注金币数 + if !sceneEx.Testing && !playerEx.IsRob { + playerBet := &server.PlayerData{ + SnId: proto.Int32(playerEx.SnId), + Bet: proto.Int64(playerEx.CurrentBet), + Gain: proto.Int64(int64(data.RoundReward) + playerEx.taxCoin), + Tax: proto.Int64(playerEx.taxCoin), + Coin: proto.Int64(playerEx.GetCoin()), + GameCoinTs: proto.Int64(playerEx.GameCoinTs), + } + gwPlayerBet := &server.GWPlayerData{ + SceneId: sceneEx.SceneId, + GameFreeId: proto.Int32(sceneEx.GetDBGameFree().GetId()), + } + gwPlayerBet.Datas = append(gwPlayerBet.Datas, playerBet) + sceneEx.SyncPlayerDatas(&base.PlayerDataParam{ + HasRobotGaming: false, + Data: gwPlayerBet, + }) + } + + playerEx.taxCoin = 0 + playerEx.winCoin = 0 + + if sceneEx.CheckNeedDestroy() && data.Results[0].FreeNum <= 0 { + sceneEx.SceneDestroy(true) + } +} +func init() { + //主状态 + ScenePolicyFortuneTigerSington.RegisteSceneState(&SceneStateStartFortuneTiger{}) + core.RegisteHook(core.HOOK_BEFORE_START, func() error { + base.RegisteScenePolicy(common.GameId_FortuneTiger, fortunetiger.RoomMode_Classic, ScenePolicyFortuneTigerSington) + return nil + }) +}