room_internal_handler.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package game
  2. import (
  3. "context"
  4. "github.com/davy66666/poker-go/src/github.com/davecgh/go-spew/spew"
  5. "github.com/golang/glog"
  6. "github.com/jinzhu/copier"
  7. "github.com/zeromicro/go-zero/core/logc"
  8. "log"
  9. "microGame/app/usercenter/cmd/api/internal/types"
  10. "microGame/pkg/result"
  11. "time"
  12. )
  13. func (r *Room) joinRoom(m *types.JoinRoom, o *Player) bool {
  14. ctx := context.Background()
  15. for k, v := range r.Players {
  16. logc.Info(ctx, v, o)
  17. if v.Uid == o.Uid {
  18. // todo 掉线重连现场数据替换处理
  19. o.Replace(r.Players[k])
  20. r.Players[k] = o
  21. if o != v {
  22. logc.Info(ctx, "掉线重连处理")
  23. } else {
  24. logc.Info(ctx, "同一个链接重复请求加入房间")
  25. }
  26. o.WriteMsg(result.WSError("join", types.MSG_ROOM_OVERVOLUME, -1002))
  27. return false
  28. }
  29. }
  30. userInfos := make([]*types.UserInfo, 0, r.Cap())
  31. r.Each(0, func(o *Player) bool {
  32. userinfo := &types.UserInfo{
  33. Nickname: o.Nickname,
  34. Uid: o.Uid,
  35. Username: o.Username,
  36. Sex: o.Sex,
  37. Profile: o.Profile,
  38. Chips: o.chips,
  39. Pos: o.Pos,
  40. }
  41. userInfos = append(userInfos, userinfo)
  42. return true
  43. })
  44. var pos uint8 = 0
  45. // 判断游戏是否开始 如果已经开始 用户只能先加入观察者 坐下失败转为旁观
  46. if r.status == 1 {
  47. pos = r.addObserve(o)
  48. } else {
  49. pos = r.addPlayer(o)
  50. }
  51. // 坐下成功
  52. if pos != 0 {
  53. userInfo := &types.UserInfo{
  54. Nickname: o.Nickname,
  55. Uid: o.Uid,
  56. Username: o.Username,
  57. Sex: o.Sex,
  58. Profile: o.Profile,
  59. Chips: o.chips,
  60. Pos: pos,
  61. }
  62. r.Broadcast(result.WSSuccess("join", &types.JoinRoomBroadcast{UserInfo: userInfo}), true, o.Uid)
  63. // 加入列表
  64. userInfos = append(userInfos, userInfo)
  65. }
  66. roomInfo := &types.RoomInfoResp{
  67. RoomNumber: r.RoomNumber,
  68. }
  69. //记录用户属于哪个room 防止数据丢失
  70. //o.UpdateRoomId()
  71. var resp []*types.UserInfoResp
  72. _ = copier.Copy(&resp, userInfos)
  73. // send message 推送 告诉当前加入room的用户 room里成员信息
  74. o.WriteMsg(result.WSSuccess("join", &types.JoinRoomResp{UserInfos: resp, RoomInfo: roomInfo}))
  75. time.AfterFunc(2*time.Second, func() {
  76. defer func() {
  77. if err := PrintPanicStack(); err != nil {
  78. logc.Errorf(context.Background(), "Recovered from panic: %v", err)
  79. }
  80. }()
  81. // 你的业务逻辑
  82. // r.WriteMsg(o, &startDelay{})
  83. })
  84. logc.Debugw(ctx, "joinRoom", logc.Field("key", spew.Sdump(m)))
  85. return true
  86. }
  87. func (r *Room) leaveAndRecycleChips(o *Player) {
  88. if r.removePlayer(o) > 0 {
  89. // 玩家站起回收带入筹码
  90. gap := o.chips - uint32(r.DraginChips)
  91. if gap == 0 {
  92. //数据库处理用户资金
  93. //o.UpdateChips(gap)
  94. }
  95. }
  96. }
  97. func (r *Room) LeaveRoom(m *types.LeaveRoom, o *Player) {
  98. r.removeObserve(o)
  99. r.removePlayer(o)
  100. r.leaveAndRecycleChips(o)
  101. o.RoomId = 0
  102. //数据库处理用户资金
  103. //o.UpdateRoomId()
  104. leave := &types.LeaveRoom{
  105. RoomNumber: r.RoomNumber,
  106. Uid: o.Uid,
  107. }
  108. r.Broadcast(result.WSSuccess("leave", leave), true)
  109. // 房间里没有玩家时关闭并从列表中删除
  110. if r.Len() == 0 {
  111. r.CloseRoomChannel()
  112. }
  113. glog.Errorln("leaveRoom", m)
  114. }
  115. func (r *Room) bet(m *types.WSMessage, o *Player) {
  116. if !o.IsGaming() {
  117. o.WriteMsg(result.WSSuccess("bet", types.MSG_NOT_NOT_START))
  118. return
  119. }
  120. data, ok := m.Data.(int)
  121. if !ok {
  122. log.Println("m.Data 不是 int 类型")
  123. return
  124. }
  125. if data < 0 {
  126. err := o.SetAction(-1)
  127. if err != nil {
  128. o.WriteMsg(result.WSSuccess("bet", types.MSG_NOT_TURN))
  129. }
  130. } else {
  131. err := o.SetAction(int32(data))
  132. if err != nil {
  133. o.WriteMsg(result.WSSuccess("bet", types.MSG_NOT_TURN))
  134. }
  135. }
  136. glog.Errorln("bet", m)
  137. }
  138. func (r *Room) sitDown(m *types.WSMessage, o *Player) {
  139. pos := r.addPlayer(o)
  140. if pos == 0 {
  141. // 给进入房间的玩家带入筹码
  142. o.chips = uint32(r.DraginChips)
  143. r.addObserve(o)
  144. } else {
  145. }
  146. r.Broadcast(result.WSSuccess("sitDown", &types.SitDown{Uid: o.Uid, Pos: o.Pos}), true)
  147. glog.Errorln("sitDown", m)
  148. }
  149. func (r *Room) standUp(m *types.WSMessage, o *Player) {
  150. err := o.SetAction(-1)
  151. if err != nil {
  152. return
  153. }
  154. r.leaveAndRecycleChips(o)
  155. r.addObserve(o)
  156. r.Broadcast(result.WSSuccess("standUp", &types.StandUp{Uid: o.Uid}), true)
  157. glog.Errorln("standUp", m)
  158. }
  159. func (r *Room) chat(m *types.Chat, o *Player) {
  160. r.Broadcast(result.WSSuccess("chat", m), true)
  161. }