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

turntable_reward_cfg_mgr_t* g_turntable_reward_cfg_mgr;

void turntable_reward_cfg_mgr_t::init()
{
	this->reward_map.clear();
}

bool turntable_reward_cfg_mgr_t::load_cfg()
{
	const std::string cfg_path = "./cfg/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 *)"reward")) {
			uint32_t id = 0;
			xml.get_xml_prop(cur, id, "id");
			turntable_reward_element_t bcre;
			xml.get_xml_prop(cur, bcre.pr, "pr");

			std::string str_def;
			std::string str_item;
			xml.get_xml_prop_def(cur, str_item, "item", str_def);

			std::vector<uint_pair> uint_pair_val;
			str_split_uint(str_item, uint_pair_val);
			FOREACH(uint_pair_val, it) {
				if (NULL == g_item_cfg_mgr->find(it->key)){
					ALERT_LOG("[item_id:%u]", it->key);
					return false;
				}
				share_msg::item_t item;
				item.set_id(it->key);
				item.set_cnt(it->val);
				bcre.reward_vec.push_back(item);
			}
			this->reward_map.insert(std::make_pair(id, bcre));
		}
		cur = cur->next;
	}//while

	uint32_t all_pr = 0;
	FOREACH(this->reward_map, it){
		turntable_reward_element_t& bcre = it->second;
// 		if (0 == bcre.pr){
// 			ALERT_LOG("[pr:0]");
// 			return false;
// 		}
		all_pr += bcre.pr;
	}
	if (1000 != all_pr){
		ALERT_LOG("[1000 != all_pr]");
		return false;
	}
	
 	return true;
}

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

int gateway_t::on_get_turntable_reward_msg(el::lib_tcp_peer_info_t* peer_fd_info,
										 google::protobuf::Message* msg,
										 user_t* user)
{
	//	DAILY_EVENT_TURNTABLE_CNT			= 10000006;//每日转盘数量,id:0, data:数量	
	event_t* e = user->event_mgr.find(common_msg::DAILY_EVENT_TURNTABLE_CNT);
	if (NULL != e){
		return share_msg::EC_VALUE_INVALID;
	}

	// 抽奖 	
	uint32_t id = 0;
	turntable_reward_element_t* bcre = NULL;
	uint32_t r = el::lib_random_t::random(1, 1000);
	uint32_t all_pr = 0;
	FOREACH(g_turntable_reward_cfg_mgr->reward_map, it_reward){
		turntable_reward_element_t& r_bcre = it_reward->second;
		all_pr += r_bcre.pr;
		if (r <= all_pr){
			id = it_reward->first;
			bcre = &r_bcre;
			break;
		}
	}

	user->event_mgr.update_event(user->uid(), common_msg::DAILY_EVENT_TURNTABLE_CNT, 0, 0, el::lib_time_t::tomorrow_start_time()-1);
	{
		gateway_msg::get_turntable_reward_msg_res out;
		out.set_id(id);
		user->send_msg_res(&out);
	}

	FOREACH(bcre->reward_vec, it_item){
		share_msg::item_t& item = *it_item;
		user->item_mgr.add(item.id(), item.cnt());
	}

	return 0;
}

