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

📄 ui_comms.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/***************************************************************************\
	UI_COMMS.cpp
	Peter Ward
	December 3, 1996

	Comms Handling stuff for thw UI
\***************************************************************************/
#include <windows.h>
#include "falclib.h"
#include "f4vu.h"
#include "Mesg.h"
#include "msginc\sendchatmessage.h"
#include "msginc\requestlogbook.h"
#include "falcmesg.h"
#include "sim\include\otwdrive.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "uicomms.h"
#include "userids.h"
#include "textids.h"
#include "sim\include\commands.h"
#include "CmpClass.h"
#include "flight.h"
#include "queue.h"
#include "Dispcfg.h"
#include "FalcSnd\voicemanager.h"
#include "FalcSnd\voicefilter.h"
#include "remotelb.h"

enum
{
	MUTE_IMAGE        =2000,
	ICON_IMAGE        =2001,
	SND_HOMER		  =500034,
};


extern C_Handler *gMainHandler;
extern C_Parser *gMainParser;

extern int COLoaded;
extern int F4GameType;
int DoDFUpdate=0;

extern int CommandsKeyCombo;
extern int CommandsKeyComboMod;

// Variables for use with Input functions
extern unsigned int chatterCount;
extern char chatterStr[256];
extern short AsciiAllowed;
extern unsigned int MaxInputLength;
extern void (*UseInputFn)();
extern void (*DiscardInputFn)();

static long gCommsUniqueID=1;
long _IsF16_=0;

void GenericCloseWindowCB(long ID,short hittype,C_Base *control);
void GenericTimerCB(long ID,short hittype,C_Base *control);
void DeleteGroupList(long ID);
//void AddPlayerToGame(FalconSessionEntity *entity);
void RemovePlayerFromGame(VU_ID player);
//void MovePlayerAround(FalconSessionEntity *player);
void ClearDFTeamLists();
void CloseWindowCB(long ID,short hittype,C_Base *control);
void LoadCommsWindows();
void CommsSetup();
void CopyPBToWindow(long ID,long Client);
void GetPlayerInfo(VU_ID ID);
void TallyPlayerSquadrons();
void RebuildGameTree();
void SetSingle_Comms_Ctrls();
void UI_Help_Guide_CB(long ID,short hittype,C_Base *ctrl);
void CheckFlyButton();
void CheckPlayersFlight(FalconSessionEntity *session);
BOOL AddWordWrapTextToWindow(C_Window *win,short *x,short *y,short startcol,short endcol,COLORREF color,_TCHAR *str,long Client=0);
void MutePlayerCB(long ID,short hittype,C_Base *control);
void IgnorePlayerCB(long ID,short hittype,C_Base *control);
void UI_Refresh (void);
void DisplayLogbook(LB_PILOT *Pilot,IMAGE_RSC *Photo,IMAGE_RSC *Patch,BOOL EditFlag);

extern void CheckForNewPlayer (FalconSessionEntity *session);

// keep track of chat message Y position in window
static long CurChatY=0;
static short PeopleChatType=1;

C_TreeList *People=NULL;
C_TreeList *DogfightGames=NULL;
C_TreeList *TacticalGames=NULL;
C_TreeList *CampaignGames=NULL;

BOOL gNewMessage=FALSE;
extern short ViewLogBook;

static void HookupCommsControls(long ID);
static void UpdatePlayerListCB(short uptype,VU_ID GameID,VU_ID PlayerID);
static void SelectChatCB(long ID,short hittype,C_Base *control);
void RefreshGameListCB(long ID,short hittype,C_Base *control);
void BlinkCommsButtonTimerCB(long ID,short hittype,C_Base *control);
void UpdateDFPlayerList();
void BuildDFPlayerList();

void Phone_New_CB(long,short,C_Base *);
void Phone_Apply_CB(long,short,C_Base *);
void Phone_Remove_CB(long,short,C_Base *);
void Phone_Connect_CB(long,short,C_Base *);
void Phone_ConnectType_CB(long,short,C_Base *);

void ViewRemoteLBCB(long,short hittype,C_Base *)
{
	C_TreeList  *tree;
	TREELIST    *item;
	C_Player	*plyr;
	UI_RequestLogbook *rlb;
	FalconSessionEntity *session;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if(gPopupMgr->GetCallingType() == C_TYPE_CONTROL)
	{
		tree=(C_TreeList*)gPopupMgr->GetCallingControl();
		if(tree)
		{
			item=tree->GetLastItem();
			if(item)
			{
				plyr=(C_Player *)item->Item_;
				if(plyr)
				{
					//if(plyr->GetVUID() != FalconLocalSessionId)
					{
						// Go Ask for Logbook info & Open logbook...
						// Log book should be EMPTY, until data appears...
						// if(Player closes logbook before it's all received)
						// cancel
						session=(FalconSessionEntity*)vuDatabase->Find(plyr->GetVUID());
						if(session)
						{
							rlb=new UI_RequestLogbook(FalconNullId,session);
							rlb->dataBlock.fromID=FalconLocalSessionId;

							FalconSendMessage(rlb,true);
							ViewLogBook=1;
						}
					}
				}
			}
		}
	}
	gPopupMgr->CloseMenu();
}

