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

📄 ui_comms.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				if(!ent)
					break;

				myx=ent->XPos();
				myy=ent->YPos();

				ent=session->GetPlayerEntity();
				if(ent)
				{
					sx=ent->XPos();
					sy=ent->YPos();

					dx=myx-sx;
					dy=myy-sy;

					dist=static_cast<float>(sqrt(dx*dx+dy*dy) * FT_TO_NM);

					if(dist <= 40.0f)
						retval=TRUE;
				}
				break;
			case rcfTeam:
				if(session->GetTeam() == FalconLocalSession->GetTeam())
					retval=TRUE;
				break;
			case rcfAll:
				retval=TRUE;
				break;
		}
	}
	return(retval);
}

// This function creates a CHATSTR class... which gets destroyed in ProcessChatStr()
void ReceiveChatString(VU_ID from,_TCHAR *message)
{
	CHATSTR *msg;

	msg=new CHATSTR;
	msg->ID_=from;
	msg->Text_=new _TCHAR[_tcsclen(message)];

	_tcscpy(msg->Text_,message);

	PostMessage(gCommsMgr->AppWnd_,FM_RECEIVE_CHAT,0,(long)msg);
}

// This function is responsible for deleting msg
void ProcessChatStr(CHATSTR *msg)
{
	if(!msg)
		return;

	if(gMainHandler) // Assume UI is running
	{
		TREELIST *item;
		C_Player *plyr;

		if(!People)
			return;

		item=People->Find(msg->ID_.creator_);
		if(item)
		{
			plyr=(C_Player*)item->Item_;
			if(plyr && (plyr->GetMute())) // Filter out Chat messages we don't want to hear
				return;
		}

		AddMessageToChatWindow(msg->ID_,msg->Text_);
		if(!(gMainHandler->GetWindowFlags(CHAT_WIN) & C_BIT_ENABLED))
			gNewMessage=TRUE;
	}
	else if(VM)// Assume Sim is running (AND VM is initialized)
	{
		FalconSessionEntity *session;

		session=(FalconSessionEntity*)vuDatabase->Find(msg->ID_);

		if(session)
		{
			if(!FilterIncommingMessage(session))
				return;

			_tcscpy(chatbuf,session->GetPlayerCallsign());
			_tcscat(chatbuf,": ");
		}
		else if (msg->ID_ != FalconNullId)
		{
			_tcscpy(chatbuf,"Unknown");
			_tcscat(chatbuf,": ");
		}
		else
			chatbuf[0] = '\0';

		_tcscat(chatbuf,msg->Text_);

		OTWDriver.ShowMessage(chatbuf);
	}
	delete msg;
}

static void SendChatStringCB(long,short hittype,C_Base *control)
{
	TREELIST *cur;
	C_Player *plyr;
	UI_SendChatMessage *chat;

	if(hittype != DIK_RETURN || control == NULL || !gCommsMgr->Online())
		return;

	AddMessageToChatWindow(FalconLocalSessionId,((C_EditBox *)control)->GetText());

	cur=People->GetRoot();
	while(cur)
	{
		if(cur->Type_ == C_TYPE_ITEM)
		{
			plyr=(C_Player*)cur->Item_;
			if(plyr && plyr->GetState() && !plyr->GetIgnore())
			{
				FalconSessionEntity *session = (FalconSessionEntity*) vuDatabase->Find(plyr->GetVUID());
				if(session && session != FalconLocalSession)
				{
					chat=new UI_SendChatMessage(FalconNullId,session);

					chat->dataBlock.from=FalconLocalSessionId;
					chat->dataBlock.size=static_cast<short>((_tcsclen(((C_EditBox *)control)->GetText())+1)*sizeof(_TCHAR));
					chat->dataBlock.message=new _TCHAR[chat->dataBlock.size];
					memcpy(chat->dataBlock.message,((C_EditBox *)control)->GetText(),chat->dataBlock.size);
					FalconSendMessage(chat,TRUE);
				}
			}
		}
		cur=cur->Next;
	}

	((C_EditBox*)control)->SetText(TXT_SPACE);
	control->Refresh();
}

