十三张开牌前允许加入游戏
This commit is contained in:
parent
72ffbf9da3
commit
3840ec99a2
|
@ -26,6 +26,7 @@ func (sm *SlotsMgr) Update() {
|
|||
|
||||
func (sm *SlotsMgr) Shutdown() {
|
||||
plugin.Close()
|
||||
module.UnregisteModule(sm)
|
||||
}
|
||||
func init() {
|
||||
module.RegisteModule(SlotsMgrSington, time.Hour, 0)
|
||||
|
|
|
@ -84,6 +84,8 @@ type SceneEx struct {
|
|||
testPokers []int64 // 测试牌堆
|
||||
logid string
|
||||
ctrlType int // 1控赢 2控输 0不控
|
||||
cardsArr [][13]int
|
||||
cardsGroup []map[int]*rule.Group
|
||||
}
|
||||
|
||||
func NewThirteenWaterSceneData(s *base.Scene) *SceneEx {
|
||||
|
@ -125,6 +127,8 @@ func (this *SceneEx) Clear() {
|
|||
this.PlayerBackup = make(map[int32]*PlayerData)
|
||||
this.LeaveNum = 0
|
||||
this.ctrlType = 0
|
||||
this.cardsArr = nil
|
||||
this.cardsGroup = nil
|
||||
|
||||
for i := 0; i < this.GetPlayerNum(); i++ {
|
||||
if this.seats[i] != nil {
|
||||
|
@ -520,10 +524,9 @@ func (this *SceneEx) GetScore(player *PlayerEx) {
|
|||
}
|
||||
}
|
||||
|
||||
// 发送玩家的所有牌和所有牌型
|
||||
func (this *SceneEx) SendToPlayerCards(s *base.Scene) {
|
||||
func (this *SceneEx) SendToPlayerCardsBySnid(snid int32) {
|
||||
for _, player := range this.players {
|
||||
if player != nil && player.IsGameing() {
|
||||
if player != nil && player.IsGameing() && (snid == 0 || player.SnId == snid) {
|
||||
all, k := AllGroupToProto(player.allGroup)
|
||||
pack := &thirteen.SCThirteenPlayerCards{
|
||||
Cards: common.CopySliceIntToInt32(player.cards[:]),
|
||||
|
@ -554,7 +557,7 @@ func (this *SceneEx) SendToPlayerCards(s *base.Scene) {
|
|||
}
|
||||
proto.SetDefaults(Send)
|
||||
logger.Logger.Trace("SCThirteenWaterPlayerCards:", Send)
|
||||
s.Broadcast(int(thirteen.TWMmoPacketID_PACKET_SCThirteenPlayerCards), Send, player.GetSid())
|
||||
this.Broadcast(int(thirteen.TWMmoPacketID_PACKET_SCThirteenPlayerCards), Send, player.GetSid())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1351,11 +1354,11 @@ func (this *SceneEx) SendHandCardOdds() {
|
|||
|
||||
this.poker.Init()
|
||||
|
||||
cardsArr := make([][13]int, this.poker.N*4)
|
||||
cardsGroup := make([]map[int]*rule.Group, this.poker.N*4)
|
||||
for k := range cardsArr {
|
||||
cardsArr[k] = this.poker.Get13Crads()
|
||||
cardsGroup[k] = this.logic.Suggest(cardsArr[k])
|
||||
this.cardsArr = make([][13]int, this.poker.N*4)
|
||||
this.cardsGroup = make([]map[int]*rule.Group, this.poker.N*4)
|
||||
for k := range this.cardsArr {
|
||||
this.cardsArr[k] = this.poker.Get13Crads()
|
||||
this.cardsGroup[k] = this.logic.Suggest(this.cardsArr[k])
|
||||
}
|
||||
|
||||
f := func(players *[]*PlayerEx) {
|
||||
|
@ -1382,16 +1385,16 @@ func (this *SceneEx) SendHandCardOdds() {
|
|||
var group map[int]*rule.Group
|
||||
if p.odds > 0 {
|
||||
// 拿好牌
|
||||
cards = cardsArr[0]
|
||||
cardsArr = cardsArr[1:]
|
||||
group = cardsGroup[0]
|
||||
cardsGroup = cardsGroup[1:]
|
||||
cards = this.cardsArr[0]
|
||||
this.cardsArr = this.cardsArr[1:]
|
||||
group = this.cardsGroup[0]
|
||||
this.cardsGroup = this.cardsGroup[1:]
|
||||
} else {
|
||||
// 拿坏牌
|
||||
cards = cardsArr[len(cardsArr)-1]
|
||||
cardsArr = cardsArr[:len(cardsArr)-1]
|
||||
group = cardsGroup[len(cardsGroup)-1]
|
||||
cardsGroup = cardsGroup[:len(cardsGroup)-1]
|
||||
cards = this.cardsArr[len(this.cardsArr)-1]
|
||||
this.cardsArr = this.cardsArr[:len(this.cardsArr)-1]
|
||||
group = this.cardsGroup[len(this.cardsGroup)-1]
|
||||
this.cardsGroup = this.cardsGroup[:len(this.cardsGroup)-1]
|
||||
}
|
||||
p.cards = cards
|
||||
p.allGroup = group
|
||||
|
@ -1409,7 +1412,7 @@ func (this *SceneEx) SendHandCardOdds() {
|
|||
}
|
||||
if isGood || isBad {
|
||||
// 按从大到小排序
|
||||
this.cardsSort(cardsArr, cardsGroup)
|
||||
this.cardsSort(this.cardsArr, this.cardsGroup)
|
||||
|
||||
// 发好牌
|
||||
if isGood {
|
||||
|
@ -1431,10 +1434,10 @@ func (this *SceneEx) SendHandCardOdds() {
|
|||
if v == nil || !v.IsGameing() || v.cards[0] != -1 {
|
||||
continue
|
||||
}
|
||||
v.cards = cardsArr[0]
|
||||
v.allGroup = cardsGroup[0]
|
||||
cardsArr = cardsArr[1:]
|
||||
cardsGroup = cardsGroup[1:]
|
||||
v.cards = this.cardsArr[0]
|
||||
v.allGroup = this.cardsGroup[0]
|
||||
this.cardsArr = this.cardsArr[1:]
|
||||
this.cardsGroup = this.cardsGroup[1:]
|
||||
}
|
||||
|
||||
for _, player := range this.players {
|
||||
|
|
|
@ -85,7 +85,13 @@ func (this *PolicyThirteen) OnPlayerEnter(s *base.Scene, p *base.Player) {
|
|||
p.Pos = pos
|
||||
p.ExtraData = playerEx
|
||||
playerEx.Clear()
|
||||
if sceneEx.Gaming {
|
||||
if sceneEx.Gaming && sceneEx.GetSceneState().GetState() != rule.ThirteenWaterSceneStateSendCards &&
|
||||
sceneEx.GetSceneState().GetState() != rule.ThirteenWaterSceneStateOptCard { // 发牌,理牌阶段也可以加入本局游戏
|
||||
p.MarkFlag(base.PlayerState_WaitNext)
|
||||
p.UnmarkFlag(base.PlayerState_Ready)
|
||||
}
|
||||
if sceneEx.Gaming && sceneEx.GetSceneState().GetState() == rule.ThirteenWaterSceneStateOptCard &&
|
||||
int(rule.ThirteenWaterOptCardTimeout.Seconds())-s.GetSceneState().GetTimeout(s) < 15 {
|
||||
p.MarkFlag(base.PlayerState_WaitNext)
|
||||
p.UnmarkFlag(base.PlayerState_Ready)
|
||||
}
|
||||
|
@ -495,6 +501,27 @@ func (this *BaseState) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, par
|
|||
}
|
||||
|
||||
func (this *BaseState) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) {
|
||||
if sceneEx, ok := s.ExtraData.(*SceneEx); ok {
|
||||
switch evtcode {
|
||||
case base.PlayerEventLeave:
|
||||
case base.PlayerEventEnter:
|
||||
// 发牌和选牌阶段,给玩家发牌
|
||||
if s.GetSceneState().GetState() == rule.ThirteenWaterSceneStateSendCards ||
|
||||
s.GetSceneState().GetState() == rule.ThirteenWaterSceneStateOptCard {
|
||||
if p.IsGameing() {
|
||||
playerEx, ok := p.ExtraData.(*PlayerEx)
|
||||
if ok && len(sceneEx.cardsArr) > 0 && playerEx.cards[0] == -1 {
|
||||
playerEx.cards = sceneEx.cardsArr[0]
|
||||
playerEx.allGroup = sceneEx.cardsGroup[0]
|
||||
sceneEx.cardsArr = sceneEx.cardsArr[1:]
|
||||
sceneEx.cardsGroup = sceneEx.cardsGroup[1:]
|
||||
sceneEx.SendToPlayerCardsBySnid(p.SnId)
|
||||
logger.Logger.Tracef("游戏开始后给玩家发牌, sceneId=%v, player=%v, cards=%v", s.GetSceneId(), p.SnId, playerEx.cards)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=====================================
|
||||
|
@ -731,7 +758,7 @@ func (this *StateSendCard) OnEnter(s *base.Scene) {
|
|||
//}
|
||||
sceneEx.SendHandCardOdds()
|
||||
}
|
||||
sceneEx.SendToPlayerCards(s)
|
||||
sceneEx.SendToPlayerCardsBySnid(0)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1085,8 +1112,35 @@ func (this *StateShow) OnEnter(s *base.Scene) {
|
|||
logger.Logger.Tracef("(this *StateShow) OnEnter, sceneid=%v currpos:%v", s.GetSceneId(), sceneEx.currOpPos)
|
||||
sceneEx.ShowCards()
|
||||
// 每人看牌5秒,特殊牌型不算;
|
||||
var n int
|
||||
var has bool
|
||||
//var n int
|
||||
//var has bool
|
||||
//for _, v := range sceneEx.players {
|
||||
// if v != nil && v.IsGameing() && v.cardsO != nil {
|
||||
// n++
|
||||
// if v.cardsO.PokerType == 1 { // 有青龙
|
||||
// has = true
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//n -= sceneEx.specialTypeNum
|
||||
//sceneEx.specialTime = time.Second * time.Duration(n*5)
|
||||
//// pk动画 2秒
|
||||
//sceneEx.specialTime += time.Second * 2
|
||||
//// 特殊牌型 4.5秒;至尊青龙5.5秒
|
||||
//if sceneEx.specialTypeNum > 0 {
|
||||
// if has {
|
||||
// sceneEx.specialTime += time.Millisecond * 5500
|
||||
// } else {
|
||||
// sceneEx.specialTime += time.Millisecond * 4500
|
||||
// }
|
||||
//}
|
||||
|
||||
sceneEx.specialTime = 0
|
||||
// pk动画 2秒
|
||||
sceneEx.specialTime += time.Second * 2
|
||||
// 2人且有特殊牌型,直接播放特殊牌型动画'
|
||||
var n int // 玩家数量
|
||||
var has bool // 是否有青龙
|
||||
for _, v := range sceneEx.players {
|
||||
if v != nil && v.IsGameing() && v.cardsO != nil {
|
||||
n++
|
||||
|
@ -1095,18 +1149,16 @@ func (this *StateShow) OnEnter(s *base.Scene) {
|
|||
}
|
||||
}
|
||||
}
|
||||
n -= sceneEx.specialTypeNum
|
||||
sceneEx.specialTime = time.Second * time.Duration(n*5)
|
||||
// pk动画 2秒
|
||||
sceneEx.specialTime += time.Second * 2
|
||||
// 特殊牌型 4.5秒;至尊青龙5.5秒
|
||||
if sceneEx.specialTypeNum > 0 {
|
||||
if n == 2 && sceneEx.specialTypeNum > 0 {
|
||||
if has {
|
||||
sceneEx.specialTime += time.Millisecond * 5500
|
||||
} else {
|
||||
sceneEx.specialTime += time.Millisecond * 4500
|
||||
}
|
||||
} else {
|
||||
sceneEx.specialTime = time.Second * time.Duration(5)
|
||||
}
|
||||
|
||||
logger.Logger.Tracef("show cards: %v %v", n, sceneEx.specialTime)
|
||||
if sceneEx.specialTime <= 0 {
|
||||
sceneEx.specialTime = time.Second
|
||||
|
|
2
go.mod
2
go.mod
|
@ -31,7 +31,6 @@ require (
|
|||
go.etcd.io/etcd/client/v3 v3.5.16
|
||||
go.mongodb.org/mongo-driver v1.17.1
|
||||
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c
|
||||
google.golang.org/grpc v1.67.1
|
||||
google.golang.org/protobuf v1.35.1
|
||||
gorm.io/driver/mysql v1.5.7
|
||||
gorm.io/gorm v1.25.12
|
||||
|
@ -112,6 +111,7 @@ require (
|
|||
golang.org/x/time v0.7.0 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect
|
||||
google.golang.org/grpc v1.67.1 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
|
|
Loading…
Reference in New Issue