void CommsErrorDialog(long TitleID,long MessageID,void (*OKCB)(long,short,C_Base*),void (*CancelCB)(long,short,C_Base*))
{
	C_Window *win;
	C_Button *btn;
	C_Text *txt;

	if(!MessageID || !gMainHandler)
		return;

	win=gMainHandler->FindWindow(COMMLINK_WIN);
	if(win)
	{
		txt=(C_Text*)win->FindControl(TITLE_LABEL);
		if(txt)
			txt->SetText(TitleID);

		btn=(C_Button *)win->FindControl(ALERT_CANCEL);
		if(btn)
		{
			if(OKCB)
			{
				btn->SetAllLabel(TXT_OK);
				btn->SetFlagBitOn(C_BIT_ENABLED);
				btn->SetCallback(OKCB);
			}
			else if(CancelCB)
			{
				btn->SetAllLabel(TXT_CANCEL);
				btn->SetFlagBitOn(C_BIT_ENABLED);
				btn->SetCallback(CancelCB);
			}
		}

		txt=(C_Text*)win->FindControl(COMMLINK_MESSAGE);
		if(txt)
			txt->SetText(MessageID);

		gMainHandler->ShowWindow(win);
		gMainHandler->WindowToFront(win);
	}
}

void UI_CommsErrorMessage(WORD error)
{
	long messageid=0;
	switch(error)
	{
		case F4COMMS_CONNECTED:
			messageid=TXT_COMMS_CONNECTED;
			break;
		case F4COMMS_ERROR_TCP_NOT_AVAILABLE:
			messageid=TXT_COMMS_NO_TCP;
			break;
		case F4COMMS_ERROR_UDP_NOT_AVAILABLE:
			messageid=TXT_COMMS_NO_UDP;
			break;
		case F4COMMS_ERROR_MULTICAST_NOT_AVAILABLE:
			messageid=TXT_COMMS_NO_MULTICAST;
			break;
		case F4COMMS_ERROR_FAILED_TO_CREATE_GAME:
			messageid=TXT_COMMS_NO_GAME_CREATE;
			break;
		case F4COMMS_ERROR_COULDNT_CONNECT_TO_SERVER:
			messageid=TXT_COMMS_NO_SERVER;
			break;
		case F4COMMS_PENDING:
			messageid=TXT_COMMS_PENDING;
			break;
	}
	if(messageid)
		CommsErrorDialog(TXT_COMMS_TITLE,messageid,GenericCloseWindowCB,NULL);
}

void LoadCommsWindows()
{
	long ID;
	C_PopupList *menu;

	if(COLoaded) return;

	if( _LOAD_ART_RESOURCES_)
		gMainParser->LoadImageList("art\\comm_res.lst");
	else
		gMainParser->LoadImageList("art\\comm_art.lst");
	gMainParser->LoadSoundList("art\\comm_snd.lst");
	gMainParser->LoadWindowList("art\\comm_scf.lst");

	ID=gMainParser->GetFirstWindowLoaded();
	while(ID)
	{
		HookupCommsControls(ID);
		ID=gMainParser->GetNextWindowLoaded();
	}

	if(gCommsMgr)
		gCommsMgr->SetCallback(game_PlayerPool,UpdatePlayerListCB);

	COLoaded++;

	CommsSetup();

	menu=gPopupMgr->GetMenu(CHAT_POP);
	if(menu)
	{
		menu->SetCallback(MID_MUTE,MutePlayerCB);
		menu->SetCallback(MID_IGNORE,IgnorePlayerCB);
		menu->SetCallback(MID_LOGBOOK,ViewRemoteLBCB);
	}
}

void CommsSetup()
{
	C_Window *win;
	C_TimerHook *tmr;

	CurChatY=0;

	win=gMainHandler->FindWindow(UI_MAIN_SCREEN);
	if(win)
	{
		tmr=new C_TimerHook;
		tmr->Setup(C_DONT_CARE,C_TYPE_TIMER);
		tmr->SetUpdateCallback(GenericTimerCB);
		tmr->SetRefreshCallback(BlinkCommsButtonTimerCB);
		tmr->SetUserNumber(_UI95_TIMER_DELAY_,2*_UI95_TICKS_PER_SECOND_);

		win->AddControl(tmr);
	}

	CopyPBToWindow(PB_WIN,0);
}

static void DisconnectCommsCB(long,short hittype,C_Base *)
{
	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if(!gCommsMgr->Online())
		return;

	gCommsMgr->StopComms();
	RebuildGameTree();
	UI_Refresh();
	SetSingle_Comms_Ctrls();
	CheckFlyButton();
}

