⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maingame.cpp

📁 网络泡泡被.net管理
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				m_array_player[i].m_scale	= SMALL_SCALE;
				m_index[i+1] = i;
				m_array_player[i].update_user_data(i+1, &m_map_user[player[i]]);
			}
			else
			{
				m_array_player[i].m_scale	= SMALL_SCALE;
				m_index[i]	= i;
				m_array_player[i].update_user_data(i, &m_map_user[player[i]]);
			}
		}
		if (is_playing)
		{
			SetMode(ENUM_GAME);
		}
	}
}

void MainGame::on_msg_add_user(STRUCT_ADD_USER *pData)
{
	if(pData==NULL)
		return;
	if(m_id_player==0)
	{
		m_id_player	= pData->uid;
		m_UI.Create("ui\\main_lobby.ini");
		m_is_show_lobby	= TRUE;
		m_index_table_select	= 0;
	}
	else if (m_id_player==pData->uid)
	{//大厅、游戏切换
		if (pData->us_table!=m_map_user[pData->uid].us_table)
		{//桌子变了
			memset((STRUCT_TABLE_INFO*)this, 0, sizeof(STRUCT_TABLE_INFO));
			m_ptr_player	= NULL;
			if (m_is_show_lobby==FALSE && pData->us_table>0)
			{
				SetMode(ENUM_GAME);
			}
			else
			{
				SetMode(ENUM_LOBBY);
			}
		}
	}

	m_map_user[pData->uid]	= *pData;
	CPlayer* ptr_player	= GetPlayer(pData->uid);
	int index	= GetPlayerIndex(pData->uid);
	if(ptr_player && index>=0)
	{
		ptr_player->update_user_data(index, pData);
	}
	update_ui();
	return;
}

CPlayer* MainGame::GetPlayer(ULONG id_user)
{
	if(id_user==0)
		id_user	= m_id_player;
	if(id_user==0)
		return NULL;
	for(int i=0; i<NUM_CHAIR; i++)
	{
		if(player[i]==id_user)
			return &m_array_player[i];
	}
	return NULL;
}

void MainGame::on_msg_scene_data(ULONG id_user, STRUCT_ADD_USER* ptr_add_user, STRUCT_ADD_SCENE* ptr_add_scene, UCHAR* ptr_scene_data)
{
	CPlayer* pPlayer	= GetPlayer(id_user);
	if(pPlayer)
	{
		pPlayer->update_scene_data(ptr_add_scene, ptr_scene_data);
		int index	= GetPlayerIndex(id_user);
		if (index>=0)
		{
			pPlayer->update_user_data(index, ptr_add_user);
		}
//		if(pPlayer==GetPlayer())
//		{
//			pPlayer->m_scale	= MAIN_SCALE;
//		}
//		else
//		{
//			pPlayer->m_scale	= SMALL_SCALE;
//		}
	}
}

