lobby.cpp 3.45 KB
#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;
}