📄 ui_comms.cpp
字号:
/***************************************************************************\
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 + -