void MainGame::on_msg_ui_cmd(ULONG id_user, USHORT ui_cmd)
{
	CPlayer* pPlayer	= GetPlayer(id_user);
	if(pPlayer)
	{
		pPlayer->on_msg_pointer(ui_cmd);
	}
	switch(ui_cmd) {
	case _UI_CMD_SHOOT:
		if(m_is_playing && m_ptr_player && m_ptr_player->IsReady())
		{
			m_ptr_player->m_is_shoot_shaking	= FALSE;
			m_msg_holder["shoot"]	= Sys_GetTime();
			m_ptr_player->Shoot();
		}
		break;
	case _UI_CMD_SHAKE:
		if(m_is_playing && pPlayer && pPlayer->IsReady())
		{
			pPlayer->trigger_scene_shaking();
		}
		break;
	case _UI_CMD_SUPER:
		if(m_is_playing && pPlayer && pPlayer->IsReady())
		{
			pPlayer->TriggerSuperShooter();
			pPlayer->add_effect_tip("SUPER!", 
									GPOINT(0, pPlayer->GetHeight()/2),
									GPOINT(0, 0),
									RGBA_MAKE(0,205,15, 250),
									1.0f
									);
			play_sound("bubble_sound\\heal");
			play_sound("bubble_sound\\heal");
		}
		break;
	case _UI_CMD_LOST_CONTROL:	//TO CLIENT, 命令客户端进入失控状态
		if(m_is_playing && pPlayer && pPlayer->IsReady())
		{
			pPlayer->TriggerLostControl();
			pPlayer->add_effect_tip("PUZZLE!", 
									GPOINT(0, pPlayer->GetHeight()/2),
									GPOINT(0, 0),
									RGBA_MAKE(255,25,175, 250),
									1.0f
									);
			play_sound("bubble_sound\\use_bubble");
			play_sound("bubble_sound\\use_bubble");
		}
		break;
	case _UI_CMD_BLIND:			//TO CLIENT, 命令客户端进入失明状态
		if(m_is_playing && pPlayer && pPlayer->IsReady())
		{
			pPlayer->TriggerBlind();
			pPlayer->add_effect_tip("BLIND!", 
									GPOINT(0, pPlayer->GetHeight()/2),
									GPOINT(0, 0),
									RGBA_MAKE(255,25,20, 250),
									1.0f
									);
			play_sound("bubble_sound\\use_bubble");
			play_sound("bubble_sound\\use_bubble");
		}
		break;
	}
}

void MainGame::on_msg_score(STRUCT_SCORE *pSS)
{
	if(pSS==NULL)
		return;
	CPlayer* pPlayer	= GetPlayer(pSS->uid);
	m_map_user[pSS->uid].n_score	= pSS->score;
	m_map_user[pSS->uid].n_score	+= pSS->gain;
	m_map_user[pSS->uid].us_lost	= pSS->us_lost;
	m_map_user[pSS->uid].us_win		= pSS->us_win;
	if(pPlayer)
	{
		pPlayer->on_msg_score(pSS);
		int index	= GetPlayerIndex(pSS->uid);
		if(index>=0)
		{
			pPlayer->update_user_data(index, &m_map_user[pSS->uid]);
		}
	}
}