static void SetOnlineStatus(long ID)
{
	C_Window *win;
	C_Base *ctrl;

	win=gMainHandler->FindWindow(ID);
	if(win)
	{
		ctrl=win->FindControl(SINGLE_FLY_CTRL);
		if(ctrl)
		{
			ctrl->Refresh();
			if(gCommsMgr->Online())
				ctrl->SetReady(0);
			else
				ctrl->SetReady(1);
			ctrl->Refresh();
		}
		ctrl=win->FindControl(SINGLE_COMMIT_CTRL);
		if(ctrl)
		{
			ctrl->Refresh();
			if(gCommsMgr->Online())
				ctrl->SetReady(0);
			else
				ctrl->SetReady(1);
			ctrl->Refresh();
		}
		ctrl=win->FindControl(COMMS_FLY_CTRL);
		if(ctrl)
		{
			ctrl->Refresh();
			if(gCommsMgr->Online())
				ctrl->SetReady(1);
			else
				ctrl->SetReady(0);
			ctrl->Refresh();
		}
		ctrl=win->FindControl(COMMS_COMMIT_CTRL);
		if(ctrl)
		{
			ctrl->Refresh();
			if(gCommsMgr->Online())
				ctrl->SetReady(1);
			else
				ctrl->SetReady(0);
			ctrl->Refresh();
		}
		ctrl=win->FindControl(DF_OFFLINE_CTRL);
		if(ctrl)
		{
			ctrl->Refresh();
			if(gCommsMgr->Online())
				ctrl->SetReady(0);
			else
				ctrl->SetReady(1);
			ctrl->Refresh();
		}
		ctrl=win->FindControl(DF_HOST_CTRL);
		if(ctrl)
		{
			ctrl->Refresh();
			if(gCommsMgr->Online())
				ctrl->SetReady(1);
			else
				ctrl->SetReady(0);
			ctrl->Refresh();
		}
	}
#if 0
	if(People)
	{
		if(gCommsMgr->Online())
			People->SetReady(1);
		else
			People->SetReady(0);
		if(People->GetParent())
			People->GetParent()->RefreshClient(People->GetClient());
	}
#endif
}


void SetSingle_Comms_Ctrls()
{
//	SetOnlineStatus(IA_TOOLBAR_WIN); // Single player ONLY for Instant Action
	SetOnlineStatus(DF_TOOLBAR_WIN);
	SetOnlineStatus(DF_PLAY_TOOLBAR_WIN);
	SetOnlineStatus(TAC_TOOLBAR_WIN);
	SetOnlineStatus(TAC_LOAD_TOOLBAR);
	SetOnlineStatus(CP_TOOLBAR);
	SetOnlineStatus(CS_TOOLBAR_WIN);
}

static VU_ID SearchID;
static VU_ID *tmpID;

BOOL TreeSearchCB(TREELIST *item)
{
	if(item == NULL) return(FALSE);
	if(item->Item_ == NULL) return(FALSE);
	
	if(item->Type_ == C_TYPE_ITEM)
	{
		if(((C_Player*)item->Item_)->GetVUID() == SearchID)
			return(TRUE);
	}
	else if(item->Type_ == C_TYPE_MENU)
	{
		tmpID=(VU_ID*)item->Item_->GetUserPtr(_UI95_VU_ID_SLOT_);
		if(tmpID == NULL)
			return(FALSE);

		if(*tmpID == SearchID)
			return(TRUE);
	}
	return(FALSE);
}

TREELIST *StartTreeSearch(VU_ID findme,TREELIST *top,C_TreeList *tree)
{
	SearchID=findme;
	tree->SetSearchCB(TreeSearchCB);
	return(tree->SearchWithCB(top));
}

static void UpdatePlayerListCB(short,VU_ID,VU_ID)
{
}

static BOOL TrimmerFindSession(VU_ID playerid,VuGameEntity *game)
{
	VuSessionsIterator sessionWalker(game);
	FalconSessionEntity *session;

	session = (FalconSessionEntity*)sessionWalker.GetFirst();
	while(session)
	{
		if(session->Id() == playerid)
			return(TRUE);
		session = (FalconSessionEntity*)sessionWalker.GetNext();
	}
	return(FALSE);
}

static void TrimPlayerTree(C_TreeList *tree,TREELIST *branch)
{
	VU_ID *tmpID;
	TREELIST *limb;
	VuGameEntity *game;
	C_Player *plyr;

	limb=NULL;
	while(branch)
	{
		if(branch->Type_ == C_TYPE_MENU)
		{
			tmpID=(VU_ID*)branch->Item_->GetUserPtr(_UI95_VU_ID_SLOT_);
			if(tmpID) // this is a game vu_id
			{
				game=(VuGameEntity*)vuDatabase->Find(*tmpID);
				if(game == NULL)
					limb=branch;
				else if(branch->Child)
					TrimPlayerTree(tree,branch->Child);
			}
			else
				TrimPlayerTree(tree,branch->Child);
		}
		else if(branch->Type_ == C_TYPE_ITEM)
		{
			tmpID=(VU_ID*)branch->Parent->Item_->GetUserPtr(_UI95_VU_ID_SLOT_);
			if(tmpID == NULL)
				game=vuPlayerPoolGroup;
			else
				game=(VuGameEntity*)vuDatabase->Find(*tmpID);

			plyr=(C_Player*)branch->Item_;
			if(!TrimmerFindSession(plyr->GetVUID(),game))
				limb=branch;
		}
		branch=branch->Next;
		if(limb)
		{
			tree->DeleteItem(limb);
			limb=NULL;
		}
	}
}

