tablesink_banker.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package gamelogic
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "bet24.com/log"
  6. "bet24.com/servers/games/masharie_table/common"
  7. userservices "bet24.com/servers/micros/userservices/proto"
  8. )
  9. func (ts *tablesink) sendApplyBankerFailed(userIndex int32, errorMsg string) {
  10. ts.table.SendGameData(userIndex, ApplyFailed, errorMsg)
  11. }
  12. func (ts *tablesink) broadcastBankerInfo() {
  13. d, _ := json.Marshal(ts.bankerInfo)
  14. ts.table.SendGameData(-1, BankerInfo, string(d))
  15. }
  16. func (ts *tablesink) onApplyBanker(userIndex int32, userId int, msg, data string) {
  17. log.Debug("tablesink_banker.onApplyBanker %d %d", userIndex, userId)
  18. added, err := ts.addBanker(userIndex, userId)
  19. if !added {
  20. ts.sendApplyBankerFailed(userIndex, err)
  21. return
  22. }
  23. ts.broadcastBankerInfo()
  24. }
  25. func (ts *tablesink) onCancelBanker(userIndex int32, userId int, msg string) {
  26. if ts.removeCandidate(userId) {
  27. ts.broadcastBankerInfo()
  28. return
  29. }
  30. // 如果是庄家,则需要等待游戏结束
  31. if userId != ts.bankerInfo.UserId {
  32. return
  33. }
  34. if ts.roomInfo.State == common.GameState_Bet {
  35. ts.forceChangeBanker = true
  36. return
  37. }
  38. // 直接切换庄家
  39. if ts.changeBanker(true) {
  40. ts.broadcastBankerInfo()
  41. }
  42. }
  43. func (ts *tablesink) addBanker(userIndex int32, userId int) (bool, string) {
  44. if ts.roomInfo.BankerMin == 0 {
  45. return false, "not applicable"
  46. }
  47. // 本身就是庄家?
  48. if userId == ts.bankerInfo.UserId {
  49. return false, "already banker"
  50. }
  51. // 本身在列表
  52. for _, candidate := range ts.bankerInfo.Candidates {
  53. if candidate.UserId == userId {
  54. return false, "already in line"
  55. }
  56. }
  57. // 钱够不够?
  58. usr := ts.table.GetUserByUserId(userId)
  59. if usr == nil {
  60. log.Debug("tablesink_banker.addBanker invalid user %d", userId)
  61. return false, "invalid user"
  62. }
  63. userGold := ts.table.GetUserChipOrGoldByUserId(userId)
  64. if userGold < ts.roomInfo.BankerMin {
  65. log.Debug("tablesink_banker.addBanker %d %d", userGold, ts.roomInfo.BankerMin)
  66. return false, "not enough gold"
  67. }
  68. take := userGold
  69. // 添加到庄家列表
  70. ts.bankerInfo.Candidates = append(ts.bankerInfo.Candidates, common.BankerCandidate{
  71. BankerProfile: common.BankerProfile{
  72. UserId: userId,
  73. NickName: usr.GetUserNickName(),
  74. FaceId: usr.GetUserFaceId(),
  75. FaceUrl: usr.GetUserFaceUrl(),
  76. VipLevel: usr.GetUserVipLevel(),
  77. VipExpire: usr.GetUserVipExpire(),
  78. Decorations: usr.GetDecorations(),
  79. },
  80. Take: take,
  81. })
  82. return true, ""
  83. }
  84. func (ts *tablesink) checkBankerQuality() {
  85. changed := false
  86. // 清理列表中钱不够的
  87. for i := 0; i < len(ts.bankerInfo.Candidates); {
  88. candidate := ts.bankerInfo.Candidates[i]
  89. usr := ts.table.GetUserByUserId(candidate.UserId)
  90. userGold := ts.table.GetUserChipOrGoldByUserId(candidate.UserId)
  91. if usr == nil || userGold < ts.roomInfo.BankerMin {
  92. changed = true
  93. ts.bankerInfo.Candidates = append(ts.bankerInfo.Candidates[:i], ts.bankerInfo.Candidates[i+1:]...)
  94. continue
  95. } else {
  96. i++
  97. }
  98. }
  99. defer func() {
  100. if !changed {
  101. return
  102. }
  103. log.Debug("checkBankerQuality changed banker info new banker : %d", ts.bankerInfo.UserId)
  104. //ts.lock.Lock()
  105. //当前测试可以不刷新榜单
  106. //ts.score_users.LuckyStarUsers = ts.userList.getLuckyStarUsers(5, ts.bankerInfo.UserId)
  107. //ts.score_users.WinGoldRankingUsers = ts.userList.getWinGoldRankingUsers(3, ts.bankerInfo.UserId)
  108. //log.Debug("users %v,%v", ts.score_users.LuckyStarUsers, ts.score_users.WinGoldRankingUsers)
  109. //ts.lock.Unlock()
  110. ts.broadcastBankerInfo()
  111. }()
  112. if ts.forceChangeBanker {
  113. ts.forceChangeBanker = false
  114. changed = ts.changeBanker(true)
  115. return
  116. }
  117. // 当前庄家是否需要切换
  118. if ts.bankerInfo.UserId == -1 && len(ts.bankerInfo.Candidates) == 0 {
  119. // 没有庄家也没有候选者
  120. return
  121. }
  122. if ts.bankerInfo.UserId != -1 {
  123. banker := ts.table.GetUserByUserId(ts.bankerInfo.UserId)
  124. // 庄家不够钱
  125. if banker == nil || ts.bankerInfo.Gold < ts.roomInfo.BankruptcyAmount {
  126. changed = ts.changeBanker(true)
  127. return
  128. }
  129. // 局数已满
  130. if ts.bankerInfo.SetCount >= ts.roomInfo.MaxBankerSet && ts.roomInfo.MaxBankerSet != 0 {
  131. changed = ts.changeBanker(false)
  132. return
  133. }
  134. } else {
  135. // 没有庄家,但有候选人?
  136. changed = ts.changeBanker(false)
  137. }
  138. }
  139. func (ts *tablesink) updateBankerGold() {
  140. ts.table.WriteUserMoney(ts.bankerInfo.UserId, ts.bankerInfo.Gold, 0, 2, 8+common.GAMEID*100, ts.roomInfo.RoomName)
  141. ts.table.WriteUserMoney(ts.bankerInfo.UserId, -ts.bankerInfo.Gold, 0, 2, 9+common.GAMEID*100, ts.roomInfo.RoomName)
  142. }
  143. // 切换庄家
  144. func (ts *tablesink) changeBanker(force bool) bool {
  145. ts.forceChangeBanker = false
  146. if !force && len(ts.bankerInfo.Candidates) == 0 {
  147. return false
  148. }
  149. // 如果有上一个庄家,则把剩余分数写回去
  150. if ts.bankerInfo.UserId != -1 {
  151. go ts.table.WriteUserMoney(ts.bankerInfo.UserId, ts.bankerInfo.Gold, ts.bankerInfo.Tax, 2, 7+common.GAMEID*100, ts.roomInfo.RoomName)
  152. winRate := 1.00
  153. // 写betlist
  154. go ts.table.WriteBetRecordWithPlayTime(ts.bankerInfo.UserId,
  155. ts.bankerInfo.Gold-ts.bankerInfo.Score,
  156. ts.bankerInfo.Gold,
  157. winRate,
  158. fmt.Sprintf("banker(%d)", ts.bankerInfo.Gold-ts.bankerInfo.Score), "banker result", ts.roomInfo.RoomName, ts.roomInfo.BetTime)
  159. go gs.setOfflineStatus(ts.bankerInfo.UserId, false, 0, false)
  160. }
  161. // 强制切换
  162. newBanker := ts.raiseCandidate()
  163. if newBanker == nil {
  164. log.Debug("gamesink.changeBanker raiseCandidate failed")
  165. ts.bankerInfo.Gold = 0
  166. ts.bankerInfo.UserId = -1
  167. ts.bankerInfo.NickName = ""
  168. ts.bankerInfo.FaceId = -1
  169. ts.bankerInfo.FaceUrl = ""
  170. ts.bankerInfo.VipLevel = 0
  171. ts.bankerInfo.VipExpire = 0
  172. ts.bankerInfo.Decorations = []userservices.UserDecoration{}
  173. ts.bankerInfo.Score = 0
  174. ts.bankerInfo.SetCount = 0
  175. ts.bankerInfo.Tax = 0
  176. return true
  177. }
  178. userGold := ts.table.GetUserChipOrGoldByUserId(newBanker.UserId)
  179. newBanker.Take = userGold
  180. // 庄家先扣分
  181. b, _ := ts.table.WriteUserMoney(newBanker.UserId, -userGold, 0, 2, 6+common.GAMEID*100, ts.roomInfo.RoomName)
  182. if !b {
  183. return false
  184. }
  185. ts.bankerInfo.Gold = userGold
  186. ts.bankerInfo.UserId = newBanker.UserId
  187. ts.bankerInfo.NickName = newBanker.NickName
  188. ts.bankerInfo.FaceId = newBanker.FaceId
  189. ts.bankerInfo.FaceUrl = newBanker.FaceUrl
  190. ts.bankerInfo.VipLevel = newBanker.VipLevel
  191. ts.bankerInfo.VipExpire = newBanker.VipExpire
  192. ts.bankerInfo.Decorations = newBanker.Decorations
  193. ts.bankerInfo.Score = 0
  194. ts.bankerInfo.SetCount = 0
  195. go gs.setOfflineStatus(ts.bankerInfo.UserId, true, 0, false)
  196. return true
  197. }
  198. func (ts *tablesink) raiseCandidate() *common.BankerCandidate {
  199. if len(ts.bankerInfo.Candidates) == 0 {
  200. //log.Debug("换庄失败%v", ts.bankerInfo.Candidates)
  201. return nil
  202. }
  203. ret := &ts.bankerInfo.Candidates[0]
  204. ts.bankerInfo.Candidates = ts.bankerInfo.Candidates[1:]
  205. return ret
  206. }
  207. func (ts *tablesink) removeCandidate(userId int) bool {
  208. for i := 0; i < len(ts.bankerInfo.Candidates); {
  209. candidate := ts.bankerInfo.Candidates[i]
  210. if userId == candidate.UserId {
  211. ts.bankerInfo.Candidates = append(ts.bankerInfo.Candidates[:i], ts.bankerInfo.Candidates[i+1:]...)
  212. return true
  213. } else {
  214. i++
  215. }
  216. }
  217. return false
  218. }