void MainGame::process_packet(NET_Packet *ptr_packet)
{
	uint16 cmd = ptr_packet->getCmd();
	switch(cmd)
	{
	case GSP_TALK:
	case GSP_SPEEK:
		{
			uint32 uid_speeker = ptr_packet->read32();
			const char* strUser = ptr_packet->readString();
			const char* strSpeek = ptr_packet->readString();
			on_speek(uid_speeker, strUser, strSpeek);
		}
		break;
	case GSP_LOGIN:
		{
			on_login(NULL);
		}
		break;
	case GSP_ADD_USER:
		{
			on_msg_add_user((STRUCT_ADD_USER*)ptr_packet->readData());
		}
		break;
	case GSP_DEL_USER:
		{
			ULONG uid	= ptr_packet->read32();
			std::map<ULONG, STRUCT_ADD_USER>::iterator it	= m_map_user.find(uid);
			if (it!=m_map_user.end())
			{
				m_map_user.erase(it);
			}
			update_ui();
		}
		break;
	case GSP_ADD_TABLE:
		{
			on_msg_add_table((STRUCT_TABLE_INFO*)ptr_packet->readData());
		}
		break;
	case GSP_SCENE_DATA:
		{
			ULONG uid = ptr_packet->read32();
			STRUCT_ADD_USER*	pSAU	= (STRUCT_ADD_USER*)ptr_packet->readData();
			STRUCT_ADD_SCENE*	pSAS	= (STRUCT_ADD_SCENE*)ptr_packet->readData();
			if (pSAS)
			{
				if (pSAS->m_state==PLAYER_STATE_WIN)
				{
					m_is_playing	= FALSE;
				}
				else if (pSAS->m_state==PLAYER_STATE_PLAYING)
				{
					m_is_playing	= TRUE;
					if(m_ptr_player && m_id_player==uid)
					{
						if (m_ptr_player->GetState()!=PLAYER_STATE_PLAYING)
						{//游戏开始
							m_msg_holder["shoot"]	= Sys_GetTime();
							m_game_start_time	= 0;//Sys_GetTime();
						}
					}
				}
			}
			on_msg_scene_data(uid, pSAU, pSAS, (UCHAR*)ptr_packet->readData());
			update_ui();
		}
		break;
	case GSP_GAME_CLOCK:
		{
			ULONG game_time = ptr_packet->read32();
			if (game_time==0)
			{//游戏开始
				m_msg_holder["shoot"]	= Sys_GetTime();
				m_game_start_time	= 0;//Sys_GetTime();
				m_is_playing	= TRUE;
				for (int i=0; i<NUM_CHAIR; i++)
				{
					if (player[i])
					{
						m_array_player[i].Start();
					}
				}
			}
			if (m_game_start_time==0)
			{
				m_game_start_time	= Sys_GetTime() - game_time;
			}
			if (m_ptr_player && abs(game_time + m_game_start_time - Sys_GetTime())>5000)
			{//作弊!
				MessageBox(m_pEngine->GetEngineWnd(), "居然还要作弊! :_: ", "无聊呀", MB_OK);
				PostQuitMessage(0);
			}
			update_game_clock(game_time);
		}
		break;
	case GSP_TRIGGER_CARDS:
		{
			ULONG id_user	= ptr_packet->read32();
			CPlayer* ptr_player	= GetPlayer(id_user);
			if (ptr_player)
			{
				BYTE*	pData = (BYTE*)ptr_packet->readData();
				std::vector<BYTE> lst_cards;
				for (int i=0; i<WAY_SIZE; i++)
				{
					if (pData[i]>0)
					{
						lst_cards.push_back((pData[i])/10);
						if ((pData[i])/10>=ENUM_CARD_GOOD)
						{
							play_sound("bubble_sound\\heal");
						}
						else
						{
							play_sound("bubble_sound\\card_bad");
						}
					}
				}
				float x = -(lst_cards.size()-1.0f)/2.0f;
				for (i=0; i<lst_cards.size(); i++)
				{
					ptr_player->add_effect_cards(lst_cards[i], x, 0);
					x +=1.0f;
				}
			}
		}
		break;
	case GSP_SHOOT:
		{
			ULONG uid = ptr_packet->read32();
			on_msg_shoot(uid, (STRUCT_SHOOT_DATA*)ptr_packet->readData());
		}
		break;
	case GSP_UI_CMD:
		{
			ULONG id_user	= ptr_packet->read32();
			USHORT	ui_cmd	= ptr_packet->read16();
			on_msg_ui_cmd(id_user, ui_cmd);
			update_ui();
		}
		break;
	case GSP_SCORE:
		{
			STRUCT_SCORE* pSS = (STRUCT_SCORE*)ptr_packet->readData();
			on_msg_score(pSS);
			if (pSS && pSS->gain!=0 && GetPlayer(pSS->uid))
			{
				m_bk_music.SetStreamSource("bubble_sound\\wait");
				m_bk_music.Play();
				m_bk_music.SetLooping();
				m_is_playing	= FALSE;
				update_ui();
			}
		}
		break;
	case GSP_POP_BUBBLE:
		{
			ULONG	id_user	= ptr_packet->read32();
			ULONG	id_caster	= ptr_packet->read32();
			//UCHAR	bubble_use	= ptr_packet->read8();
			CPlayer* pPlayer_caster	= GetPlayer(id_caster);
			//if(pPlayer_caster)
			//	pPlayer_caster->num_bubble_store -= bubble_use;
			USHORT	num = ptr_packet->read16();
			USHORT*	ap_pop	= (USHORT*)ptr_packet->readData();	
			CPlayer* pPlayer	= GetPlayer(id_user);
			if(pPlayer)
			{
				for (int i=0; i<num; i++)
				{
					pPlayer->PopBubble(pPlayer->Index2X(ap_pop[i]), pPlayer->Index2Y(ap_pop[i]), 1);
				}
			}
			play_sound("bubble_sound\\pop");
		}
		break;
	case GSP_HANDLE_PLAYER:
		{
			STRUCT_HANDLE_PLAYER* pSHP	= (STRUCT_HANDLE_PLAYER*)ptr_packet->readData();
			CPlayer* pPlayer	= GetPlayer(pSHP->user);
			CPlayer* pPlayer_obj	= GetPlayer(pSHP->object);
			if (pPlayer && pPlayer_obj)
			{
				int idx_user	= GetPlayerIndex(pSHP->user);
				int idx_object	= GetPlayerIndex(pSHP->object);
				GPOINT src;
				GPOINT dest;
				if (idx_user>=0 && idx_object>=0)
				{
					if (idx_user==0)
						src	= GPOINT(655, 500);
					else
						src	= GPOINT(76+149*((idx_user-1)%3), 290 + 279*(int)((idx_user-1)/3));
					if (idx_object==0)
						dest	= GPOINT(655, 500 - pPlayer_obj->GetHeight()/2.0f*pPlayer_obj->m_scale);
					else
						dest	= GPOINT(76+149*((idx_object-1)%3), 290 + 279*(int)((idx_object-1)/3) - pPlayer_obj->GetHeight()/2.0f*pPlayer_obj->m_scale);
					switch(pSHP->enum_handle) {
					case ENUM_HANDLE_ADD_BAD:		//加有害泡泡
						{
							char str[50];
							sprintf(str, "+%d", abs(pSHP->bubble_bad_obj - pPlayer_obj->num_bubble_bad));
							pPlayer_obj->add_effect_tip(str, 
														GPOINT(0, pPlayer_obj->GetHeight()/2),
														GPOINT(pPlayer_obj->GetWidth(), 0),
														RGBA_MAKE(255, 10, 0, 200),
														1.0f
														);
							add_skill_effect(src, dest,
								"ani\\magic.txg",
								"particles\\magic_1");
							play_sound("bubble_sound\\use_bubble");
						}
						break;
					case ENUM_HANDLE_ADD_GOOD:		//加有益泡泡
						{
							char str[50];
							sprintf(str, "+%d", abs(pSHP->bubble_good_obj - pPlayer_obj->num_bubble_store));
							pPlayer_obj->add_effect_tip(str, 
														GPOINT(0, pPlayer_obj->GetHeight()/2),
														GPOINT(-pPlayer_obj->GetWidth()-1, pPlayer_obj->GetHeight()),
														RGBA_MAKE(0, 255, 0, 200),
														1.0f
														);
							if (m_ptr_player==pPlayer || m_ptr_player==pPlayer_obj)
							{
								add_skill_effect(src, dest,
									"ani\\mana.txg",
									"particles\\magic_3");
							}
							play_sound("bubble_sound\\heal");
						}
						break;
					case ENUM_HANDLE_SUBTRACT_GOOD:
						{
							char str[50];
							sprintf(str, "-%d", abs(pSHP->bubble_good_obj - pPlayer_obj->num_bubble_store));
							pPlayer_obj->add_effect_tip(str, 
														GPOINT(0, pPlayer_obj->GetHeight()/2),
														GPOINT(-pPlayer_obj->GetWidth()-1, pPlayer_obj->GetHeight()),
														RGBA_MAKE(100, 25, 0, 200),
														1.5f
														);
							if (m_ptr_player==pPlayer || m_ptr_player==pPlayer_obj)
							{
								add_skill_effect(src, dest,
									"ani\\magic.txg",
									"particles\\magic_1");
							}
							play_sound("bubble_sound\\use_bubble");
						}
						break;
					case ENUM_HANDLE_RAISE:			//冒泡泡
						{
							if (m_ptr_player==pPlayer || m_ptr_player==pPlayer_obj)
							{
								add_skill_effect(src, dest,
									"ani\\magic.txg",
									"particles\\magic_1");
							}
							play_sound("bubble_sound\\use_bubble");
						}
						break;
					case ENUM_HANDLE_POP:			//消泡泡

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -