347 lines
10 KiB
Go
347 lines
10 KiB
Go
package smallrocket
|
|
|
|
import (
|
|
"time"
|
|
|
|
"mongo.games.com/goserver/core/logger"
|
|
|
|
"mongo.games.com/game/common"
|
|
rule "mongo.games.com/game/gamerule/smallrocket"
|
|
"mongo.games.com/game/gamesrv/base"
|
|
"mongo.games.com/game/proto"
|
|
"mongo.games.com/game/protocol/smallrocket"
|
|
)
|
|
|
|
type PlayerData struct {
|
|
SnId int32
|
|
Head int32 //头像框
|
|
VIP int32 //VIP帐号 等级
|
|
Name string //名字
|
|
Sex int32 //性别
|
|
IsRob bool
|
|
|
|
Coin int64
|
|
gainCoin int64 //本局赢的金币
|
|
taxCoin int64 //本局税收
|
|
isBilled bool //是否结算
|
|
CurIsWin int64 //当局输赢 负数:输 正数:赢
|
|
|
|
InviterId int32 //邀请人Id
|
|
BeUnderAgentCode string //隶属经销商(推广人)
|
|
CurBetData []*rule.BetDataEx // 本局的下注信息
|
|
IsPlayerFirst bool
|
|
|
|
Platform string //平台
|
|
Channel string //渠道信息
|
|
PackageID string //推广包标识 对应客户端的packagetag
|
|
flag int
|
|
}
|
|
|
|
type SceneEx struct {
|
|
*base.Scene // 场景
|
|
logic *rule.Logic // 小火箭算法
|
|
players map[int32]*PlayerEx // 玩家信息
|
|
PlayerBackup map[int32]*PlayerData // 本局离场玩家数据备份
|
|
seats []*PlayerEx // 本局游戏中的玩家状态数据
|
|
|
|
TotalBetPlayer int // 本局下注人数
|
|
NextTotalBetPlayers int // 下局投注人数
|
|
gamePlayerNum int // 参与游戏人数
|
|
BoomMul float64 // 本局火箭飞行爆炸倍数
|
|
BombRandomNum int // 本局火箭飞行随机数
|
|
startTime time.Duration // 本局开始时间
|
|
bombTime time.Duration // 本局火箭爆炸时间
|
|
|
|
HistoryBombMul *rule.SequentialQueue // 房间历史爆炸倍数记录
|
|
|
|
RoundId int // 局数,第几局
|
|
robotNum int // 参与游戏的机器人数量
|
|
logid string
|
|
}
|
|
|
|
// 游戏是否能开始
|
|
func (this *SceneEx) CanStart() bool {
|
|
//人数>=1自动开始
|
|
if len(this.players) >= 0 && (this.GetRealPlayerNum() >= 0 || this.IsPreCreateScene()) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// 从房间删除玩家
|
|
func (this *SceneEx) delPlayer(p *base.Player) {
|
|
if p, exist := this.players[p.SnId]; exist {
|
|
this.seats[p.GetPos()] = nil
|
|
delete(this.players, p.SnId)
|
|
}
|
|
}
|
|
|
|
// 广播玩家离开
|
|
func (this *SceneEx) BroadcastPlayerLeave(p *base.Player, reason int) {
|
|
scLeavePack := &smallrocket.SCSmallRocketPlayerLeave{
|
|
Pos: proto.Int(p.GetPos()),
|
|
}
|
|
proto.SetDefaults(scLeavePack)
|
|
|
|
this.Broadcast(int(smallrocket.SmallRocketPacketID_PACKET_SC_SMALLROCKET_PlayerLeave), scLeavePack, p.GetSid())
|
|
}
|
|
|
|
// 玩家离开事件
|
|
func (this *SceneEx) OnPlayerLeave(p *base.Player, reason int) {
|
|
this.delPlayer(p)
|
|
this.BroadcastPlayerLeave(p, reason)
|
|
}
|
|
func (this *SceneEx) SceneDestroy(force bool) {
|
|
//销毁房间
|
|
this.Scene.Destroy(force)
|
|
}
|
|
|
|
func (e *SceneEx) playerOpPack(snId int32, opcode int, opRetCode smallrocket.OpResultCode, params []int64, betDataInfo []*rule.BetDataEx) *smallrocket.SCSmallRocketOp {
|
|
pack := &smallrocket.SCSmallRocketOp{
|
|
SnId: proto.Int32(snId),
|
|
OpCode: proto.Int32(int32(opcode)),
|
|
Params: params,
|
|
OpRetCode: smallrocket.OpResultCode_OPRC_Success,
|
|
}
|
|
|
|
if betDataInfo != nil {
|
|
for i := 0; i < len(betDataInfo); i++ {
|
|
|
|
tempBetEml := &smallrocket.BetDataInfo{
|
|
BetVal: proto.Int64(betDataInfo[i].BetVal),
|
|
TakeMul: proto.Float32(float32(betDataInfo[i].TakeMul)),
|
|
IsCurBet: proto.Bool(betDataInfo[i].IsCurBet),
|
|
IsNextBet: proto.Bool(betDataInfo[i].IsNextBet),
|
|
IsTakeGain: proto.Bool(betDataInfo[i].IsTakeGain),
|
|
IsAutoBetAndTake: proto.Bool(betDataInfo[i].IsAutoBetAndTake),
|
|
}
|
|
|
|
pack.BetDataArr = append(pack.BetDataArr, tempBetEml)
|
|
}
|
|
}
|
|
proto.SetDefaults(pack)
|
|
return pack
|
|
}
|
|
|
|
// OnPlayerSCOp 发送玩家操作情况
|
|
func (e *SceneEx) OnPlayerSCOp(p *base.Player, opcode int, opRetCode smallrocket.OpResultCode, params []int64, betDataInfo []*rule.BetDataEx) {
|
|
pack := e.playerOpPack(p.SnId, opcode, opRetCode, params, betDataInfo)
|
|
p.SendToClient(int(smallrocket.SmallRocketPacketID_PACKET_SC_SMALLROCKET_PLAYEROP), pack)
|
|
logger.Logger.Tracef("OnPlayerSCOp %s", pack)
|
|
}
|
|
|
|
func (this *SceneEx) SubBetPlayerNum() {
|
|
this.TotalBetPlayer--
|
|
if this.TotalBetPlayer < 0 {
|
|
this.TotalBetPlayer = 0
|
|
}
|
|
}
|
|
|
|
// 房间信息打包
|
|
func (this *SceneEx) SamllRocketCreateRoomInfoPacket(s *base.Scene, p *base.Player) interface{} {
|
|
pack := &smallrocket.SCSmallRocketRoomInfo{
|
|
RoomId: proto.Int(s.GetSceneId()),
|
|
GameId: proto.Int(s.GetGameId()),
|
|
RoomMode: proto.Int(s.GetSceneMode()),
|
|
Params: common.CopySliceInt64ToInt32(s.Params),
|
|
State: proto.Int(s.GetSceneState().GetState()),
|
|
TimeOut: proto.Int(s.GetSceneState().GetTimeout(s)),
|
|
BombMul: proto.Float32(float32(0)),
|
|
BombRandomNum: proto.Int(0),
|
|
TotalPlayer: proto.Int(len(this.players)),
|
|
RoundId: proto.Int(this.RoundId),
|
|
TotalBetPlayer: proto.Int(this.TotalBetPlayer),
|
|
ParamsEx: nil,
|
|
GameFreeId: 0,
|
|
BaseScore: proto.Int32(this.GetBaseScore()),
|
|
}
|
|
|
|
// 历史积分添加
|
|
if this.HistoryBombMul != nil {
|
|
hisBoomMul := this.HistoryBombMul.GetFloat64Items()
|
|
for i := 0; i < len(hisBoomMul); i++ {
|
|
pack.RoundBoomMuHistory = append(pack.RoundBoomMuHistory, float32(hisBoomMul[i]))
|
|
}
|
|
}
|
|
|
|
// 玩家信息
|
|
for _, playerEx := range this.players {
|
|
|
|
if p.SnId == playerEx.SnId {
|
|
pd := &smallrocket.SmallRocketPlayerData{
|
|
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),
|
|
Flag: proto.Int(playerEx.GetFlag()),
|
|
HeadOutLine: proto.Int32(playerEx.HeadOutLine),
|
|
VIP: proto.Int32(playerEx.VIP),
|
|
|
|
WinCoin: proto.Int64(playerEx.gainCoin),
|
|
}
|
|
|
|
if playerEx.betData != nil {
|
|
for i := 0; i < len(playerEx.betData); i++ {
|
|
|
|
tempBetEml := &smallrocket.BetDataInfo{
|
|
BetVal: proto.Int64(playerEx.betData[i].BetVal),
|
|
TakeMul: proto.Float32(float32(playerEx.betData[i].TakeMul)),
|
|
IsCurBet: proto.Bool(playerEx.betData[i].IsCurBet),
|
|
IsNextBet: proto.Bool(playerEx.betData[i].IsNextBet),
|
|
IsTakeGain: proto.Bool(playerEx.betData[i].IsTakeGain),
|
|
IsAutoBetAndTake: proto.Bool(playerEx.betData[i].IsAutoBetAndTake),
|
|
}
|
|
|
|
pd.BetDataArr = append(pd.BetDataArr, tempBetEml)
|
|
}
|
|
}
|
|
pack.Players = append(pack.Players, pd)
|
|
}
|
|
}
|
|
|
|
//// 备份的玩家信息
|
|
//for _, playerEx := range this.PlayerBackup {
|
|
// if playerEx != nil {
|
|
// continue
|
|
// }
|
|
//
|
|
// pd := &smallrocket.SmallRocketPlayerData{
|
|
// 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),
|
|
// Flag: proto.Int(playerEx.flag),
|
|
// VIP: proto.Int32(playerEx.VIP),
|
|
//
|
|
// WinCoin: proto.Int64(playerEx.gainCoin),
|
|
// }
|
|
//
|
|
// if s.SceneState.GetState() == rule.SmallRocketSceneStateBilled {
|
|
// pd.WinCoin = playerEx.gainCoin
|
|
// }
|
|
//
|
|
// // 下注信息
|
|
// if playerEx.betData != nil {
|
|
// for i := 0; i < len(playerEx.betData); i++ {
|
|
//
|
|
// tempBetEml := &smallrocket.BetDataInfo{
|
|
// BetVal: proto.Int64(playerEx.betData[i].BetVal),
|
|
// TakeMul: proto.Float32(float32(playerEx.betData[i].TakeMul)),
|
|
// IsCurBet: proto.Bool(playerEx.betData[i].IsCurBet),
|
|
// IsNextBet: proto.Bool(playerEx.betData[i].IsNextBet),
|
|
// IsTakeGain: proto.Bool(playerEx.betData[i].IsTakeGain),
|
|
// IsAutoBetAndTake: proto.Bool(playerEx.betData[i].IsAutoBetAndTake),
|
|
// }
|
|
//
|
|
// pd.BetDataArr = append(pd.BetDataArr, tempBetEml)
|
|
// }
|
|
// }
|
|
//
|
|
// pack.Players = append(pack.Players, pd)
|
|
//}
|
|
|
|
proto.SetDefaults(pack)
|
|
if p != nil {
|
|
p.SyncFlag()
|
|
}
|
|
|
|
logger.Logger.Trace("SCSmallRocketRoomInfo:", pack)
|
|
return pack
|
|
}
|
|
|
|
func NewSmallRocketSceneData(s *base.Scene) *SceneEx {
|
|
sceneEx := &SceneEx{
|
|
Scene: s,
|
|
logic: new(rule.Logic),
|
|
players: make(map[int32]*PlayerEx),
|
|
seats: make([]*PlayerEx, s.GetPlayerNum()),
|
|
PlayerBackup: make(map[int32]*PlayerData),
|
|
HistoryBombMul: rule.NewSequentialQueue(5),
|
|
}
|
|
|
|
return sceneEx
|
|
}
|
|
|
|
func (this *SceneEx) init() bool {
|
|
this.Clear()
|
|
//this.logic.CalBoomTime(rule.SmallRocketBombMulMaxE)
|
|
return true
|
|
}
|
|
|
|
func (this *SceneEx) GetBaseScore() int32 { //游戏底分
|
|
if this.DbGameFree != nil {
|
|
return this.DbGameFree.GetBaseScore()
|
|
}
|
|
return 1
|
|
}
|
|
|
|
func (this *SceneEx) GetBetMaxCoin() int32 { //游戏底分
|
|
if this.DbGameFree != nil {
|
|
return this.DbGameFree.GetBaseScore() * 10000
|
|
}
|
|
return 1 * 10000
|
|
}
|
|
|
|
// 检查下注是否合法
|
|
func (this *SceneEx) CheckBetOp(betVal int64, takeMul int64) bool { //游戏底分
|
|
|
|
if betVal <= 0 || takeMul < rule.SmallRocketPlayerTakeMulMax {
|
|
return false
|
|
}
|
|
|
|
if betVal < int64(this.GetBaseScore()) || betVal > int64(this.GetBetMaxCoin()) {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (this *SceneEx) Clear() {
|
|
this.gamePlayerNum = 0
|
|
this.robotNum = 0
|
|
this.BoomMul = 0
|
|
|
|
this.bombTime = 0
|
|
this.BombRandomNum = rule.SmallRocketPlayerTransDataMul
|
|
this.startTime = rule.SmallRocketSceneStartTimeout
|
|
|
|
this.PlayerBackup = make(map[int32]*PlayerData)
|
|
|
|
this.TotalBetPlayer = 0
|
|
this.NextTotalBetPlayers = 0
|
|
this.HistoryBombMul.Clear()
|
|
this.RoundId = 0
|
|
|
|
for i := 0; i < this.GetPlayerNum(); i++ {
|
|
if this.seats[i] != nil {
|
|
this.seats[i].Clear(this.GetBaseScore())
|
|
}
|
|
}
|
|
}
|
|
|
|
func (this *SceneEx) BackupPlayer(p *PlayerEx, isBilled bool) {
|
|
this.PlayerBackup[p.SnId] = &PlayerData{
|
|
SnId: p.SnId,
|
|
gainCoin: p.gainCoin,
|
|
taxCoin: p.taxCoin,
|
|
isBilled: isBilled,
|
|
IsRob: p.IsRob,
|
|
Coin: p.Coin,
|
|
Head: p.Head,
|
|
flag: p.GetFlag(),
|
|
Platform: p.Platform,
|
|
Channel: p.Channel,
|
|
PackageID: p.PackageID,
|
|
CurIsWin: p.CurIsWin,
|
|
Name: p.Name,
|
|
Sex: p.Sex,
|
|
VIP: p.VIP,
|
|
InviterId: p.InviterId,
|
|
IsPlayerFirst: this.IsPlayerFirst(p.Player),
|
|
BeUnderAgentCode: p.BeUnderAgentCode,
|
|
CurBetData: p.CurBetData,
|
|
}
|
|
}
|