static void OpenPhoneBookCB(long,short hittype,C_Base *control)
{
	C_Window *win;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	gMainHandler->EnableWindowGroup(control->GetGroup());
	win=gMainHandler->FindWindow(PB_WIN);
	gMainHandler->WindowToFront(win);
}

static _TCHAR chatbuf[80];

void AddMessageToChatWindow(VU_ID from,_TCHAR *message)
{
	C_Window            *win;
	C_Text              *txt;
	FalconSessionEntity *session;
	COLORREF             color;

	win=gMainHandler->FindWindow(CHAT_WIN);
	if(win)
	{
		if(from == FalconLocalSessionId)
		{
			color=0xcccccc;
			session=(FalconSessionEntity*)vuLocalSessionEntity;
		}
		else if(from != FalconNullId)
		{
			color=0x00ff00;
			session=(FalconSessionEntity*)vuDatabase->Find(from);
		}
		else
		{
			color=0x0000ff;
			session=NULL;
		}

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

		txt=new C_Text;
		txt->Setup(C_DONT_CARE,C_TYPE_NORMAL);
		txt->SetFixedWidth(_tcsclen(chatbuf)+1);
		txt->SetFont(win->Font_);
		txt->SetText(chatbuf);
		txt->SetXY(3,CurChatY);
		txt->SetW(330);
		txt->SetFGColor(color);
		txt->SetClient(2);
		txt->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
		txt->SetFlagBitOn(C_BIT_LEFT|C_BIT_WORDWRAP);
		win->AddControl(txt);
		txt->Refresh();

		CurChatY+=txt->GetH();// - gFontList->GetHeight(win->Font_);

		win->SetVirtualY(txt->GetY()-win->ClientArea_[txt->GetClient()].top,txt->GetClient());
		win->AdjustScrollbar(txt->GetClient()); 
		win->RefreshClient(txt->GetClient());

		win->ScanClientArea(2);
//		gSoundMgr->PlaySound(SND_HOMER);
	}
}

void BlinkCommsButtonTimerCB(long,short,C_Base *control)
{
	C_Button *btn;

	if (!gCommsMgr) return;
	if(!gNewMessage || !gCommsMgr->Online()) return;

	btn=(C_Button *)control->Parent_->FindControl(CO_MAIN_CTRL);	
	if(btn)
	{
		if(!(btn->GetFlags() & C_BIT_FORCEMOUSEOVER))
		{
			// gSoundMgr->PlaySound(SND_HOMER);
			btn->SetFlagBitOn(C_BIT_FORCEMOUSEOVER);
		}
		else
			btn->SetFlagBitOff(C_BIT_FORCEMOUSEOVER);
		btn->Refresh();
	}
}

BOOL FilterIncommingMessage(FalconSessionEntity *session)
{
	Package pkg;
	Flight flt;
	VU_ID MyPackageID;
	BOOL retval=FALSE;
	float myx,sx,myy,sy,dx,dy,dist;
	VuEntity *ent;

	if(VM)
	{
		switch(VM->GetRadioFreq(0))
		{
			case rcfFlight:
				if(session->GetPlayerFlightID() == FalconLocalSession->GetPlayerFlightID())
					retval=TRUE;
				break;
			case rcfPackage:
			case rcfFromPackage:
				flt=(Flight)vuDatabase->Find(FalconLocalSession->GetPlayerFlightID());
				if(!flt)
					break;

				pkg=(Package)flt->GetUnitParent();
				if(!pkg)
					break;

				MyPackageID=pkg->Id();

				flt=(Flight)vuDatabase->Find(session->GetPlayerFlightID());
				if(flt)
				{
					pkg=(Package)flt->GetUnitParent();
					if(pkg && pkg->Id() == MyPackageID)
						retval=TRUE;
				}
				break;
			case rcfProx: // 40nm range
				ent=FalconLocalSession->GetPlayerEntity();
				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;
		}
		switch(VM->GetRadioFreq(1))
		{
			case rcfFlight:
				if(session->GetPlayerFlightID() == FalconLocalSession->GetPlayerFlightID())
					retval=TRUE;
				break;
			case rcfPackage:
			case rcfFromPackage:
				flt=(Flight)vuDatabase->Find(FalconLocalSession->GetPlayerFlightID());
				if(!flt)
					break;

				pkg=(Package)flt->GetUnitParent();
				if(!pkg)
					break;

				MyPackageID=pkg->Id();

				flt=(Flight)vuDatabase->Find(session->GetPlayerFlightID());
				if(flt)
				{
					pkg=(Package)flt->GetUnitParent();
					if(pkg && pkg->Id() == MyPackageID)
						retval=TRUE;
				}
				break;
			case rcfProx: // 40nm range
				ent=FalconLocalSession->GetPlayerEntity();

⌨️ 快捷键说明

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