pet_turntable.cpp 4.17 KB
#include "pet_turntable.h"
#include "item.h"
#include "gateway.h"
#include "event.h"
#include "user.h"
#include <gateway_msg.pb.h>
#include "game_cfg.h"

pet_turntable_cfg_mgr_t* g_pet_turntable_cfg_mgr;

void pet_turntable_cfg_mgr_t::init()
{
	for (int i = 0; i < share_msg::E_PET_STAR_MAX; i++){
		this->star_map[i].clear();
	}
}

bool pet_turntable_cfg_mgr_t::load_cfg()
{
	const std::string cfg_path = "./cfg/pet_turntable.xml";

	el::lib_xmlparser_t xml;
	int ret = xml.open(cfg_path.c_str());
	if (SUCC != ret){
		ALERT_LOG("open");
		return false;
	}

	this->init();

	xml.move2children_node();

	{
		xmlNodePtr cur = xml.node_ptr;
		while (cur) {
			if (!xmlStrcmp(cur->name, (const xmlChar *)"star")) {
				uint32_t star_id = 0;
				xml.get_xml_prop(cur, star_id, "id");
				if (0 == g_pet_cfg_mgr->find_pet_cnt(star_id)){
					ALERT_LOG("");
					return false;
				}

				{
					xmlNodePtr child_cur = cur->xmlChildrenNode;
					while (child_cur) {
						if (!xmlStrcmp(child_cur->name, (const xmlChar *)"reward")) {
							pet_turntable_element_t ptre;

							xml.get_xml_prop(child_cur, ptre.id, "id");
							xml.get_xml_prop(child_cur, ptre.show, "show");
							xml.get_xml_prop(child_cur, ptre.pr, "pr");

							if (!this->star_map[star_id-1].insert(std::make_pair(ptre.id, ptre)).second) {
								ALERT_LOG("");
								return false;
							}
						}
						child_cur = child_cur->next;
					}//while
				}
			}
			cur = cur->next;
		}//while
	}
 	return true;
}

//////////////////////////////////////////////////////////////////////////

int gateway_t::on_get_pet_turntable_msg(el::lib_tcp_peer_info_t* peer_fd_info,
										 google::protobuf::Message* msg,
										 user_t* user)
{
	auto in = (gateway_msg::get_pet_turntable_msg*)msg;

	uint32_t star = in->star();

	common_msg::item_cfg_t* ic = g_item_cfg_mgr->find_key_by_star(star);
	if (NULL == ic){
		return 0;
	}

	// 4Ǽδ [2018/12/19 Administrator]	
	if (4 <= star){
		return 0;
	}
	
	
// 	if (!user->item_mgr.is_has_all(ic->id(), 1)){
// 		return 0;
// 	}

	user->pet_truntable_vec.clear();
	user->pet_turntable_key = star;

	std::map<uint32_t, pet_turntable_element_t>& r = g_pet_turntable_cfg_mgr->star_map[star-1];
	{
		FOREACH(r, it){
			pet_turntable_element_t& pte = it->second;
			std::vector<PET_ID>& r_pet_vec = g_pet_turntable_cfg_mgr->pet_vec[pte.id-1];
			std::random_shuffle(r_pet_vec.begin(), r_pet_vec.end());
			user->pet_truntable_vec.insert(user->pet_truntable_vec.end(), r_pet_vec.begin(), r_pet_vec.begin() + pte.show);
		}
	}

	{
		gateway_msg::get_pet_turntable_msg_res out;
		FOREACH(user->pet_truntable_vec, it){
			out.add_id(*it);
		}
		user->send_msg_res(&out);
	}
	return 0;
}

int gateway_t::on_get_pet_turntable_reward_msg(el::lib_tcp_peer_info_t* peer_fd_info,
										 google::protobuf::Message* msg,
										 user_t* user)
{
	if (user->pet_truntable_vec.empty() || 0 == user->pet_turntable_key){
		return 0;
	}
	common_msg::item_cfg_t* ic = g_item_cfg_mgr->find_key_by_star(user->pet_turntable_key);
	if (NULL == ic){
		return 0;
	}

	if (!user->item_mgr.is_has_all(ic->id(), 1)){
		return 0;
	}
	
	user->item_mgr.reduce(ic->id(), 1);

	std::map<uint32_t, pet_turntable_element_t>& r = g_pet_turntable_cfg_mgr->star_map[user->pet_turntable_key-1];
	uint32_t reward_star_id = 0;
	{
		uint32_t ran = el::lib_random_t::random(1,100);
		uint32_t ran_sum = 0;
		FOREACH(r, it){
			pet_turntable_element_t& pte = it->second;
			ran_sum += pte.pr;
			if (ran_sum < ran){
				continue;
			}
			reward_star_id = pte.id;
			break;
		}
	}

	std::vector<pet_cfg_t*> reward_pet_vec;
	{
		FOREACH(user->pet_truntable_vec, it){
			PET_ID pet_id = *it;
			pet_cfg_t* p = g_pet_cfg_mgr->find(pet_id);
			if (p->star == reward_star_id){
				reward_pet_vec.push_back(p);
			}
		}
	}
	std::random_shuffle(reward_pet_vec.begin(), reward_pet_vec.end());

	pet_cfg_t* reward_pet = reward_pet_vec[0];

	{
		gateway_msg::get_pet_turntable_reward_msg_res out;
		out.set_id(reward_pet->id);
		user->send_msg_res(&out);
	}

	share_msg::pet_t new_pet;
	new_pet.set_id(reward_pet->id);
	user->pet_mgr.add(new_pet);
	

	//user->pet_truntable_vec.clear();
	//user->pet_turntable_key = 0;

	user->task_mgr.listen_daily_task(share_msg::E_TASK_DAILY_TYPE_4, 1);
	return 0;
}