45 static HWND Standalone_hwnd = NULL;
48 #define ST_MODE_CREATE 0
49 #define ST_MODE_UPDATE 1
50 #define ST_MODE_REMOVE 2
52 #define MSG_SYSTRAYICON WM_USER+99
54 static void standalone_do_systray(
int mode);
57 #define STP_RESET_ALL 1
58 #define STP_SHUTDOWN 2
60 #define STP_RESET_FS2NETD 4
66 #define MAX_STANDALONE_PAGES 5
68 #define STD_STATS_UPDATE_TIME 500 // ms between updating player stats on the visible controls
69 #define STD_NG_UPDATE_TIME 100 // ms between updating netgame information are controls
78 #define CONNECT_PAGE 0
79 #define MULTIPLAYER_PAGE 1
80 #define PLAYER_INFO_PAGE 2
81 #define GODSTUFF_PAGE 3
88 static PROPSHEETHEADER Sheet;
91 static int Active_standalone_page;
100 #define STANDALONE_MAX_BAN 50
110 static HWND Multi_gen_dialog = NULL;
121 Multi_gen_dialog = NULL;
131 if(Multi_gen_dialog != NULL){
136 if (Standalone_minimized) {
142 if(Multi_gen_dialog != NULL){
143 SetWindowText(Multi_gen_dialog, title);
151 if(Multi_gen_dialog == NULL){
156 DestroyWindow(Multi_gen_dialog);
157 Multi_gen_dialog = NULL;
167 if((Multi_gen_dialog == NULL) || (str == NULL) || (field_num < 0) || (field_num > 2)){
172 ctrl = GetDlgItem(Multi_gen_dialog, (
int)MAKEINTRESOURCE(
IDC_FIELD1));
175 ctrl = GetDlgItem(Multi_gen_dialog,(
int)MAKEINTRESOURCE(
IDC_FIELD1));
178 ctrl = GetDlgItem(Multi_gen_dialog,(
int)MAKEINTRESOURCE(
IDC_FIELD2));
181 ctrl = GetDlgItem(Multi_gen_dialog,(
int)MAKEINTRESOURCE(
IDC_FIELD3));
184 SetWindowText(ctrl, str);
190 return Multi_gen_dialog != NULL;
196 static HWND Multi_std_name;
228 SetWindowText(ctrl,str);
252 SetWindowText(ctrl,
XSTR(
"Host connected ? Yes",912));
254 SetWindowText(ctrl,
XSTR(
"Host connected ? No",913));
265 SendMessage(ctrl, LB_ADDSTRING, (WPARAM)0, (
LPARAM)(LPCTSTR)
string);
280 loc = SendMessage(ctrl, LB_FINDSTRING, (WPARAM)-1, (
LPARAM)(LPCTSTR)
string);
283 SendMessage(ctrl, LB_DELETESTRING, (WPARAM)loc, (
LPARAM)0);
299 loc = SendMessage(ctrl,LB_FINDSTRING,(WPARAM)-1,(
LPARAM)(LPCTSTR)lookup);
302 SendMessage(ctrl,LB_DELETESTRING,(WPARAM)loc,(
LPARAM)0);
303 SendMessage(ctrl,LB_INSERTSTRING,(WPARAM)loc,(
LPARAM)
string);
315 sel = SendMessage(ctrl,LB_GETCURSEL,(WPARAM)0,(
LPARAM)0);
321 if(player_num != -1){
330 char str[40],ping[10],sml_ping[10],lookup[50];
369 SendMessage(handle,LB_RESETCONTENT,(WPARAM)0,(
LPARAM)0);
402 SetWindowText(Multi_std_name,buf);
414 memcpy(&buf[0],&max_len,
sizeof(
int));
417 SendMessage(Multi_std_name,EM_GETLINE,(WPARAM)0,(
LPARAM)(LPCSTR)buf);
444 memcpy(&buf[0],&max_len,
sizeof(
int));
465 SendMessage(ctrl,LB_GETTEXT,(WPARAM)index,(
LPARAM)(
LPSTR)list_text);
476 if((addr_text[0] !=
'\0') && (strstr(list_text,addr_text) != NULL)){
496 Multi_std_name = GetDlgItem(hwndDlg, (
int)MAKEINTRESOURCE(
IDC_STD_NAME));
509 switch(HIWORD(wParam)){
512 switch(LOWORD(wParam)){
538 if((
HWND)lParam == Multi_std_name){
552 if(((LPNMHDR)lParam)->
code == PSN_SETACTIVE){
554 }
else if ( (((LPNMHDR)lParam)->
code == PSN_APPLY) || (((LPNMHDR)lParam)->
code == PSN_RESET) ) {
555 PostMessage( Psht, WM_DESTROY, 0, 0 );
570 static HWND Framecap_trackbar;
571 static HWND Standalone_FPS;
572 static HWND Standalone_mission_name;
573 static HWND Standalone_missiontime;
574 static HIMAGELIST Goal_bitmaps;
575 static HWND Standalone_goals;
576 static HTREEITEM Goal_items[3];
577 static HWND Std_ng_max_players;
578 static HWND Std_ng_max_observers;
579 static HWND Std_ng_security;
580 static HWND Std_ng_respawns;
582 #define GOALVIEW_X 5 // goal view control extents
583 #define GOALVIEW_Y 242 //
584 #define GOALVIEW_W 160 //
585 #define GOALVIEW_H 168 //
604 fix m_time =
fl2f(mission_time);
608 sprintf(txt,
" : %.1f", mission_time);
610 SetWindowText(Standalone_missiontime,time_txt);
617 SetWindowText(Standalone_mission_name,mission_name);
624 TV_INSERTSTRUCT tree_insert;
628 TreeView_DeleteAllItems(Standalone_goals);
631 new_item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
632 new_item.pszText = goal_name;
633 strcpy(new_item.pszText,
XSTR(
"Primary Objectives",917));
635 new_item.iSelectedImage = 0;
636 tree_insert.hParent = NULL;
637 tree_insert.hInsertAfter = TVI_FIRST;
638 tree_insert.item = new_item;
639 Goal_items[0] = TreeView_InsertItem(Standalone_goals,&tree_insert);
642 new_item.pszText = goal_name;
643 strcpy(new_item.pszText,
XSTR(
"Secondary Objectives",918));
645 new_item.iSelectedImage = 0;
646 tree_insert.hInsertAfter = TVI_LAST;
647 tree_insert.item = new_item;
648 Goal_items[1] = TreeView_InsertItem(Standalone_goals,&tree_insert);
651 new_item.pszText = goal_name;
652 strcpy(new_item.pszText,
XSTR(
"Bonus Objectives",919));
654 new_item.iSelectedImage = 0;
655 tree_insert.item = new_item;
656 Goal_items[2] = TreeView_InsertItem(Standalone_goals,&tree_insert);
663 TV_INSERTSTRUCT tree_insert;
664 int idx,goal_flags,perm_goal_flags;
668 new_item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
669 tree_insert.hInsertAfter = TVI_LAST;
679 goal_flags |= (1<<1);
680 perm_goal_flags |= (1<<1);
685 goal_flags |= (1<<2);
686 perm_goal_flags |= (1<<2);
691 goal_flags |= (1<<3);
692 perm_goal_flags |= (1<<3);
696 goal_flags |= (1<<0);
704 new_item.pszText = goal_name;
705 strcpy(new_item.pszText,Mission_goals[idx].name);
708 new_item.iImage = (goal_flags & (1<<0)) ? 3 : 0;
709 new_item.iSelectedImage = (goal_flags & (1<<0)) ? 3 : 0;
712 tree_insert.item = new_item;
713 TreeView_InsertItem(Standalone_goals,&tree_insert);
718 if(!(perm_goal_flags & (1<<1))){
720 tree_insert.hParent = Goal_items[0];
721 new_item.pszText = goal_name;
722 strcpy(new_item.pszText,
XSTR(
"none",920));
724 new_item.iSelectedImage = 3;
725 tree_insert.item = new_item;
726 TreeView_InsertItem(Standalone_goals,&tree_insert);
728 if(!(perm_goal_flags & (1<<2))){
730 tree_insert.hParent = Goal_items[1];
731 new_item.pszText = goal_name;
732 strcpy(new_item.pszText,
XSTR(
"none",920));
734 new_item.iSelectedImage = 3;
735 tree_insert.item = new_item;
736 TreeView_InsertItem(Standalone_goals,&tree_insert);
738 if(!(perm_goal_flags & (1<<3))){
740 tree_insert.hParent = Goal_items[1];
741 new_item.pszText = goal_name;
742 strcpy(new_item.pszText,
XSTR(
"none",920));
744 new_item.iSelectedImage = 3;
745 tree_insert.item = new_item;
746 TreeView_InsertItem(Standalone_goals,&tree_insert);
750 for(idx=0;idx<3;idx++){
751 TreeView_Expand(Standalone_goals,Goal_items[idx],TVE_EXPAND);
758 HTREEITEM update_item;
759 TV_ITEM setting,lookup;
760 int idx,should_update;
762 setting.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
771 if(update_item == NULL){
776 lookup.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
777 lookup.hItem = update_item;
778 if(!TreeView_GetItem(Standalone_goals,&lookup)){
787 if((lookup.iImage != 4) && (lookup.iSelectedImage != 4)){
789 setting.iSelectedImage = 4;
796 if((lookup.iImage != 2) && (lookup.iSelectedImage != 2)){
798 setting.iSelectedImage = 2;
806 if((lookup.iImage != 1) && (lookup.iSelectedImage != 1)){
808 setting.iSelectedImage = 1;
817 setting.hItem = update_item;
818 TreeView_SetItem(Standalone_goals,&setting);
830 SetWindowText(Standalone_FPS,fr);
837 SetWindowText(Standalone_mission_name,
"");
840 SetWindowText(Standalone_FPS,
"");
843 SetWindowText(Standalone_missiontime,
"");
846 SetWindowText(Std_ng_max_players,
"");
849 SetWindowText(Std_ng_max_observers,
"");
852 SetWindowText(Std_ng_security,
"");
855 SetWindowText(Std_ng_respawns,
"");
870 SetWindowText(Std_ng_max_players,buf);
874 SetWindowText(Std_ng_max_observers,buf);
878 SetWindowText(Std_ng_security,buf);
882 SetWindowText(Std_ng_respawns,buf);
892 pos = SendMessage(ctrl,TBM_GETPOS,(WPARAM)0,(
LPARAM)0);
909 Framecap_trackbar = CreateWindowEx(0,TRACKBAR_CLASS,NULL,WS_CHILD | WS_VISIBLE,
910 10,10,300,30,hwndDlg,NULL,GetModuleHandle(NULL),NULL);
914 lp = (
LPARAM)MAKELONG(1, 100);
915 SendMessage(Framecap_trackbar,TBM_SETRANGE,wp,lp);
920 SendMessage(Framecap_trackbar,TBM_SETPOS,wp,lp);
942 Standalone_mission_name = GetDlgItem(hwndDlg,(
int)MAKEINTRESOURCE(
IDC_MISSION_NAME));
945 Std_ng_max_players = GetDlgItem(hwndDlg,(
int)MAKEINTRESOURCE(
IDC_NG_MAXPLAYERS));
951 Std_ng_security = GetDlgItem(hwndDlg,(
int)MAKEINTRESOURCE(
IDC_NG_SECURITY));
954 Std_ng_respawns = GetDlgItem(hwndDlg,(
int)MAKEINTRESOURCE(
IDC_NG_RESPAWNS));
957 Goal_bitmaps = ImageList_Create(16,16,ILC_COLOR4 | ILC_MASK,5,0);
960 ref = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(
IDB_GOAL_ORD));
961 ImageList_AddMasked(Goal_bitmaps,ref,mask);
963 ref = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(
IDB_GOAL_INC));
965 ImageList_AddMasked(Goal_bitmaps,ref,mask);
967 ref = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(
IDB_GOAL_COMP));
969 ImageList_AddMasked(Goal_bitmaps,ref,mask);
971 ref = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(
IDB_GOAL_NONE));
973 ImageList_AddMasked(Goal_bitmaps,ref,mask);
975 ref = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(
IDB_GOAL_FAIL));
977 ImageList_AddMasked(Goal_bitmaps,ref,mask);
980 Standalone_goals = CreateWindowEx(0, WC_TREEVIEW,
XSTR(
"Tree View",921),
981 WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES,
983 hwndDlg, NULL, GetModuleHandle(NULL), NULL);
984 TreeView_SetImageList(Standalone_goals,Goal_bitmaps,TVSIL_NORMAL);
990 HTREEITEM ret,moveup;
996 lookup.mask = TVIF_TEXT;
997 lookup.pszText = goal_name_text;
999 strcpy(lookup.pszText,goal_string);
1004 moveup = TreeView_GetChild(Standalone_goals,Goal_items[type]);
1005 while(!done && moveup!=NULL){
1006 lookup.hItem = moveup;
1007 TreeView_GetItem(Standalone_goals,&lookup);
1008 if(strcmp(lookup.pszText,goal_string)==0){
1013 moveup = TreeView_GetNextItem(Standalone_goals,moveup,TVGN_NEXT);
1042 if(((LPNMHDR)lParam)->
code == PSN_SETACTIVE){
1044 }
else if ( (((LPNMHDR)lParam)->
code == PSN_APPLY) || (((LPNMHDR)lParam)->
code == PSN_RESET) ) {
1062 #define MAX_PLAYER_STAT_FIELDS 14 // the # of stats fields for a given set
1063 static HWND Player_name_list;
1064 static HWND Player_ship_type;
1065 static HWND Player_ping_time;
1070 #define STD_ADDSTRING(hwnd,val) { snprintf(txt,sizeof(txt)-1,"%d",(int)val); SetWindowText(hwnd,txt); }
1082 txt[
sizeof(txt)-1] =
'\0';
1151 if(SendMessage(Player_name_list,CB_GETCOUNT,(WPARAM)0,(
LPARAM)0) == 1){
1153 SendMessage(Player_name_list,CB_SETCURSEL,(WPARAM)0,(
LPARAM)0);
1166 loc = SendMessage(Player_name_list,CB_FINDSTRINGEXACT,(WPARAM)-1,(
LPARAM)(LPCTSTR)p->
m_player->
callsign);
1170 SendMessage(Player_name_list,CB_DELETESTRING,(WPARAM)loc,(
LPARAM)0);
1189 SetWindowText(Player_ping_time,sml_ping);
1198 SendMessage(Player_name_list,CB_RESETCONTENT,(WPARAM)0,(
LPARAM)0);
1201 SetWindowText(Player_ship_type,
"");
1202 SetWindowText(Player_ping_time,
"");
1206 SetWindowText(Player_stats[idx],
"");
1207 SetWindowText(Player_mstats[idx],
"");
1218 Player_ship_type = GetDlgItem(Page_handles[PLAYER_INFO_PAGE],(
int)MAKEINTRESOURCE(
IDC_PSHIP_TYPE));
1221 Player_ping_time = GetDlgItem(Page_handles[PLAYER_INFO_PAGE],(
int)MAKEINTRESOURCE(
IDC_PING_TIME));
1224 Player_stats[0] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_SCORE));
1225 Player_stats[1] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_KILL_COUNT));
1226 Player_stats[2] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_KILL_COUNT_BH));
1227 Player_stats[3] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_ASSISTS));
1228 Player_stats[4] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_PSHOTS));
1229 Player_stats[5] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_PHITS));
1230 Player_stats[6] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_PBHHITS));
1231 Player_stats[7] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_PPCT));
1232 Player_stats[8] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_PBHPCT));
1233 Player_stats[9] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_SSHOTS));
1234 Player_stats[10] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_SECHITS));
1235 Player_stats[11] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_SBHHITS));
1236 Player_stats[12] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_SPCT));
1237 Player_stats[13] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_SBHPCT));
1240 Player_mstats[0] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MSCORE));
1241 Player_mstats[1] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MKILL_COUNT));
1242 Player_mstats[2] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MKILL_COUNT_BH));
1243 Player_mstats[3] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MASSISTS));
1244 Player_mstats[4] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MPSHOTS));
1245 Player_mstats[5] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MPHITS));
1246 Player_mstats[6] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MPBHHITS));
1247 Player_mstats[7] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MPPCT));
1248 Player_mstats[8] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MPBHPCT));
1249 Player_mstats[9] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MSSHOTS));
1250 Player_mstats[10] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MSECHITS));
1251 Player_mstats[11] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MSBHHITS));
1252 Player_mstats[12] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MSPCT));
1253 Player_mstats[13] = GetDlgItem(Page_handles[PLAYER_INFO_PAGE], (
int)MAKEINTRESOURCE(
IDC_MSBHPCT));
1263 sel = SendMessage(Player_name_list,CB_GETCURSEL,(WPARAM)0,(
LPARAM)0);
1271 SendMessage(Player_name_list,CB_GETLBTEXT,(WPARAM)sel,(
LPARAM)player);
1274 return ((player[0] !=
'\0') && (strcmp(p->
m_player->
callsign,player) == 0)) ? 1 : 0;
1296 switch(HIWORD(wParam)){
1298 case CBN_SELCHANGE :
1300 val = SendMessage(Player_name_list,CB_GETCURSEL,(WPARAM)0,(
LPARAM)0);
1303 if(SendMessage(Player_name_list,CB_GETLBTEXT,(WPARAM)val,(
LPARAM)callsign) != CB_ERR){
1308 if(player_num != -1){
1320 if(((LPNMHDR)lParam)->
code == PSN_SETACTIVE){
1322 }
else if ( (((LPNMHDR)lParam)->
code == PSN_APPLY) || (((LPNMHDR)lParam)->
code == PSN_RESET) ) {
1323 PostMessage( Psht, WM_DESTROY, 0, 0 );
1339 #define GODSTUFF_MAX_ITEMS 19 // how many items we can fit on the chatbox at one time
1341 static HWND God_player_list;
1342 static HWND Godstuff_fps;
1343 static HWND Godstuff_broadcast_text;
1344 static HWND Godstuff_broadcast_button;
1345 static HWND Godstuff_player_messages;
1346 static HDC Godstuff_player_messages_HDC = 0;
1348 static int Godstuff_longest_message = 0;
1361 if(SendMessage(God_player_list,CB_GETCOUNT,(WPARAM)0,(
LPARAM)0) == 1){
1363 SendMessage(God_player_list,CB_SETCURSEL,(WPARAM)0,(
LPARAM)0);
1377 SendMessage(God_player_list,CB_DELETESTRING,(WPARAM)loc,(
LPARAM)0);
1389 SendMessage(Godstuff_broadcast_text,EM_GETLINE,(WPARAM)0,(
LPARAM)&txt[0]);
1392 if( txt[0] !=
'\0' ){
1400 SetWindowText(Godstuff_broadcast_text,
"");
1411 SetWindowText(Godstuff_fps,fr);
1418 SetWindowText(Godstuff_fps,
"0");
1421 SetWindowText(Godstuff_broadcast_text,
"");
1424 SendMessage(God_player_list, CB_RESETCONTENT, (WPARAM)0, (
LPARAM)0);
1427 SendMessage(Godstuff_player_messages, LB_RESETCONTENT, (WPARAM)0, (
LPARAM)0);
1437 Godstuff_fps = GetDlgItem(Page_handles[GODSTUFF_PAGE], (
int)MAKEINTRESOURCE(
IDC_GODSTUFF_FPS));
1440 Godstuff_broadcast_text = GetDlgItem(Page_handles[GODSTUFF_PAGE], (
int)MAKEINTRESOURCE(
IDC_GODSTUFF_BROADCAST));
1442 SendMessage(Godstuff_broadcast_text, EM_FMTLINES, (WPARAM)
TRUE, (
LPARAM)0);
1445 Godstuff_player_messages = GetDlgItem(Page_handles[GODSTUFF_PAGE], (
int)MAKEINTRESOURCE(
IDC_GOD_CHAT));
1447 if (!Godstuff_player_messages_HDC)
1448 Godstuff_player_messages_HDC = GetDC(Godstuff_player_messages);
1450 Godstuff_longest_message = 0;
1453 Godstuff_broadcast_button = GetDlgItem(Page_handles[GODSTUFF_PAGE], (
int)MAKEINTRESOURCE(
IDC_GODSTUFF_SENDMESS));
1455 ShowWindow(Godstuff_broadcast_button, SW_HIDE);
1480 if (Godstuff_player_messages_HDC) {
1481 ReleaseDC(Godstuff_player_messages, Godstuff_player_messages_HDC);
1490 if(((LPNMHDR)lParam)->
code == PSN_SETACTIVE){
1492 }
else if ( (((LPNMHDR)lParam)->
code == PSN_APPLY) || (((LPNMHDR)lParam)->
code == PSN_RESET) ) {
1493 PostMessage( Psht, WM_DESTROY, 0, 0 );
1502 switch ( HIWORD(wParam) )
1506 switch ( LOWORD(wParam) )
1532 static HWND Standalone_state_string;
1533 static HWND Standalone_multilog_string = NULL;
1542 SetWindowText(Standalone_state_string,str);
1549 if ( !str || !strlen(str) ) {
1553 if (Standalone_multilog_string == NULL) {
1560 size_t nline = log_str.find(
'\n');
1562 while (nline != SCP_string::npos) {
1563 log_str[nline] =
'\0';
1565 SendMessage(Standalone_multilog_string, LB_ADDSTRING, 0, (
LPARAM)log_str.c_str());
1568 uint h_size = SendMessage(Standalone_multilog_string, LB_GETHORIZONTALEXTENT, 0, 0);
1570 if ( (h_size / 6) < log_str.size() ) {
1571 SendMessage(Standalone_multilog_string, LB_SETHORIZONTALEXTENT, log_str.size() * 6, 0);
1575 int l_count = SendMessage(Standalone_multilog_string, LB_GETCOUNT, 0, 0);
1577 if ( (l_count > 0) && (l_count >= 100) ) {
1578 SendMessage(Standalone_multilog_string, LB_DELETESTRING, 0, 0);
1582 log_str.erase(0, nline+1);
1583 nline = log_str.find(
'\n');
1586 if ( (nline+1) == log_str.size() ) {
1606 SetWindowText(Standalone_state_string,
"");
1609 Standalone_multilog_string = GetDlgItem(hwndDlg, (
int)MAKEINTRESOURCE(
IDC_MULTILOG));
1610 SendMessage(Standalone_multilog_string, LB_RESETCONTENT, 0, 0);
1630 if(((LPNMHDR)lParam)->
code == PSN_SETACTIVE){
1632 }
else if ( (((LPNMHDR)lParam)->
code == PSN_APPLY) || (((LPNMHDR)lParam)->
code == PSN_RESET) ) {
1633 Standalone_multilog_string = NULL;
1634 PostMessage( Psht, WM_DESTROY, 0, 0 );
1811 int num_items,ret_val;
1813 SIZE text_size = { 0, 0 };
1816 if (player_index == -1)
1831 if (Godstuff_player_messages_HDC)
1832 GetTextExtentPoint32(Godstuff_player_messages_HDC, format, strlen(format), &text_size);
1834 if (Godstuff_longest_message < text_size.cx)
1835 Godstuff_longest_message = (
int)text_size.cx;
1837 SendMessage(Godstuff_player_messages, LB_SETHORIZONTALEXTENT, (WPARAM)Godstuff_longest_message, (
LPARAM)0);
1840 if (Godstuff_player_messages_HDC)
1841 GetTextExtentPoint32(Godstuff_player_messages_HDC, format, strlen(format), &text_size);
1843 if (Godstuff_longest_message < text_size.cx)
1844 Godstuff_longest_message = (
int)text_size.cx;
1846 SendMessage(Godstuff_player_messages, LB_SETHORIZONTALEXTENT, (WPARAM)Godstuff_longest_message, (
LPARAM)0);
1849 SendMessage(Godstuff_player_messages, LB_INSERTSTRING, (WPARAM)-1, (
LPARAM)format);
1851 num_items = SendMessage(Godstuff_player_messages, LB_GETCOUNT, (WPARAM)0, (
LPARAM)0);
1853 if (num_items > 19) {
1854 ret_val = SendMessage(Godstuff_player_messages, LB_SETTOPINDEX, (WPARAM)num_items -
GODSTUFF_MAX_ITEMS, (
LPARAM)0);
1867 HWND ok_button = NULL;
1868 HWND cancel_button = NULL;
1869 HWND apply_button = NULL;
1870 HWND help_button = NULL;
1874 HWND child = GetWindow(Psht,GW_CHILD);
1875 while(child != NULL){
1877 memset(lookup,0,512);
1878 GetWindowText(child,lookup,511);
1887 cancel_button = child;
1892 apply_button = child;
1897 help_button = child;
1900 child = GetWindow(child,GW_HWNDNEXT);
1904 if(apply_button != NULL){
1905 DestroyWindow(apply_button);
1909 if(ok_button != NULL){
1911 SetWindowText(ok_button,
XSTR(
"Shutdown",929));
1914 SetWindowPos(ok_button,
1919 SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOZORDER
1924 if(cancel_button != NULL){
1925 DestroyWindow(cancel_button);
1929 if(help_button != NULL){
1930 DestroyWindow(help_button);
1976 p->dwSize =
sizeof(PROPSHEETPAGE);
1977 p->dwFlags = PSP_DEFAULT;
1978 p->hInstance = GetModuleHandle(NULL);
1982 p->pszTitle =
XSTR(
"Connections",930);
1984 p->pfnCallback = NULL;
1988 p->dwSize =
sizeof(PROPSHEETPAGE);
1989 p->dwFlags = PSP_DEFAULT;
1990 p->hInstance = GetModuleHandle(NULL);
1991 p->pszTemplate = MAKEINTRESOURCE(
IDD_MULTI);
1994 p->pszTitle =
XSTR(
"Multi-Player",931);
1996 p->pfnCallback = NULL;
2000 p->dwSize =
sizeof(PROPSHEETPAGE);
2001 p->dwFlags = PSP_DEFAULT;
2002 p->hInstance = GetModuleHandle(NULL);
2006 p->pszTitle =
XSTR(
"Player info",932);
2008 p->pfnCallback = NULL;
2012 p->dwSize =
sizeof(PROPSHEETPAGE);
2013 p->dwFlags = PSP_DEFAULT;
2014 p->hInstance = GetModuleHandle(NULL);
2018 p->pszTitle =
XSTR(
"God Stuff",933);
2020 p->pfnCallback = NULL;
2024 p->dwSize =
sizeof(PROPSHEETPAGE);
2025 p->dwFlags = PSP_DEFAULT;
2026 p->hInstance = GetModuleHandle(NULL);
2030 p->pszTitle =
XSTR(
"Debug",934);
2032 p->pfnCallback = NULL;
2042 memset(ver_str, 0,
sizeof(ver_str));
2053 memset(temp, 0, 256);
2055 snprintf(temp,
sizeof(temp)-1,
"%s %s",
XSTR(
"FreeSpace Standalone", 935), ver_str);
2070 Sheet.dwSize =
sizeof(PROPSHEETHEADER);
2071 Sheet.dwFlags = PSH_PROPSHEETPAGE | PSH_MODELESS | PSH_NOAPPLYNOW;
2072 Sheet.hwndParent = hwndDlg;
2073 Sheet.hInstance = GetModuleHandle(NULL);
2081 Sheet.nStartPage = 0;
2082 Sheet.ppsp = &Pages[0];
2083 Sheet.pfnCallback = NULL;
2084 Psht = (
HWND)PropertySheet(&Sheet);
2087 styles = GetWindowLong(Psht, GWL_STYLE );
2088 if ( styles != 0 ) {
2089 SetWindowLong(Psht, GWL_STYLE, styles | WS_MINIMIZEBOX);
2092 styles = GetWindowLong(Psht, GWL_EXSTYLE );
2093 if ( styles != 0 ) {
2094 SetWindowLong( Psht, GWL_EXSTYLE, (styles & ~WS_EX_CONTEXTHELP) );
2106 static HMENU std_create_systray_menu()
2109 memset(tstr, 0,
sizeof(tstr));
2111 HMENU stdPopup = CreatePopupMenu();
2114 snprintf(tstr,
sizeof(tstr)-1,
"Connection Type: %s",
MULTI_IS_TRACKER_GAME ?
"FS2NetD" :
"Local/IP");
2115 AppendMenu(stdPopup, MF_STRING | MF_GRAYED, 0, tstr);
2119 snprintf(tstr,
sizeof(tstr)-1,
"FS2NetD Status: %s",
fs2netd_is_online() ?
"Online" :
"Offline");
2120 AppendMenu(stdPopup, MF_STRING | MF_GRAYED, 0, tstr);
2124 AppendMenu(stdPopup, MF_SEPARATOR, 0, NULL);
2127 snprintf(tstr,
sizeof(tstr)-1,
"Name: %s",
Netgame.
name);
2128 AppendMenu(stdPopup, MF_STRING | MF_GRAYED, 0, tstr);
2132 AppendMenu(stdPopup, MF_STRING | MF_GRAYED, 0, tstr);
2136 AppendMenu(stdPopup, MF_STRING | MF_GRAYED, 0, tstr);
2139 AppendMenu(stdPopup, MF_SEPARATOR, 0, NULL);
2142 AppendMenu(stdPopup, MF_STRING,
STP_RESET_ALL,
"Reset All");
2150 AppendMenu(stdPopup, MF_STRING,
STP_SHUTDOWN,
"Shutdown");
2153 AppendMenu(stdPopup, MF_SEPARATOR, 0, NULL);
2156 AppendMenu(stdPopup, MF_STRING,
STP_SHOW,
"Show Window");
2165 case WM_SYSCOMMAND: {
2166 if (wParam == SC_MINIMIZE) {
2169 }
else if (wParam == SC_RESTORE) {
2178 if (lParam == WM_LBUTTONDBLCLK) {
2181 }
else if (lParam == WM_RBUTTONUP) {
2182 HMENU stdPopup = std_create_systray_menu();
2185 GetCursorPos(&cur_pos);
2187 SetForegroundWindow(Standalone_hwnd);
2189 int choice = TrackPopupMenuEx(stdPopup, TPM_RETURNCMD | TPM_NONOTIFY, cur_pos.
x, cur_pos.
y, Standalone_hwnd, NULL);
2191 SendMessage(Standalone_hwnd, WM_NULL, 0, 0);
2193 DestroyMenu(stdPopup);
2205 PostMessage(Psht, WM_DESTROY, 0, 0);
2209 SendMessage(Standalone_hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
2219 PostMessage(Psht, WM_DESTROY, 0, 0);
2223 return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
2235 HINSTANCE hInst = GetModuleHandle(NULL);
2237 memset( &wclass, 0,
sizeof(WNDCLASSEX) );
2239 wclass.hInstance = hInst;
2240 wclass.lpszClassName =
"FS2StandaloneClass";
2242 wclass.style = CS_OWNDC;
2243 wclass.cbSize =
sizeof(WNDCLASSEX);
2244 wclass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(
IDI_APP_ICON) );
2245 wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
2246 wclass.lpszMenuName = NULL;
2247 wclass.cbClsExtra = 0;
2248 wclass.cbWndExtra = 0;
2249 wclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
2251 if ( !RegisterClassEx(&wclass) ) {
2255 Standalone_hwnd = CreateWindowEx(0,
"FS2StandaloneClass",
"FreeSpace2 Standalone",
2256 WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, 10, 10,
2257 NULL, NULL, hInst, NULL);
2271 PropSheet_SetCurSel(Psht,(HPROPSHEETPAGE)&Pages[idx],idx);
2291 Standalone_minimized =
FALSE;
2296 static void standalone_do_systray(
int mode)
2302 memset(&nid, 0,
sizeof(nid));
2304 nid.cbSize =
sizeof(nid);
2305 nid.hWnd = Standalone_hwnd;
2308 nid.hIcon = LoadIcon( GetModuleHandle(NULL), MAKEINTRESOURCE(
IDI_APP_ICON) );
2309 strncpy(nid.szTip,
Netgame.
name,
sizeof(nid.szTip));
2310 nid.uFlags = (NIF_MESSAGE | NIF_ICON | NIF_TIP);
2313 if (Standalone_minimized) {
2318 Shell_NotifyIcon(NIM_ADD, &nid);
2321 GetWindowRect(GetDesktopWindow(), &trayRect);
2322 GetWindowRect(Psht, &stdRect);
2324 trayRect.left = trayRect.right;
2325 trayRect.top = trayRect.bottom;
2327 DrawAnimatedRects(Psht, IDANI_CAPTION, &stdRect, &trayRect);
2330 ShowWindow(Psht, SW_HIDE);
2331 Standalone_minimized =
TRUE;
2333 if ( !Standalone_minimized ) {
2337 Shell_NotifyIcon(NIM_MODIFY, &nid);
2339 if ( !Standalone_minimized ) {
2343 Shell_NotifyIcon(NIM_DELETE, &nid);
2344 ShowWindow(Psht, SW_RESTORE);
2345 SetForegroundWindow(Psht);
2346 Standalone_minimized =
FALSE;
2360 if(PropSheet_GetCurrentPageHwnd(Psht)==NULL){
2361 mprintf((
"prop sheet is destroyed -- exiting\n"));
2362 DestroyWindow(Psht);
2369 if ( WaitMessage() ) {
2370 while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) {
2372 if ( msg.message == WM_DESTROY ) {
2374 DestroyWindow(Psht);
2375 DestroyWindow(Standalone_hwnd);
2382 if ( (msg.message == WM_NCLBUTTONDOWN) && (msg.wParam == HTMINBUTTON) ) {
2389 if ( msg.hwnd == Godstuff_broadcast_text ) {
2392 virt_key = (
int)msg.wParam;
2393 if ( (msg.message == WM_KEYDOWN) && (virt_key == VK_RETURN) ) {
2399 if ( !PropSheet_IsDialogMessage(Psht, &msg) ) {
2400 TranslateMessage(&msg);
2401 DispatchMessage(&msg);
void std_connect_clear_controls()
#define STD_NG_UPDATE_TIME
GLenum GLsizei GLenum format
int timestamp(int delta_ms)
void multi_update_valid_missions()
#define MY_NET_PLAYER_NUM
HWND Multi_std_host_passwd
void fs2netd_gameserver_start()
void std_add_player(net_player *p)
int cf_delete(const char *filename, int path_type)
Delete the specified file.
void std_connect_handle_name_change()
int Cmdline_freespace_no_music
void std_connect_set_host_connect_status()
void outwnd_init(int display_under_freespace_window)
#define MAX_PLAYER_STAT_FIELDS
void std_debug_clear_controls()
void std_gs_init_godstuff_controls(HWND hwndDlg)
#define MULTI_STANDALONE(np)
void std_init_property_pages()
#define STP_RESET_FS2NETD
#define STD_ADDSTRING(hwnd, val)
BOOL CALLBACK player_info_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
#define GR_NUM_RESOLUTIONS
#define MULTI_VALID_MISSION_FILE
void std_multi_update_goals()
int std_connect_set_connect_count()
unsigned int mp_shots_fired
void std_notify_tracker_login_fail()
unsigned int mp_bonehead_hits
void os_init_registry_stuff(const char *company, const char *app, const char *version)
void std_debug_multilog_add_line(const char *str)
void fs2netd_gameserver_disconnect()
#define IDC_STD_HOST_PASSWD
unsigned int ms_bonehead_hits
UINT WPARAM LPARAM lParam
void std_pinfo_remove_player_list_item(net_player *p)
void std_connect_set_ip_string(char *lookup, char *string)
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
unsigned int s_shots_fired
void std_pinfo_display_player_info(net_player *p)
#define GODSTUFF_MAX_ITEMS
void std_pinfo_update_ping(net_player *p)
char Standalone_ban_list[STANDALONE_MAX_BAN][CALLSIGN_LEN+1]
GLenum GLuint GLenum GLsizei const GLchar * buf
mission_goal Mission_goals[MAX_GOALS]
void std_gs_send_godstuff_message()
char callsign[CALLSIGN_LEN+1]
unsigned int mp_shots_hit
void std_gs_add_god_player(net_player *p)
const char * Osreg_app_name
void std_connect_update_ping(net_player *p)
void std_multi_clear_controls()
void std_multi_init_framecap_slider(HWND hwndDlg)
unsigned int ms_shots_fired
#define STANDALONE_MAX_BAN
void std_debug_init_debug_controls(HWND hwndDlg)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
BOOL CALLBACK multi_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
void game_format_time(long, char *)
#define IDC_STANDALONE_MTIME
void multi_kick_player(int player_index, int ban, int reason)
void std_multi_init_multi_controls(HWND hwndDlg)
multi_server_options options
int std_pinfo_maybe_update_player_info(net_player *p)
char name[MAX_GAMENAME_LEN+1]
BOOL CALLBACK godstuff_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
void send_game_chat_packet(net_player *from, const char *msg, int msg_mode, net_player *to, const char *expr, int server_msg)
void fs2netd_reset_connection()
unsigned int p_shots_fired
#define IDC_FRAMECAP_STATIC
void std_gen_set_text(char *str, int field_num)
DWORD standalone_process(WORD lparam)
void std_pinfo_init_player_info_controls(HWND hwndDlg)
void std_pinfo_add_player_list_item(net_player *p)
void std_reset_timestamps()
int std_pinfo_player_is_active(net_player *p)
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
void std_connect_add_ip_string(char *string)
#define IDC_MKILL_COUNT_BH
void std_create_gen_dialog(char *title)
void std_multi_handle_framecap_scroll(HWND ctrl)
void std_multi_setup_goal_tree()
void std_build_title_string(char *str)
void std_add_ban(const char *name)
net_player_server_info s_info
char mission_name[NAME_LENGTH+1]
void std_connect_handle_passwd_change()
void std_multi_add_goals()
void std_deinit_standalone()
BOOL CALLBACK std_gen_dialog_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
void std_update_player_ping(net_player *p)
BOOL CALLBACK debug_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
int multi_find_player_by_callsign(const char *callsign)
int std_player_is_banned(const char *name)
void std_multi_set_standalone_missiontime(float mission_time)
const char * XSTR(const char *str, int index)
void std_multi_update_netgame_info_controls()
void std_gs_set_framerate(float f)
typedef HDC(WINAPI *PFNWGLGETCURRENTREADDCARBPROC)(void)
void std_init_standalone()
DWORD Standalone_thread_id
void std_add_chat_text(const char *text, int player_index, int add_id)
void std_connect_set_gamename(char *name)
int Standalone_stats_stamp
#define IDC_GODSTUFF_BROADCAST
GLuint const GLchar * name
BOOL CALLBACK connect_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
#define IDD_PLAYER_DIALOG
const char * Osreg_company_name
int multi_quit_game(int prompt, int notify_code, int err_code, int wsa_error)
HTREEITEM std_multi_get_goal_item(char *goal_string, int type)
#define IDC_STANDALONE_FPS
int std_remove_player(net_player *p)
void std_debug_set_standalone_state_string(char *str)
HWND std_init_property_sheet(HWND hwndDlg)
#define IDC_PLAYER_GOD_LIST
int Cmdline_freespace_no_sound
#define MULTI_CONNECTED(np)
#define IDC_NG_MAXOBSERVERS
#define STD_STATS_UPDATE_TIME
void std_multi_set_framerate(float f)
int Multi_std_namechange_force
#define IDC_NG_MAXPLAYERS
void std_gs_clear_controls()
unsigned int p_bonehead_hits
SCP_vector< ship_info > Ship_info
char std_pname[STD_NAME_LEN+1]
void std_connect_kick_player()
#define timestamp_elapsed(stamp)
#define IDC_STANDALONE_STATE
void std_connect_remove_ip_string(char *string)
void std_reset_standalone_gui()
void std_set_standalone_fps(float fps)
#define IDC_GODSTUFF_SENDMESS
#define IDC_KILL_COUNT_BH
BOOL std_create_standalone_window()
void std_pinfo_clear_controls()
char * psnet_addr_to_string(char *text, net_addr *address)
void std_destroy_gen_dialog()
void std_multi_set_standalone_mission_name(char *mission_name)
#define MULTI_IS_TRACKER_GAME
net_player Net_players[MAX_PLAYERS]
unsigned int ms_shots_hit
void gameseq_post_event(int event)
multi_global_options Multi_options_g
#define MAX_STANDALONE_PAGES
unsigned int s_bonehead_hits
BOOL CALLBACK std_message_handler_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
char std_passwd[STD_PASSWD_LEN+1]
int std_connect_lindex_to_npindex(int index)
void std_gs_remove_god_player(net_player *p)