int gateway_t::on_get_turntable_reward_and_login_reward_msg(el::lib_tcp_peer_info_t* peer_fd_info,
										   google::protobuf::Message* msg,
										   user_t* user)
{
	gateway_msg::get_turntable_reward_and_login_reward_msg_res out;
	{
		event_t* e = user->event_mgr.find(common_msg::DAILY_EVENT_TURNTABLE_CNT);
		if (NULL != e){
			out.set_turntable_get(1);
		}
	}

	uint32_t now_sec = el_async::get_now_sec();

	{
		uint16_t year = 0; 
		uint8_t month = 0;
		uint8_t day = 0;
		uint8_t hour = 0;
		uint8_t minute = 0;
		uint8_t second = 0;
		el::lib_time_t::cal_ymdhms(now_sec, year, month, day, hour, minute, second);

		auto it = user->login_reward_mgr.day_set.find(day);
		if (user->login_reward_mgr.day_set.end() == it){
			user->login_reward_mgr.day_set.insert(day);

			{//update event
				std::string str_data;
				FOREACH(user->login_reward_mgr.day_set, it){
					str_data += el::convert_to_string(*it);
					str_data += ",";
				}
				str_data.pop_back();
				user->event_mgr.update_event(user->uid(), common_msg::MONTHLY_EVENT_LOGIN, 0, 0, el::lib_time_t::next_month_start_time(now_sec)-1, str_data);
			}
		}

		FOREACH(user->login_reward_mgr.day_set, it){
			out.add_login(*it);
		}
	}

	{
		FOREACH(g_login_reward_cfg_mgr->login_reward_cfg_map, it){
			uint32_t reward_key = it->first;
			auto it_get_day = user->login_reward_mgr.day_get_reward_set.find(reward_key);
			if (user->login_reward_mgr.day_get_reward_set.end() != it_get_day){
				continue;
			}

			if (0 == reward_key){// 检查连续天数是否足够 	
				int cur_yyyymm = el::lib_time_t::get_date_yyyymm(now_sec);
				int next_yyyymm = el::lib_time_t::get_date_yyyymm(now_sec + el::lib_time_t::ONE_DAY_SEC);
				if (cur_yyyymm == next_yyyymm){
					continue;
				}

				uint16_t year = 0; 
				uint8_t month = 0;
				uint8_t day = 0;
				uint8_t hour = 0;
				uint8_t minute = 0;
				uint8_t second = 0;
				el::lib_time_t::cal_ymdhms(now_sec, year, month, day, hour, minute, second);

				if (user->login_reward_mgr.day_set.size() < day){
					continue;
				}
			} else {
				uint32_t cnt_max = el::g_serial_max_cnt(user->login_reward_mgr.day_set);

				if (cnt_max < reward_key){
					continue;
				}
			}

			user->login_reward_mgr.day_get_reward_set.insert(reward_key);

			out.set_get_reward(1);

			{
				std::string str_data;
				FOREACH(user->login_reward_mgr.day_get_reward_set, it){
					str_data += el::convert_to_string(*it);
					str_data += ",";
				}
				str_data.pop_back();
				user->event_mgr.update_event(user->uid(), common_msg::MONTHLY_EVENT_LOGIN_REWARD, 0, 0, el::lib_time_t::next_month_start_time(now_sec)-1, str_data);
			}

			{
				login_reward_cfg_t& lrc = it->second;

				FOREACH(lrc.reward_map, it_reward){
					user->item_mgr.add(it_reward->first, it_reward->second);
				}
			}
		}
	}

	FOREACH(user->login_reward_mgr.day_get_reward_set, it){
		out.add_login_reward(*it);
	}
	user->send_msg_res(&out);
	return 0;
}

int gateway_t::on_get_relief_msg(el::lib_tcp_peer_info_t* peer_fd_info,
										   google::protobuf::Message* msg,
										   user_t* user)
{
	return 0;
	//	DAILY_EVENT_TURNTABLE_CNT			= 10000006;//每日转盘数量,id:0, data:数量	
	EVENT_DATA ed = user->event_mgr.find_data(common_msg::DAILY_EVENT_RELIEF_CNT);
	if (g_game_cfg_mgr->daily_relief_cnt_max <= ed){
		return share_msg::EC_VALUE_INVALID;
	}
	
	if (g_game_cfg_mgr->daily_relief_money < user->item_mgr.get_item_cnt(share_msg::E_ITEM_ID_MONEY)){
		return share_msg::EC_VALUE_INVALID;
	}

	uint32_t add_cnt = 0;
	
	if (!user->is_vip_active()){
		add_cnt = g_game_cfg_mgr->daily_relief_reward;
	} else {
		add_cnt = g_game_cfg_mgr->daily_relief_reward_vip;
	}
	
	user->item_mgr.add(share_msg::E_ITEM_ID_MONEY, add_cnt);

	user->event_mgr.update_event(user->uid(), common_msg::DAILY_EVENT_RELIEF_CNT, 0, ++ed, el::lib_time_t::tomorrow_start_time()-1);

	{
		gateway_msg::get_relief_msg_res out;
		out.set_relief_cnt((uint32_t)(g_game_cfg_mgr->daily_relief_cnt_max - ed));
		user->send_msg_res(&out);
	}
	return 0;
}