logic.go
5.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
package main
import (
"common/beegomap"
"common/logger"
// "fmt"
"log"
"math/rand"
"net"
"time"
)
type RoomInfo struct {
rid uint32
ids []uint32
}
const (
STATE_PLAYER_INIT = 0 //init
STATE_PLAYER_LOGINED = 1 //after login
STATE_PLAYER_ENTERED = 2 //in room
STATE_PLAYER_ON_TABLE = 3 //on table
STATE_PLAYER_ON_TABLE_SitDown = 4 //sit down
STATE_PLAYER_ON_TABLE_SitOut = 5 //sit out
BUYIN_AMOUNT = 1000
Min_Message_Size = 16
)
type PlayerInfo struct {
uid uint32
rid uint32
seq uint32
conn net.Conn
isHost bool
state uint32
leftMoney uint32
buyin uint32
ActionSeq int32
roundBet uint32
seatid int32
startRecordSeq bool
recordSeq int
valid bool
lastCheckTime int64
enterStateTime int64
isObserver bool
}
var (
m_map_rooms *beegomap.BeeMap
m_map_players *beegomap.BeeMap
m_map_club_creater *beegomap.BeeMap
)
func init() {
m_map_rooms = beegomap.NewBeeMap()
m_map_players = beegomap.NewBeeMap()
m_map_club_creater = beegomap.NewBeeMap()
}
func Start(roomcount, invertal int) {
//init all host player & conn
InitAllHost(roomcount)
HostLogin(invertal)
}
func InitAllHost(roomcount int) {
for i:=0;i<roomcount;i++ {
uid := i
conn := getTcpClient(uint32(uid))
var player PlayerInfo
player.uid = uint32(uid)
player.rid = 0
player.conn = conn
player.isHost = true
m_map_players.Set(uint32(uid), &player)
m_map_club_creater.Set(uint32(uid), &player)
log.Println("m_map_players.Set(uint32(uid), &player)-player.isHost:", player.isHost)
break
}
}
func HostLogin(interval int) {
items := m_map_players.Items()
for _, v := range items {
player := v.(*PlayerInfo)
SendLogin(player)
StartPlayer(player)
time.Sleep(time.Duration(interval))
}
}
func StartPlayer(player *PlayerInfo) {
go clientRecvLoop(player)
}
func GetPlayer(uid uint32) *PlayerInfo {
v := m_map_players.Get(uid)
if v == nil {
logger.Info("get uid:%+v but not found playerid", uid)
return nil
}
player := v.(*PlayerInfo)
return player
}
func removePlayerFromRoom(uid, rid uint32) {
v := m_map_rooms.Get(rid)
if v == nil {
return
}
rm := v.(*RoomInfo)
for i, id := range rm.ids {
if uint32(id) == uid {
rm.ids = append(rm.ids[0:i], rm.ids[i+1:]...)
break
}
}
}
func checkPlayer(player *PlayerInfo) {
if player.isObserver {
checkObserver(player)
return
}
now := time.Now().Unix()
if now < player.lastCheckTime+5 || player.valid == false || player.rid <= 0 {
return
}
player.lastCheckTime = now
RandomGet(player)
//if RandomGet(player) {
// return
//}
switch player.state {
case STATE_PLAYER_INIT:
return
case STATE_PLAYER_LOGINED:
// ActionWhenLogined(player)
return
case STATE_PLAYER_ENTERED:
ActionWhenEntered(player)
return
case STATE_PLAYER_ON_TABLE_SitDown:
ActionWhenSitDown(player)
case STATE_PLAYER_ON_TABLE_SitOut:
ActionWhenSitout(player)
default:
return
}
}
func ActionWhenEntered(player *PlayerInfo) {
//已经从桌上站起来了,随机 退出房间 或者坐下
now := time.Now().Unix()
if now < player.enterStateTime+20 {
return
}
r := rand.Intn(1000)
if r < 100 {
//exit room
logger.Info("Checking.......rid:%v uid:%d entered goto leave room", player.rid, player.uid)
//SendLeaveRoomRequest(player)
} else if r < 900 {
//sit down
logger.Info("Checking.......rid:%v uid:%d entered goto sitdown", player.rid, player.uid)
//SendSitDown(player)
} else {
//do nothing
}
}
func ActionWhenSitDown(player *PlayerInfo) {
//已经坐下,随机站起,退出房间或者sitout
now := time.Now().Unix()
if now < player.enterStateTime+120 {
return
}
r := rand.Intn(1000)
if r < 50 {
//standup
logger.Info("Checking.......rid:%v uid:%d sitdown goto standup", player.rid, player.uid)
//SendStandupRequest(player)
} else if r < 100 {
//exit room
logger.Info("Checking.......rid:%v uid:%d sitdown goto leave room", player.rid, player.uid)
//SendLeaveRoomRequest(player)
} else if r < 150 {
//sitout
logger.Info("Checking.......rid:%v uid:%d sitdown goto sitout", player.rid, player.uid)
//SendSitoutRequest(player)
} else if r < 200 {
// force standup
//SendForceStandup(player)
} else if r < 250 {
//check out and leave (结算离桌)
//SendCheckoutAndLeave(player)
} else if r < 300 {
//send buy out
//SendBuyout(player)
} else {
//do nothing
}
}
func ActionWhenSitout(player *PlayerInfo) {
//已经sitout,随机站起,退出房间或坐回
now := time.Now().Unix()
if now < player.enterStateTime+5 {
return
}
r := rand.Intn(1000)
if r < 50 {
//sitout
logger.Info("Checking.......rid:%v uid:%d sitout goto standup", player.rid, player.uid)
//SendStandupRequest(player)
} else if r < 100 {
//exit room
logger.Info("Checking.......rid:%v uid:%d sitout goto leave room", player.rid, player.uid)
//SendLeaveRoomRequest(player)
} else if r < 900 {
//sit back
logger.Info("Checking.......rid:%v uid:%d sitout goto back position", player.rid, player.uid)
//SendBackPosition(player)
} else {
//do nothing
}
}
func RandomGet(player *PlayerInfo) bool {
// r := rand.Intn(1000)
// if r < 100 {
// //get room situation
// //SendRoomSituation(player)
// } else if r < 200 {
// //
// //DoInteractiveExpression(player)
// } else if r < 300 {
// //send chat
// //SendChat(player)
// } else if r < 400 {
// //get snapshot
// //SendSnapshotRequest(player)
// } else {
// //do nothing
// return false
// }
return true
}
func getRoomRandomSeatid(rid uint32) int32 {
v := m_map_rooms.Get(rid)
if v == nil {
return 0
}
room, _ := v.(*RoomInfo)
r := rand.Intn(len(room.ids))
if r < 0 {
return -1
}
uid := room.ids[r]
p := m_map_players.Get(uid)
player, _ := p.(*PlayerInfo)
return player.seatid
}