static TREELIST *AddGameToList(VuGameEntity *game,TREELIST *parent,C_TreeList *tree)
{
	C_Button *btn;
	TREELIST *group;
	VU_ID *tmpID;
	_TCHAR *name;

	name=game->GameName();

	btn=new C_Button;
	btn->Setup(C_DONT_CARE,C_TYPE_CUSTOM,0,0);
	btn->SetFlagBitOn(C_BIT_ENABLED);
	btn->SetText(C_STATE_0,name);
	btn->SetText(C_STATE_1,name);
	btn->SetText(C_STATE_2,name);
	btn->SetFgColor(C_STATE_0,0x00e0e0e0);
	btn->SetFgColor(C_STATE_1,0x0000ff00);
	btn->SetFgColor(C_STATE_2,0x0000ffff);
	tmpID=new VU_ID;
	*tmpID=game->Id();
	btn->SetUserCleanupPtr(_UI95_VU_ID_SLOT_,tmpID);

	group=tree->CreateItem(gCommsUniqueID++,C_TYPE_MENU,btn);
	if(parent)
		tree->AddChildItem(parent,group);
	else
	{
		tree->AddItem(tree->GetRoot(),group);
		if(FalconLocalGame == game)
			btn->SetState(2);
	}

	if (game == gCommsMgr->GetTargetGame())
		btn->Process(0,C_TYPE_LMOUSEUP);

	return(group);
}

static TREELIST *CreatePlayerButton(C_TreeList *tree,FalconSessionEntity *session)
{
	TREELIST *item;
	C_Player *player;

	player=new C_Player;
	player->Setup(session->Id().creator_,0);
	player->InitEntity();
	player->SetFont(tree->GetFont());
	player->SetIcon(8,8,ICON_IMAGE);
	player->SetName(20,0,session->GetPlayerCallsign());
	if(session == FalconLocalSession)
		player->SetColor(0x0000ffff,0x0000ffff,0x0000ffff);
	else
	{
		player->SetColor(0x00e0e0e0,0x0000ff00,0x0000aa);
		player->SetStatus(8,8,MUTE_IMAGE);
	}
	player->SetVUID(session->Id());

	item=tree->CreateItem(session->Id().creator_,C_TYPE_ITEM,player);
	return(item);
}


void UpdateGameTreeBranch(long branchid,VuGameEntity *game,C_TreeList *tree,TREELIST *parent,BOOL IsChild) // branchid is the game_<GameType> therefore add 1 for valid ID
{
	TREELIST *group,*player;
	C_Button *btn;

	if(game == NULL)
		return;

	if(branchid != game_PlayerPool)
	{
		group=StartTreeSearch(game->Id(),parent,tree);
		if(group == NULL)
		{
			if(IsChild)
				group=AddGameToList(game,parent,tree);
			else
				group=AddGameToList(game,NULL,tree);
		}
		else
		{
			btn=(C_Button*)group->Item_;
			if(btn)
			{
				if(strcmp(game->GameName(),btn->GetText(C_STATE_0)))
				{
					btn->SetText(C_STATE_0,gStringMgr->GetText(gStringMgr->AddText(game->GameName())));
					btn->SetText(C_STATE_1,gStringMgr->GetText(gStringMgr->AddText(game->GameName())));
				}
			}
		}
		parent=group;
	}

	VuSessionsIterator sessionWalker(game);
	FalconSessionEntity *session;

	session = (FalconSessionEntity*)sessionWalker.GetFirst();
	while(session)
	{
		player=StartTreeSearch(session->Id(),parent,tree);
		if(player == NULL)
		{
			player=CreatePlayerButton(tree,session);
			tree->AddChildItem(parent,player);
		}
		session = (FalconSessionEntity*)sessionWalker.GetNext();
	}
}


static void RemoveOldPeopleTreeCB(TREELIST *old)
{
	_TCHAR buffer[60];

	_stprintf(buffer,"%s %s",((C_Player*)old->Item_)->GetName(),gStringMgr->GetString(TXT_LEFT_GAME));

	ReceiveChatString(FalconNullId,buffer);
}

// Call this function EVERYTIME we move to a different game 
void MakeLocalGameTree(VuGameEntity *game)
{
	C_Window *win;
	C_Button *btn;
	TREELIST *item;
	C_Text *txt;
	VU_ID *tmpID;

	if(!People)
		return;

	if(People->GetRoot())
		People->DeleteBranch(People->GetRoot());

	win=gMainHandler->FindWindow(CHAT_WIN);
	if(!win)
		return;

	if(game)
	{
		txt=new C_Text;
		txt->Setup(C_DONT_CARE,0);
		txt->SetFGColor(0xeeeeee);
		txt->SetFixedWidth(30);
		txt->SetFont(People->GetFont());
		if(game == (VuGameEntity*)vuPlayerPoolGroup)
		{
			txt->SetText(TXT_PLAYERPOOL);
			win->DisableCluster(1);
			win->DisableCluster(2);
			win->DisableCluster(3);
			win->DisableCluster(4);
			win->RefreshWindow();
		}
		else
		{
			txt->SetText(game->GameName());
			tmpID=new VU_ID;
			*tmpID=game->Id();
			txt->SetUserCleanupPtr(_UI95_VU_ID_SLOT_,tmpID);

			switch(((FalconGameEntity*)game)->GetGameType())
			{
				case game_Dogfight:

⌨️ 快捷键说明

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