lobby.cpp
3.45 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
#include "lobby.h"
#include "gateway.h"
#include <service.h>
#include "user.h"
#include <lobby_gateway.pb.h>
#include "pet.h"
lobby_t* g_lobby;
lobby_t::lobby_t() : el::lib_timer_base_t(g_timer){
g_gateway_mgr = new gateway_mgr_t;
g_user_mgr = new user_mgr_t;
g_pet_cfg_mgr = new pet_cfg_mgr_t;
g_eff_cfg_mgr = new eff_cfg_mgr_t;
this->pet_key = 0;
{//timer
this->add_sec_event(lobby_t::time_out_one_sec, NULL, el_async::get_now_sec() + 1);
}
}
void lobby_t::release(){
SAFE_DELETE(g_gateway_mgr);
SAFE_DELETE(g_user_mgr);
SAFE_DELETE(g_pet_cfg_mgr);
SAFE_DELETE(g_eff_cfg_mgr);
}
int lobby_t::time_out_one_sec( void* owen, void* data ){
g_lobby->add_sec_event(lobby_t::time_out_one_sec, NULL, g_timer->now_sec()+1);
return 0;
}
// struct pet_t {
// PET_ID id;
// int ack;
// int hp;
// };
// 桌子上牌 [2019/2/19 Administrator]
void table_update(user_t* user, share_msg::btl_table_update_t* out){
out->set_uid(user->user_show.uid());
if (BTL_TABLE_PET_CNT_MAX <= user->pet_mgr.table_pet_vec.size()){
return ;
}
if (user->pet_mgr.pet_vec.empty()){
return ;
}
user->pet_mgr.table_pet_vec.push_back(user->pet_mgr.pet_vec[0]);
share_msg::pet_btl_t* pb = out->add_pet_btl();
pb->CopyFrom(user->pet_mgr.pet_vec[0].pet_btl);
//删除等待中的牌
user->pet_mgr.pet_vec.erase(user->pet_mgr.pet_vec.begin());
}
// 战斗 [2019/2/12 Administrator]
void lobby_t::btl( room_t* room )
{
static const int ACK_IDX = 0;
static const int DEF_IDX = 1;
lobby_gateway_msg::notify_game_end_msg_res out;
share_msg::btl_t* out_btl = out.mutable_btl();
//初始状态
{
FOREACH(room->user_vec, it_user){
user_t* user = *it_user;
share_msg::btl_user_t* btl_user = out_btl->add_btl_user();
btl_user->CopyFrom(user->user_show);
for (pet_t& r : user->pet_mgr.pet_vec){
share_msg::pet_btl_t* pb = btl_user->add_pet_btl();
pb->CopyFrom(r.pet_btl);
}
}
}
while (
(!room->ack()->pet_mgr.table_pet_vec.empty() || !room->ack()->pet_mgr.pet_vec.empty())
&& (!room->def()->pet_mgr.table_pet_vec.empty() || !room->def()->pet_mgr.pet_vec.empty())
){
share_msg::btl_round_t* out_btl_round = out_btl->add_btl_round();
share_msg::btl_ack_t* out_btl_buf = out_btl_round->add_btl_buf();
{
FOREACH(room->user_vec, it_user){
user_t* user = *it_user;
room->round_update_buf(user, out_btl_round);
}
room->update_room_pets(out_btl_buf);
}
//向桌子上放牌
{
FOREACH(room->user_vec, it_user){
user_t* user = *it_user;
table_update(user, out_btl_round->add_btl_table_update());
}
room->update_room_pets(out_btl_buf);
}
{
room->ack()->kaichang(room->def(), out_btl_round);
room->ack()->xianfa(room->def(), out_btl_round);
room->ack()->zhudong(room->def(), out_btl_round);
}
{
room->def()->kaichang(room->ack(), out_btl_round);
room->def()->xianfa(room->ack(), out_btl_round);
room->def()->zhudong(room->ack(), out_btl_round);
}
}
bool win_ack = true;
if (room->ack()->pet_mgr.table_pet_vec.empty() && room->ack()->pet_mgr.pet_vec.empty()){
win_ack = false;
}
if (win_ack){
out_btl->set_win_uid(room->ack()->user_show.uid());
} else {
out_btl->set_win_uid(room->def()->user_show.uid());
}
{
FOREACH(room->user_vec, it_user){
user_t* user = *it_user;
user->gateway->send_msg(lobby_gateway_notify_game_end_msg_cmd, &out, 0, user->user_show.uid());
}
}
}
int lobby_t::init()
{
if (!g_pet_cfg_mgr->load_cfg()){
ALERT_LOG("g_pet_cfg_mgr->load_cfg()");
return ERR;
}
return SUCC;
}