十三张开牌前允许加入游戏

This commit is contained in:
sk 2024-11-22 14:24:59 +08:00
parent 72ffbf9da3
commit 3840ec99a2
4 changed files with 89 additions and 33 deletions

View File

@ -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)

View File

@ -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 {

View File

@ -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
View File

@ -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