room.cpp 4 KB
#include "room.h"
#include "gateway.h"
#include <lobby_gateway.pb.h>
#include "lobby.h"
#include <common_msg.pb.h>

std::vector<PET_KEY> room_t::del_die(share_msg::btl_ack_t* out_btl_ack)
{
	std::vector<PET_KEY> del_pet_key_vec;
	{
		FOREACH(this->user_vec, it_user){
			std::vector<pet_t> add_table_vec;
			user_t* user = *it_user;
			auto it = user->pet_mgr.table_pet_vec.begin();
			for (;user->pet_mgr.table_pet_vec.end() != it;){
				pet_t* pet = *it;
				if (pet->is_die()){
					pet->die(out_btl_ack, add_table_vec);
					del_pet_key_vec.push_back(pet->key());
					SAFE_DELETE(pet);
					it = user->pet_mgr.table_pet_vec.erase(it);
				} else {
					it++;
				}
			}
			FOREACH(add_table_vec, it_add){
				pet_t& pet = *it_add;
				if (BTL_TABLE_PET_CNT_MAX <= user->pet_mgr.table_pet_vec.size()){
					break;
				}
				user->pet_mgr.push_back_on_table(out_btl_ack, pet);
			}
		}
	}
	return del_pet_key_vec;
}

std::vector<PET_KEY> room_t::update_room_pets( share_msg::btl_ack_t* out_btl_ack )
{
	std::vector<PET_KEY> del_pet_key_vec;
	do {
		std::vector<buf_t> del_buf_vec;
		// 移除位置相关的被动技能 buf [2019/3/7 Administrator]	

		{
			FOREACH(this->user_vec, it_user){
				user_t* user = *it_user;
				FOREACH(user->pet_mgr.table_pet_vec, it_pet){
					pet_t* pet = *it_pet;
					if (pet->is_die()){
						continue;
					}
					
					auto it_buf = pet->buf.begin();
					for(;pet->buf.end() != it_buf;){
						buf_t& buf = *it_buf;
						if (200 <= buf.id && buf.id< 300){
							del_buf_vec.push_back(buf);
							it_buf++;
						} else {
							it_buf++;
						}
					}
				}
			}
		}
		std::vector<buf_t> add_buf_vec;
		//2.重新计算位置相关的被动技能	

		{
			FOREACH(this->user_vec, it_user){
				user_t* user = *it_user;
				FOREACH(user->pet_mgr.table_pet_vec, it_pet){
					pet_t* pet = *it_pet;
					if (pet->is_die()){
						continue;
					}
					
					std::vector<buf_t> m;
					switch (pet->get_eff_id())
					{
					case 303:
						m = pet->beidong_303(out_btl_ack, pet);
						break;
					case 304:
						m = pet->beidong_304(out_btl_ack, pet);
						break;
					case 305:
						m = pet->beidong_305(out_btl_ack, pet);
						break;
					case 307:
						m = pet->beidong_307(out_btl_ack, pet);
						break;
					case 308:
						m = pet->beidong_308(out_btl_ack, pet);
						break;
					case 309:
						m = pet->beidong_309(out_btl_ack, pet);
						break;
					case 310:
						m = pet->beidong_310(out_btl_ack, pet);
						break;
					case 311:
						m = pet->beidong_311(out_btl_ack, pet);
						break;
					case 312:
						m = pet->beidong_312(out_btl_ack, pet);
						break;
					case 322:
						m = pet->beidong_322(out_btl_ack, pet);
						break;
					case 325:
						m = pet->beidong_325(out_btl_ack, pet);
						break;
					default:
						break;
					}
					add_buf_vec.insert(add_buf_vec.end(), m.begin(), m.end());
				}
			}
		}

		{
			std::vector<BUF_KEY> del_buf_key_vec;
			{
				for(auto it_del = del_buf_vec.begin();del_buf_vec.end() != it_del;){
					buf_t& del_buf = *it_del;

					for(auto it_add = add_buf_vec.begin();add_buf_vec.end() != it_add;){
						buf_t& add_buf = *it_add;
						if (del_buf.param3 == add_buf.param3 && del_buf.id == add_buf.id){
							it_add = add_buf_vec.erase(it_add);
							del_buf_key_vec.push_back(del_buf.key);
						} else {
							it_add++;
						}
					}
					it_del++;
				}
				for(auto it_del = del_buf_vec.begin();del_buf_vec.end() != it_del;){
					buf_t& del_buf = *it_del;
					if (del_buf_key_vec.end() != std::find(del_buf_key_vec.begin(), del_buf_key_vec.end(), del_buf.key)){
						it_del = del_buf_vec.erase(it_del);
					} else {
						it_del++;
					}
				}
			}

			FOREACH(del_buf_vec, it_del){
				buf_t& buf = *it_del;
				
				buf.pet->del_buf_by_key(out_btl_ack, buf.key);
			}
			FOREACH(add_buf_vec, it_add){
				buf_t& buf = *it_add;
				buf.pet->add_buf(out_btl_ack, buf);
			}
		}
	} while (!this->del_die(out_btl_ack).empty());

	return del_pet_key_vec;
}

user_t* room_t::ack()
{
	return this->user_vec[0];
}

user_t* room_t::def()
{
	return this->user_vec[1];
}