2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on the
11 #include "stand_gui.h"
12 #include "osregistry.h"
14 #include "wx/statline.h"
15 #include "wx/filename.h"
16 #include "wx/stdpaths.h"
18 #include "wx/msgdlg.h"
19 #include "wx/process.h"
22 // taken from psnet.h and psnet2.h
24 #define DEFAULT_GAME_PORT 4000
25 #elif defined(FS2_DEMO)
26 #define DEFAULT_GAME_PORT 7802
28 #define DEFAULT_GAME_PORT 7808
33 IMPLEMENT_APP(StandaloneApp)
35 bool StandaloneApp::OnInit()
37 if ( !wxApp::OnInit() ) {
41 std_client = new Standalone(NULL);
44 if ( !std_client->startFreeSpace(argc, argv) ) {
45 throw "Unable to start FreeSpace";
50 if ( !std_client->wsInitialize() ) {
51 throw "Unable to initialize WebSocket";
53 } catch (const char *err) {
54 wxMessageBox(err, "Error!");
59 std_client->Show(true);
60 SetTopWindow(std_client);
65 StandaloneTimer::StandaloneTimer(Standalone *stand)
70 StandaloneTimer::~StandaloneTimer()
74 void StandaloneTimer::Notify()
79 StandPopup::StandPopup( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
81 this->SetSizeHints( wxSize( 350,100 ), wxDefaultSize );
84 bSizer2 = new wxBoxSizer( wxVERTICAL );
86 wxFlexGridSizer* fgSizer3;
87 fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
88 fgSizer3->AddGrowableRow(0, 1);
90 m_Label1 = new wxStaticText( this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
92 fgSizer3->Add( m_Label1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
94 m_Label2 = new wxStaticText( this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
96 fgSizer3->Add( m_Label2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
99 bSizer2->Add( fgSizer3, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 10 );
102 this->SetSizer( bSizer2 );
104 bSizer2->Fit( this );
106 this->Centre( wxBOTH );
109 StandPopup::~StandPopup()
113 wxBEGIN_EVENT_TABLE(Standalone, wxDialog)
114 EVT_CLOSE(Standalone::OnClose)
115 EVT_BUTTON(ID_B_SHUTDOWN, Standalone::OnShutdown)
116 EVT_BUTTON(ID_B_KICK, Standalone::OnKick)
117 EVT_BUTTON(ID_B_MREFRESH, Standalone::OnMissionRefresh)
118 EVT_BUTTON(ID_B_RESET_ALL, Standalone::OnResetAll)
119 EVT_SLIDER(ID_FPS_SLIDER, Standalone::OnFPSSel)
120 EVT_TEXT_ENTER(ID_T_MSG, Standalone::OnServerMsg)
121 EVT_TEXT_ENTER(ID_T_SERVER_NAME, Standalone::OnServerNameChange)
122 EVT_TEXT_ENTER(ID_T_HOST_PASS, Standalone::OnHostPassChange)
125 Standalone::Standalone( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
127 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
130 fsport = DEFAULT_GAME_PORT;
131 stand_context = NULL;
132 wsi_standalone = NULL;
135 m_timer = new StandaloneTimer(this);
136 m_timer->Start(1000/30);
138 m_popup = new StandPopup(this);
139 m_popup->Show(false);
142 bSizer1 = new wxBoxSizer( wxVERTICAL );
144 wxNotebook* nbook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
146 createTab_Server(nbook);
147 createTab_Multi(nbook);
148 createTab_Player(nbook);
149 createTab_GodStuff(nbook);
150 createTab_Debug(nbook);
152 bSizer1->Add( nbook, 1, wxEXPAND | wxALL, 5 );
154 wxButton* bshutdown = new wxButton( this, ID_B_SHUTDOWN, wxT("Shutdown"), wxDefaultPosition, wxDefaultSize, 0 );
155 bSizer1->Add( bshutdown, 0, wxALIGN_CENTER|wxALL, 5 );
158 this->SetSizer( bSizer1 );
160 bSizer1->SetSizeHints(this);
162 this->Centre( wxBOTH );
165 Standalone::~Standalone()
170 void Standalone::OnClose( wxCloseEvent& WXUNUSED(event) )
175 void Standalone::OnShutdown( wxCommandEvent& WXUNUSED(event) )
180 void Standalone::Shutdown()
183 std::string msg("shutdown");
186 lws_service(stand_context, 50);
188 lws_context_destroy(stand_context);
191 if ( wxProcess::Exists(fspid) ) {
192 // wait a little bit, and if process still exists then kill it
195 if ( wxProcess::Exists(fspid) ) {
196 wxProcess::Kill(fspid, wxSIGTERM);
203 void Standalone::OnServerNameChange(wxCommandEvent& WXUNUSED(event) )
205 std::string msg("S:name ");
207 msg.append( m_S_ServerName->GetValue().c_str() );
212 void Standalone::OnHostPassChange(wxCommandEvent& WXUNUSED(event) )
214 std::string msg("S:pass ");
216 msg.append( m_S_HostPass->GetValue().c_str() );
221 void Standalone::OnKick( wxCommandEvent& WXUNUSED(event) )
223 std::string msg("S:kick ");
225 wxString id = m_S_Connections->GetStringSelection();
227 if ( id.IsEmpty() ) {
231 wxArrayString ipaddr = wxSplit(id, ',');
233 msg.append( ipaddr.Item(0).c_str() );
238 void Standalone::OnMissionRefresh( wxCommandEvent& WXUNUSED(event) )
240 std::string msg("G:mrefresh");
245 void Standalone::OnResetAll( wxCommandEvent& WXUNUSED(event) )
250 void Standalone::OnFPSSel( wxCommandEvent& WXUNUSED(event) )
252 wxString fps = wxString::Format("%d", m_M_sliderFPS->GetValue());
254 m_M_FPS->SetLabel(fps);
256 std::string msg("M:fps ");
262 void Standalone::OnServerMsg( wxCommandEvent& WXUNUSED(event) )
264 if ( m_GS_msg->GetValue().IsEmpty() ) {
268 std::string msg("G:smsg ");
270 msg.append( m_GS_msg->GetValue().c_str() );
272 // strip off return char which GetValue() has
273 size_t pos = msg.find_last_not_of("\r\n");
275 if (pos != std::string::npos) {
284 void Standalone::createTab_Server(wxNotebook* parent)
286 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
288 wxBoxSizer *panelSizer = new wxBoxSizer( wxVERTICAL );
290 wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
292 wxFlexGridSizer* fgSizer5 = new wxFlexGridSizer( 0, 2, 0, 0 );
293 fgSizer5->AddGrowableCol(1, 1);
295 wxStaticText* m_staticText6 = new wxStaticText( panel, wxID_ANY, wxT("Server Name"), wxDefaultPosition, wxDefaultSize, 0 );
296 fgSizer5->Add( m_staticText6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
298 m_S_ServerName = new wxTextCtrl( panel, ID_T_SERVER_NAME, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
299 m_S_ServerName->SetMaxLength( 31 );
300 fgSizer5->Add( m_S_ServerName, 0, wxALL|wxEXPAND, 5 );
302 wxStaticText* m_staticText7 = new wxStaticText( panel, wxID_ANY, wxT("Host Password"), wxDefaultPosition, wxDefaultSize, 0 );
303 fgSizer5->Add( m_staticText7, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
305 m_S_HostPass = new wxTextCtrl( panel, ID_T_HOST_PASS, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
306 m_S_HostPass->SetMaxLength( 16 );
307 fgSizer5->Add( m_S_HostPass, 0, wxALL|wxEXPAND, 5 );
309 bSizer->Add( fgSizer5, 0, wxEXPAND, 0 );
311 wxStaticLine* m_staticline1 = new wxStaticLine( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
312 bSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
314 wxFlexGridSizer* fgSizer7 = new wxFlexGridSizer( 0, 2, 0, 0 );
315 fgSizer7->SetFlexibleDirection( wxBOTH );
316 fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
318 wxStaticText* m_staticText9 = new wxStaticText( panel, wxID_ANY, wxT("# Connections :"), wxDefaultPosition, wxDefaultSize, 0 );
319 fgSizer7->Add( m_staticText9, 0, wxALL, 5 );
321 m_S_NumConn = new wxStaticText( panel, wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, 0|wxSUNKEN_BORDER );
322 fgSizer7->Add( m_S_NumConn, 0, wxALL, 5 );
324 bSizer->Add( fgSizer7, 0, wxEXPAND, 5 );
326 wxStaticText* m_staticText8 = new wxStaticText( panel, wxID_ANY, wxT("Address and Ping"), wxDefaultPosition, wxDefaultSize, 0 );
327 bSizer->Add( m_staticText8, 0, wxALL, 5 );
329 wxFlexGridSizer* fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
330 fgSizer3->SetFlexibleDirection( wxBOTH );
331 fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
333 m_S_Connections = new wxTextCtrl( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 300,300 ), wxTE_MULTILINE|wxTE_READONLY );
334 fgSizer3->Add( m_S_Connections, 0, wxALL|wxEXPAND, 5 );
336 wxBoxSizer* bbSizer = new wxBoxSizer( wxVERTICAL );
338 m_S_btnKick = new wxButton( panel, ID_B_KICK, wxT("Kick"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
339 bbSizer->Add( m_S_btnKick, 1, wxALL, 5 );
341 m_S_btnMRefresh = new wxButton( panel, ID_B_MREFRESH, wxT(" Refresh\nMissions"), wxDefaultPosition, wxDefaultSize, 0 );
342 bbSizer->Add( m_S_btnMRefresh, 2, wxALL, 5 );
344 m_S_btnResetAll = new wxButton( panel, ID_B_RESET_ALL, wxT("Reset All"), wxDefaultPosition, wxDefaultSize, 0 );
345 bbSizer->Add( m_S_btnResetAll, 3, wxALL, 5 );
347 fgSizer3->Add( bbSizer, 1, wxEXPAND, 5 );
349 bSizer->Add( fgSizer3, 0, wxEXPAND, 5 );
351 panelSizer->Add( bSizer, 1, wxALL|wxEXPAND, 5 );
353 panel->SetSizer( panelSizer );
354 panelSizer->Fit( panel );
355 panelSizer->SetSizeHints( panel );
357 parent->AddPage( panel, wxT("Server"), true );
360 void Standalone::createTab_Multi(wxNotebook* parent)
362 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
364 wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL);
366 wxBoxSizer* bSizer = new wxBoxSizer(wxVERTICAL);
368 m_M_sliderFPS = new wxSlider( panel, ID_FPS_SLIDER, 30, 15, 60, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL );
369 bSizer->Add( m_M_sliderFPS, 0, wxALL|wxEXPAND, 5 );
371 wxFlexGridSizer* fgSizer8;
372 fgSizer8 = new wxFlexGridSizer( 0, 5, 0, 0 );
373 fgSizer8->AddGrowableCol(2, 1);
375 wxStaticText* m_staticText71 = new wxStaticText( panel, wxID_ANY, wxT("Frame Cap : "), wxDefaultPosition, wxDefaultSize, 0 );
376 m_staticText71->Wrap( -1 );
377 fgSizer8->Add( m_staticText71, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
379 wxPanel* fpsPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
380 wxBoxSizer* fpsSizer = new wxBoxSizer(wxHORIZONTAL);
381 m_M_FPS = new wxStaticText( fpsPanel, wxID_ANY, "30", wxDefaultPosition, wxSize(60, -1), 0 );
383 fpsSizer->Add( m_M_FPS, 0, wxALL, 2 );
384 fpsPanel->SetSizer(fpsSizer);
385 fpsSizer->Fit(fpsPanel);
386 fgSizer8->Add(fpsPanel, 0, wxALL, 3);
389 fgSizer8->Add( 0, 0, 1, wxEXPAND );
391 wxStaticText* m_staticText81 = new wxStaticText( panel, wxID_ANY, wxT("Realized FPS : "), wxDefaultPosition, wxDefaultSize, 0 );
392 m_staticText81->Wrap( -1 );
393 fgSizer8->Add( m_staticText81, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
395 wxPanel*fpscapPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
396 wxBoxSizer* fpscapSizer = new wxBoxSizer(wxHORIZONTAL);
397 m_M_FPSRel = new wxStaticText( fpscapPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(60, -1), 0 );
398 m_M_FPSRel->Wrap( -1 );
399 fpscapSizer->Add( m_M_FPSRel, 0, wxALL, 2 );
400 fpscapPanel->SetSizer(fpscapSizer);
401 fpscapSizer->Fit(fpscapPanel);
402 fgSizer8->Add(fpscapPanel, 0, wxALL, 3);
405 bSizer->Add( fgSizer8, 0, wxEXPAND, 5 );
407 wxStaticLine* m_staticline2 = new wxStaticLine( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
408 bSizer->Add( m_staticline2, 0, wxEXPAND | wxALL, 5 );
411 bSizer->Add( 0, 0, 0, wxALL, 20 );
414 wxFlexGridSizer* fgSizer9;
415 fgSizer9 = new wxFlexGridSizer( 0, 2, 0, 0 );
416 fgSizer9->SetFlexibleDirection( wxBOTH );
417 fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
419 wxStaticText* m_staticText91 = new wxStaticText( panel, wxID_ANY, wxT("Mission Name : "), wxDefaultPosition, wxDefaultSize, 0 );
420 m_staticText91->Wrap( -1 );
421 fgSizer9->Add( m_staticText91, 0, wxALL, 5 );
423 wxPanel* mnPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
424 wxBoxSizer* mnSizer = new wxBoxSizer(wxHORIZONTAL);
425 m_M_MissionName = new wxStaticText( mnPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(150, -1), 0 );
426 m_M_MissionName->Wrap( -1 );
427 mnSizer->Add( m_M_MissionName, 0, wxALL, 2 );
428 mnPanel->SetSizer(mnSizer);
429 mnSizer->Fit(mnPanel);
430 fgSizer9->Add(mnPanel, 0, wxALL, 3);
432 wxStaticText* m_staticText101 = new wxStaticText( panel, wxID_ANY, wxT("Mission Time : "), wxDefaultPosition, wxDefaultSize, 0 );
433 m_staticText101->Wrap( -1 );
434 fgSizer9->Add( m_staticText101, 0, wxALL, 5 );
436 wxPanel* mtPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
437 wxBoxSizer* mtSizer = new wxBoxSizer(wxHORIZONTAL);
438 m_M_MissionTime = new wxStaticText( mtPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(150, -1), 0 );
439 m_M_MissionTime->Wrap( -1 );
440 mtSizer->Add( m_M_MissionTime, 0, wxALL, 2 );
441 mtPanel->SetSizer(mtSizer);
442 mtSizer->Fit(mtPanel);
443 fgSizer9->Add(mtPanel, 0, wxALL, 3);
446 bSizer->Add( fgSizer9, 0, wxEXPAND, 5 );
449 bSizer->Add( 0, 0, 0, wxALL, 20 );
451 wxBoxSizer* bSizer3 = new wxBoxSizer(wxHORIZONTAL);
453 wxBoxSizer* bSizer4 = new wxBoxSizer(wxVERTICAL);
455 wxStaticText* m_staticText11 = new wxStaticText( panel, wxID_ANY, wxT("Mission Goals"), wxDefaultPosition, wxDefaultSize, 0 );
456 m_staticText11->Wrap( -1 );
457 bSizer4->Add( m_staticText11, 0, wxALL, 5 );
459 m_M_Goals = new wxTreeCtrl( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT );
460 bSizer4->Add( m_M_Goals, 1, wxALL|wxEXPAND, 5 );
462 bSizer3->Add(bSizer4, 1, wxEXPAND);
464 wxBoxSizer* bSizer5 = new wxBoxSizer(wxVERTICAL);
466 wxStaticText* m_staticText12 = new wxStaticText( panel, wxID_ANY, wxT("Netgame Information"), wxDefaultPosition, wxDefaultSize, 0 );
467 m_staticText12->Wrap( -1 );
468 bSizer5->Add( m_staticText12, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
470 wxFlexGridSizer* fgSizer11;
471 fgSizer11 = new wxFlexGridSizer( 0, 2, 0, 0 );
472 fgSizer11->AddGrowableRow(0, 1);
473 fgSizer11->AddGrowableRow(1, 1);
474 fgSizer11->AddGrowableRow(2, 1);
475 fgSizer11->AddGrowableRow(3, 1);
477 wxStaticText* m_staticText13 = new wxStaticText( panel, wxID_ANY, wxT("Max Players"), wxDefaultPosition, wxDefaultSize, 0 );
478 m_staticText13->Wrap( -1 );
479 fgSizer11->Add( m_staticText13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
481 m_M_ngMaxPlayers = new wxStaticText( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
482 m_M_ngMaxPlayers->Wrap( -1 );
483 fgSizer11->Add( m_M_ngMaxPlayers, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
485 wxStaticText* m_staticText15 = new wxStaticText( panel, wxID_ANY, wxT("Max Observers"), wxDefaultPosition, wxDefaultSize, 0 );
486 m_staticText15->Wrap( -1 );
487 fgSizer11->Add( m_staticText15, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
489 m_M_ngMaxObservers = new wxStaticText( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
490 m_M_ngMaxObservers->Wrap( -1 );
491 fgSizer11->Add( m_M_ngMaxObservers, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
493 wxStaticText* m_staticText17 = new wxStaticText( panel, wxID_ANY, wxT("Security"), wxDefaultPosition, wxDefaultSize, 0 );
494 m_staticText17->Wrap( -1 );
495 fgSizer11->Add( m_staticText17, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
497 m_M_ngSecurity = new wxStaticText( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
498 m_M_ngSecurity->Wrap( -1 );
499 fgSizer11->Add( m_M_ngSecurity, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
501 wxStaticText* m_staticText19 = new wxStaticText( panel, wxID_ANY, wxT("Respawns"), wxDefaultPosition, wxDefaultSize, 0 );
502 m_staticText19->Wrap( -1 );
503 fgSizer11->Add( m_staticText19, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
505 m_M_ngRespawns = new wxStaticText( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
506 m_M_ngRespawns->Wrap( -1 );
507 fgSizer11->Add( m_M_ngRespawns, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
509 bSizer5->Add( fgSizer11, 1, wxEXPAND );
511 bSizer3->Add(bSizer5, 1, wxEXPAND);
513 bSizer->Add( bSizer3, 1, wxEXPAND, 5 );
515 panelSizer->Add(bSizer, 1, wxALL|wxEXPAND, 5);
517 panel->SetSizer( panelSizer );
518 panelSizer->Fit( panel );
519 panelSizer->SetSizeHints( panel );
521 parent->AddPage( panel, wxT("Multi-Player") );
524 void Standalone::createTab_Player(wxNotebook* parent)
526 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
528 wxBoxSizer* panelSizer = new wxBoxSizer( wxVERTICAL );
530 wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
532 wxBoxSizer* bSizer21;
533 bSizer21 = new wxBoxSizer( wxHORIZONTAL );
535 wxStaticText* m_staticText211 = new wxStaticText( panel, wxID_ANY, wxT("Player"), wxDefaultPosition, wxDefaultSize, 0 );
536 m_staticText211->Wrap( -1 );
537 bSizer21->Add( m_staticText211, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
539 wxArrayString m_choice11Choices;
540 m_P_Players = new wxChoice( panel, wxID_ANY, wxDefaultPosition, wxSize(200, -1), m_choice11Choices, 0 );
541 m_P_Players->SetSelection( 0 );
542 bSizer21->Add( m_P_Players, 0, wxALL, 5 );
544 bSizer->Add( bSizer21, 0, wxEXPAND );
547 wxStaticLine* m_staticline4 = new wxStaticLine( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
548 bSizer->Add( m_staticline4, 0, wxEXPAND | wxALL, 5 );
550 wxFlexGridSizer* fgSizer14;
551 fgSizer14 = new wxFlexGridSizer( 0, 2, 0, 0 );
553 wxStaticText* m_staticText26 = new wxStaticText( panel, wxID_ANY, wxT("Ship Type"), wxDefaultPosition, wxDefaultSize, 0 );
554 m_staticText26->Wrap( -1 );
555 fgSizer14->Add( m_staticText26, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
557 wxPanel* stPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
558 wxBoxSizer* stSizer = new wxBoxSizer(wxHORIZONTAL);
559 m_P_ShipType = new wxStaticText( stPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(150, -1), 0 );
560 m_P_ShipType->Wrap( -1 );
561 stSizer->Add(m_P_ShipType, 0, wxALL, 2);
562 stPanel->SetSizer(stSizer);
563 stSizer->Fit(stPanel);
564 fgSizer14->Add( stPanel, 0, wxALL, 5 );
566 wxStaticText* m_staticText28 = new wxStaticText( panel, wxID_ANY, wxT("Avg Ping"), wxDefaultPosition, wxDefaultSize, 0 );
567 m_staticText28->Wrap( -1 );
568 fgSizer14->Add( m_staticText28, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
570 wxPanel* apPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
571 wxBoxSizer* apSizer = new wxBoxSizer(wxHORIZONTAL);
572 m_P_AvgPing = new wxStaticText( apPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(150, -1), 0 );
573 m_P_AvgPing->Wrap( -1 );
574 apSizer->Add(m_P_AvgPing, 0, wxALL, 2);
575 apPanel->SetSizer(apSizer);
576 apSizer->Fit(apPanel);
577 fgSizer14->Add( apPanel, 0, wxALL, 5 );
579 bSizer->Add( fgSizer14, 0, wxEXPAND );
581 bSizer->Add( 0, 0, 0, wxALL, 10);
584 bSizer6 = new wxBoxSizer( wxHORIZONTAL );
590 wxBoxSizer* atsboxSizer = new wxBoxSizer( wxVERTICAL );
592 wxStaticText* atsText = new wxStaticText( panel, wxID_ANY, wxT("All Time Stats") );
593 atsboxSizer->Add( atsText, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
595 wxFlexGridSizer* atsgSizer = new wxFlexGridSizer( 0, 2, 0, 0 );
596 atsgSizer->AddGrowableCol(1, 1);
600 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Shots"), wxDefaultPosition, wxDefaultSize, 0 );
602 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
603 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
604 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
605 m_P_atsPriShots = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
606 m_P_atsPriShots->Wrap( -1 );
607 p1sizer->Add( m_P_atsPriShots, 1, wxALL|wxEXPAND, 1);
608 p1->SetSizer( p1sizer );
610 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
615 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Hits"), wxDefaultPosition, wxDefaultSize, 0 );
617 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
618 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
619 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
620 m_P_atsPriHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
621 m_P_atsPriHits->Wrap( -1 );
622 p1sizer->Add( m_P_atsPriHits, 0, wxALL|wxEXPAND, 1);
623 p1->SetSizer( p1sizer );
625 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
630 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary BH Hits"), wxDefaultPosition, wxDefaultSize, 0 );
632 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
633 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
634 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
635 m_P_atsPriBHHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
636 m_P_atsPriBHHits->Wrap( -1 );
637 p1sizer->Add( m_P_atsPriBHHits, 0, wxALL|wxEXPAND, 1);
638 p1->SetSizer( p1sizer );
640 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
645 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
647 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
648 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
649 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
650 m_P_atsPriHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
651 m_P_atsPriHitPer->Wrap( -1 );
652 p1sizer->Add( m_P_atsPriHitPer, 0, wxALL|wxEXPAND, 1);
653 p1->SetSizer( p1sizer );
655 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
660 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary BH Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
662 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
663 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
664 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
665 m_P_atsPriBHHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
666 m_P_atsPriBHHitPer->Wrap( -1 );
667 p1sizer->Add( m_P_atsPriBHHitPer, 0, wxALL|wxEXPAND, 1);
668 p1->SetSizer( p1sizer );
670 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
675 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Shots"), wxDefaultPosition, wxDefaultSize, 0 );
677 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
678 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
679 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
680 m_P_atsSecShots = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
681 m_P_atsSecShots->Wrap( -1 );
682 p1sizer->Add( m_P_atsSecShots, 0, wxALL|wxEXPAND, 1);
683 p1->SetSizer( p1sizer );
685 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
690 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Hits"), wxDefaultPosition, wxDefaultSize, 0 );
692 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
693 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
694 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
695 m_P_atsSecHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
696 m_P_atsSecHits->Wrap( -1 );
697 p1sizer->Add( m_P_atsSecHits, 0, wxALL|wxEXPAND, 1);
698 p1->SetSizer( p1sizer );
700 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
705 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary BH Hits"), wxDefaultPosition, wxDefaultSize, 0 );
707 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
708 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
709 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
710 m_P_atsSecBHHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
711 m_P_atsSecBHHits->Wrap( -1 );
712 p1sizer->Add( m_P_atsSecBHHits, 0, wxALL|wxEXPAND, 1);
713 p1->SetSizer( p1sizer );
715 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
720 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
722 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
723 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
724 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
725 m_P_atsSecHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
726 m_P_atsSecHitPer->Wrap( -1 );
727 p1sizer->Add( m_P_atsSecHitPer, 0, wxALL|wxEXPAND, 1);
728 p1->SetSizer( p1sizer );
730 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
733 // secondary BH hit %
735 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary BH Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
737 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
738 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
739 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
740 m_P_atsSecBHHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
741 m_P_atsSecBHHitPer->Wrap( -1 );
742 p1sizer->Add( m_P_atsSecBHHitPer, 0, wxALL|wxEXPAND, 1);
743 p1->SetSizer( p1sizer );
745 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
750 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Assists"), wxDefaultPosition, wxDefaultSize, 0 );
752 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
753 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
754 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
755 m_P_atsAssists = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
756 m_P_atsAssists->Wrap( -1 );
757 p1sizer->Add( m_P_atsAssists, 0, wxALL|wxEXPAND, 1);
758 p1->SetSizer( p1sizer );
760 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
763 atsboxSizer->Add( atsgSizer, 1, wxEXPAND );
765 bSizer6->Add( atsboxSizer, 1, wxEXPAND, 5 );
767 wxStaticLine* m_staticline3 = new wxStaticLine( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
768 bSizer6->Add( m_staticline3, 0, wxEXPAND | wxALL, 5 );
774 wxBoxSizer* msboxSizer = new wxBoxSizer( wxVERTICAL );
776 wxStaticText* msText = new wxStaticText( panel, wxID_ANY, wxT("Mission Stats") );
777 msboxSizer->Add( msText, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
779 wxFlexGridSizer* msgSizer = new wxFlexGridSizer( 0, 2, 0, 0 );
780 msgSizer->AddGrowableCol(1, 1);
784 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Shots"), wxDefaultPosition, wxDefaultSize, 0 );
786 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
787 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
788 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
789 m_P_msPriShots = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
790 m_P_msPriShots->Wrap( -1 );
791 p1sizer->Add( m_P_msPriShots, 1, wxALL|wxEXPAND, 1);
792 p1->SetSizer( p1sizer );
794 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
799 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Hits"), wxDefaultPosition, wxDefaultSize, 0 );
801 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
802 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
803 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
804 m_P_msPriHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
805 m_P_msPriHits->Wrap( -1 );
806 p1sizer->Add( m_P_msPriHits, 0, wxALL|wxEXPAND, 1);
807 p1->SetSizer( p1sizer );
809 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
814 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary BH Hits"), wxDefaultPosition, wxDefaultSize, 0 );
816 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
817 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
818 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
819 m_P_msPriBHHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
820 m_P_msPriBHHits->Wrap( -1 );
821 p1sizer->Add( m_P_msPriBHHits, 0, wxALL|wxEXPAND, 1);
822 p1->SetSizer( p1sizer );
824 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
829 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
831 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
832 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
833 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
834 m_P_msPriHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
835 m_P_msPriHitPer->Wrap( -1 );
836 p1sizer->Add( m_P_msPriHitPer, 0, wxALL|wxEXPAND, 1);
837 p1->SetSizer( p1sizer );
839 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
844 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary BH Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
846 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
847 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
848 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
849 m_P_msPriBHHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
850 m_P_msPriBHHitPer->Wrap( -1 );
851 p1sizer->Add( m_P_msPriBHHitPer, 0, wxALL|wxEXPAND, 1);
852 p1->SetSizer( p1sizer );
854 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
859 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Shots"), wxDefaultPosition, wxDefaultSize, 0 );
861 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
862 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
863 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
864 m_P_msSecShots = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
865 m_P_msSecShots->Wrap( -1 );
866 p1sizer->Add( m_P_msSecShots, 0, wxALL|wxEXPAND, 1);
867 p1->SetSizer( p1sizer );
869 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
874 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Hits"), wxDefaultPosition, wxDefaultSize, 0 );
876 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
877 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
878 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
879 m_P_msSecHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
880 m_P_msSecHits->Wrap( -1 );
881 p1sizer->Add( m_P_msSecHits, 0, wxALL|wxEXPAND, 1);
882 p1->SetSizer( p1sizer );
884 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
889 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary BH Hits"), wxDefaultPosition, wxDefaultSize, 0 );
891 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
892 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
893 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
894 m_P_msSecBHHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
895 m_P_msSecBHHits->Wrap( -1 );
896 p1sizer->Add( m_P_msSecBHHits, 0, wxALL|wxEXPAND, 1);
897 p1->SetSizer( p1sizer );
899 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
904 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
906 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
907 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
908 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
909 m_P_msSecHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
910 m_P_msSecHitPer->Wrap( -1 );
911 p1sizer->Add( m_P_msSecHitPer, 0, wxALL|wxEXPAND, 1);
912 p1->SetSizer( p1sizer );
914 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
917 // secondary BH hit %
919 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary BH Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
921 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
922 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
923 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
924 m_P_msSecBHHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
925 m_P_msSecBHHitPer->Wrap( -1 );
926 p1sizer->Add( m_P_msSecBHHitPer, 0, wxALL|wxEXPAND, 1);
927 p1->SetSizer( p1sizer );
929 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
934 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Assists"), wxDefaultPosition, wxDefaultSize, 0 );
936 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
937 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
938 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
939 m_P_msAssists = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
940 m_P_msAssists->Wrap( -1 );
941 p1sizer->Add( m_P_msAssists, 0, wxALL|wxEXPAND, 1);
942 p1->SetSizer( p1sizer );
944 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
947 msboxSizer->Add( msgSizer, 1, wxEXPAND );
949 bSizer6->Add( msboxSizer, 1, wxEXPAND );
951 bSizer->Add( bSizer6, 1, wxEXPAND );
953 panelSizer->Add( bSizer, 1, wxALL|wxEXPAND, 5 );
955 panel->SetSizer( panelSizer );
956 panelSizer->Fit( panel );
957 panelSizer->SetSizeHints(panel);
959 parent->AddPage( panel, wxT("Player Info") );
962 void Standalone::createTab_GodStuff(wxNotebook* parent)
964 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
966 wxBoxSizer* panelSizer = new wxBoxSizer( wxVERTICAL );
968 wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
970 wxBoxSizer* bSizer2 = new wxBoxSizer( wxHORIZONTAL );
972 wxStaticText* m_staticText21 = new wxStaticText( panel, wxID_ANY, wxT("Player"), wxDefaultPosition, wxDefaultSize, 0 );
973 bSizer2->Add( m_staticText21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
975 wxArrayString m_choice1Choices;
976 m_GS_Players = new wxChoice( panel, wxID_ANY, wxDefaultPosition, wxSize(200, -1), m_choice1Choices, 0 );
977 m_GS_Players->SetSelection( 0 );
978 bSizer2->Add( m_GS_Players, 0, wxALL|wxEXPAND, 5 );
980 bSizer->Add( bSizer2, 0, wxEXPAND, 5 );
982 bSizer->Add( 0, 0, 0, wxALL, 10 );
984 wxStaticText* m_staticText22 = new wxStaticText( panel, wxID_ANY, wxT("Server Message"), wxDefaultPosition, wxDefaultSize, 0 );
985 bSizer->Add( m_staticText22, 0, wxALL, 5 );
987 m_GS_msg = new wxTextCtrl( panel, ID_T_MSG, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
988 m_GS_msg->SetMaxLength(150);
989 bSizer->Add( m_GS_msg, 0, wxALL|wxEXPAND, 5 );
991 bSizer->Add( 0, 0, 0, wxALL, 5 );
993 m_GS_Messages = new wxTextCtrl( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY );
994 bSizer->Add( m_GS_Messages, 1, wxALL|wxEXPAND, 5 );
996 panelSizer->Add( bSizer, 1, wxALL|wxEXPAND, 5 );
998 panel->SetSizer( panelSizer );
999 panelSizer->Fit( panel );
1000 panelSizer->SetSizeHints( panel );
1002 parent->AddPage( panel, wxT("God Stuff") );
1005 void Standalone::createTab_Debug(wxNotebook* parent)
1007 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
1009 wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
1011 wxBoxSizer* hbSizer = new wxBoxSizer( wxHORIZONTAL );
1013 wxStaticText* m_staticText1 = new wxStaticText( panel, wxID_ANY, wxT("Standalone State :"), wxDefaultPosition, wxDefaultSize, 0 );
1014 hbSizer->Add( m_staticText1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
1016 wxPanel* p1 = new wxPanel( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER );
1018 wxBoxSizer* p1Sizer = new wxBoxSizer( wxHORIZONTAL );
1020 m_D_State = new wxStaticText( p1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
1021 p1Sizer->Add( m_D_State, 1, wxALL|wxEXPAND, 2);
1023 p1->SetSizer( p1Sizer );
1026 hbSizer->Add( p1, 1, wxALL|wxEXPAND, 5 );
1028 bSizer->Add( hbSizer, 0, wxALL|wxEXPAND, 5 );
1030 panel->SetSizer( bSizer );
1033 bSizer->Fit( panel );
1035 parent->AddPage( panel, wxT("Debug") );
1038 bool Standalone::startFreeSpace(int argc, wxCmdLineArgsArray &argv)
1040 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
1043 epath.Append( wxT("freespace") );
1045 epath.Append( wxT("freespace2") );
1049 epath.Append( wxT("_demo") );
1053 epath.Append( wxT(".exe") );
1056 epath.Append( wxT(" -standalone") );
1058 for (int i = 1; i < argc; i++) {
1059 wxString arg( argv[i] );
1061 // check if -port argument and set var
1062 if ( arg.IsSameAs( wxT("-port"), false) && (argc > i+1) ) {
1063 fsport = wxAtoi(argv[i+1]);
1066 epath.Append( wxT(" ") );
1070 fspid = wxExecute(epath, wxEXEC_ASYNC | wxEXEC_MAKE_GROUP_LEADER | wxEXEC_HIDE_CONSOLE);
1075 void Standalone::ResetAll()
1077 m_popup->Show(false);
1079 m_S_ServerName->Clear();
1080 m_S_HostPass->Clear();
1081 m_S_NumConn->SetLabel( wxT("0") );
1082 m_S_Connections->Clear();
1084 m_M_sliderFPS->SetValue(30);
1085 m_M_FPS->SetLabel("30");
1086 m_M_FPSRel->SetLabel( wxT("0.0") );
1087 m_M_MissionName->SetLabel("");
1088 m_M_MissionTime->SetLabel("");
1089 m_M_ngMaxPlayers->SetLabel("");
1090 m_M_ngMaxObservers->SetLabel("");
1091 m_M_ngSecurity->SetLabel("");
1092 m_M_ngRespawns->SetLabel("");
1093 m_M_Goals->DeleteAllItems();
1095 m_P_Players->Clear();
1096 m_P_ShipType->SetLabel("");
1097 m_P_AvgPing->SetLabel("");
1098 m_P_atsPriShots->SetLabel("");
1099 m_P_atsPriHits->SetLabel("");
1100 m_P_atsPriBHHits->SetLabel("");
1101 m_P_atsPriHitPer->SetLabel("");
1102 m_P_atsPriBHHitPer->SetLabel("");
1103 m_P_atsSecShots->SetLabel("");
1104 m_P_atsSecHits->SetLabel("");
1105 m_P_atsSecBHHits->SetLabel("");
1106 m_P_atsSecHitPer->SetLabel("");
1107 m_P_atsSecBHHitPer->SetLabel("");
1108 m_P_atsAssists->SetLabel("");
1109 m_P_msPriShots->SetLabel("");
1110 m_P_msPriHits->SetLabel("");
1111 m_P_msPriBHHits->SetLabel("");
1112 m_P_msPriHitPer->SetLabel("");
1113 m_P_msPriBHHitPer->SetLabel("");
1114 m_P_msSecShots->SetLabel("");
1115 m_P_msSecHits->SetLabel("");
1116 m_P_msSecBHHits->SetLabel("");
1117 m_P_msSecHitPer->SetLabel("");
1118 m_P_msSecBHHitPer->SetLabel("");
1119 m_P_msAssists->SetLabel("");
1121 m_GS_Players->Clear();
1123 m_GS_Messages->Clear();
1125 m_D_State->SetLabel("");
1128 static int callback_standalone_client(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
1130 #define MAX_BUF_SIZE 1050
1131 unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + MAX_BUF_SIZE + LWS_SEND_BUFFER_POST_PADDING];
1132 unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
1137 case LWS_CALLBACK_CLIENT_ESTABLISHED:
1138 lwsl_notice("CLIENT_ESTABLISHED\n");
1139 lws_callback_on_writable(wsi);
1142 case LWS_CALLBACK_CLOSED:
1143 lwsl_notice("CLOSED\n");
1144 wxGetApp().Client().wsDisconnect();
1147 case LWS_CALLBACK_CLIENT_RECEIVE:
1148 lwsl_notice("CLIENT_RECEIVE => in: %s, len: %lu\n", in ? (char*)in : "nul", len);
1149 wxGetApp().Client().wsMessage( (const char *)in, len );
1152 case LWS_CALLBACK_CLIENT_WRITEABLE: {
1153 if ( !wxGetApp().Client().wsGetSendBuffer().empty() ) {
1154 std::string msg = wxGetApp().Client().wsGetSendBuffer().front();
1156 lwsl_notice("CLIENT_WRITEABLE => msg: %s\n", msg.c_str());
1157 size = wxStrlcpy((char *)p, msg.c_str(), MAX_BUF_SIZE);
1159 rval = lws_write(wsi, p, size, LWS_WRITE_TEXT);
1162 lwsl_err("ERROR sending buffer!\n");
1166 wxGetApp().Client().wsGetSendBuffer().pop_front();
1168 lws_callback_on_writable(wsi);
1169 } else lwsl_notice("CLIENT_WRITEABLE <empty>\n");
1175 case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
1176 lwsl_notice("CONNECTION_ERROR\n");
1177 wxGetApp().Client().wsDisconnect();
1187 static struct lws_protocols protocols[] = {
1190 callback_standalone_client,
1194 { NULL, NULL, 0, 0 }
1197 bool Standalone::wsInitialize()
1199 struct lws_context_creation_info info;
1201 memset(&info, 0, sizeof(info));
1202 memset(&ccinfo, 0, sizeof(ccinfo));
1204 info.port = CONTEXT_PORT_NO_LISTEN;
1205 info.protocols = protocols;
1209 stand_context = lws_create_context(&info);
1211 if (stand_context == NULL) {
1215 ccinfo.context = stand_context;
1216 ccinfo.address = "127.0.0.1";
1217 ccinfo.port = fsport;
1219 ccinfo.host = ccinfo.address;
1220 ccinfo.origin = ccinfo.address;
1221 ccinfo.ietf_version_or_minus_one = -1;
1222 ccinfo.protocol = protocols[0].name;
1224 // async call, actual connection to occur later
1225 wsi_standalone = lws_client_connect_via_info(&ccinfo);
1227 lws_service(stand_context, 0);
1232 void Standalone::wsDoFrame()
1234 if ( !stand_context ) {
1238 // if connection is lost attempt reconnect every 2 seconds
1239 if ( !wsi_standalone && !(++m_rate_limit % 60) ) {
1240 wsi_standalone = lws_client_connect_via_info(&ccinfo);
1244 lws_service(stand_context, 0);
1247 void Standalone::wsDisconnect()
1249 lwsl_notice("disconnect!\n");
1250 wsi_standalone = NULL;
1253 void Standalone::wsMessage(const char *msg, size_t len)
1255 if (msg == NULL || len < 5) {
1259 if ( !wxStrcmp(msg, "reset") ) {
1264 if ( !wxStrncmp(msg, "popup ", 6) ) {
1266 m_popup->Show(false);
1268 wxArrayString popmsg = wxSplit(msg+6, ';');
1270 m_popup->SetTitle( popmsg.Item(0) );
1271 m_popup->SetLabel1( popmsg.Item(1) );
1272 m_popup->SetLabel2( popmsg.Item(2) );
1274 m_popup->Show(true);
1280 char mtype = msg[0];
1284 } else if (mtype == 'D') {
1285 m_D_State->SetLabel(msg+2);
1288 else if (mtype == 'S') {
1289 wxString cmd(msg+2, 4);
1291 if (cmd == "name") {
1292 m_S_ServerName->SetValue(msg+7);
1293 } else if (cmd == "pass") {
1294 m_S_HostPass->SetValue(msg+7);
1295 } else if (cmd == "conn") {
1297 } else if (cmd == "ping") {
1302 else if (mtype == 'M') {
1303 wxString cmd(msg+2, 4);
1305 if (cmd == "name") {
1306 m_M_MissionName->SetLabel(msg+7);
1307 } else if (cmd == "time") {
1308 m_M_MissionTime->SetLabel(msg+7);
1309 } else if (cmd == "info") {
1310 wxArrayString ng_info = wxSplit(msg+7, ',');
1312 m_M_ngMaxPlayers->SetLabel( ng_info.Item(0) );
1313 m_M_ngMaxObservers->SetLabel( ng_info.Item(1) );
1314 m_M_ngSecurity->SetLabel( ng_info.Item(2) );
1315 m_M_ngRespawns->SetLabel( ng_info.Item(3) );
1316 } else if (cmd == "fps ") {
1317 m_M_FPSRel->SetLabel(msg+6);
1318 } else if (cmd == "goal") {
1323 else if (mtype == 'P') {
1324 wxString cmd(msg+2, 4);
1326 if (cmd == "info") {
1331 else if (mtype == 'G') {
1332 wxString cmd(msg+2, 4);
1334 if (cmd == "mesg") {
1335 m_GS_Messages->AppendText(msg+7);
1340 void Standalone::wsSend(std::string &msg)
1342 send_buf.push_back(msg);
1344 if (wsi_standalone) {
1345 lws_callback_on_writable(wsi_standalone);