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( 300,150 ), wxDefaultSize );
84 bSizer2 = new wxBoxSizer( wxVERTICAL );
86 wxFlexGridSizer* fgSizer3;
87 fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
88 fgSizer3->SetFlexibleDirection( wxBOTH );
89 fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
91 m_Label1 = new wxStaticText( this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
93 fgSizer3->Add( m_Label1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
95 m_Label2 = new wxStaticText( this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
97 fgSizer3->Add( m_Label2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
100 bSizer2->Add( fgSizer3, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 10 );
103 this->SetSizer( bSizer2 );
105 bSizer2->Fit( this );
107 this->Centre( wxBOTH );
110 StandPopup::~StandPopup()
114 wxBEGIN_EVENT_TABLE(Standalone, wxDialog)
115 EVT_CLOSE(Standalone::OnClose)
116 EVT_BUTTON(ID_B_SHUTDOWN, Standalone::OnShutdown)
117 EVT_BUTTON(ID_B_KICK, Standalone::OnKick)
118 EVT_BUTTON(ID_B_MREFRESH, Standalone::OnMissionRefresh)
119 EVT_BUTTON(ID_B_RESET_ALL, Standalone::OnResetAll)
120 EVT_SLIDER(ID_FPS_SLIDER, Standalone::OnFPSSel)
121 EVT_TEXT_ENTER(ID_T_MSG, Standalone::OnServerMsg)
124 Standalone::Standalone( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
126 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
129 fsport = DEFAULT_GAME_PORT;
130 stand_context = NULL;
131 wsi_standalone = NULL;
134 m_timer = new StandaloneTimer(this);
135 m_timer->Start(1000/30);
137 m_popup = new StandPopup(this);
138 m_popup->Show(false);
141 bSizer1 = new wxBoxSizer( wxVERTICAL );
143 wxNotebook* nbook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
145 createTab_Server(nbook);
146 createTab_Multi(nbook);
147 createTab_Player(nbook);
148 createTab_GodStuff(nbook);
149 createTab_Debug(nbook);
151 bSizer1->Add( nbook, 1, wxEXPAND | wxALL, 5 );
153 wxButton* bshutdown = new wxButton( this, ID_B_SHUTDOWN, wxT("Shutdown"), wxDefaultPosition, wxDefaultSize, 0 );
154 bSizer1->Add( bshutdown, 0, wxALIGN_CENTER|wxALL, 5 );
157 this->SetSizer( bSizer1 );
159 bSizer1->SetSizeHints(this);
161 this->Centre( wxBOTH );
164 Standalone::~Standalone()
169 void Standalone::OnClose( wxCloseEvent& WXUNUSED(event) )
174 void Standalone::OnShutdown( wxCommandEvent& WXUNUSED(event) )
179 void Standalone::Shutdown()
182 std::string msg("shutdown");
185 lws_service(stand_context, 50);
187 lws_context_destroy(stand_context);
190 if ( wxProcess::Exists(fspid) ) {
191 // wait a little bit, and if process still exists then kill it
194 if ( wxProcess::Exists(fspid) ) {
195 wxProcess::Kill(fspid, wxSIGTERM);
202 void Standalone::OnKick( wxCommandEvent& WXUNUSED(event) )
204 std::string msg("S:kick ");
206 wxString id = m_S_Connections->GetStringSelection();
208 if ( id.IsEmpty() ) {
212 wxArrayString ipaddr = wxSplit(id, ',');
214 msg.append( ipaddr.Item(0).c_str() );
219 void Standalone::OnMissionRefresh( wxCommandEvent& WXUNUSED(event) )
221 std::string msg("G:mrefresh");
226 void Standalone::OnResetAll( wxCommandEvent& WXUNUSED(event) )
231 void Standalone::OnFPSSel( wxCommandEvent& WXUNUSED(event) )
233 wxString fps = wxString::Format("%d", m_M_sliderFPS->GetValue());
235 m_M_FPS->SetLabel(fps);
237 std::string msg("M:fps ");
243 void Standalone::OnServerMsg( wxCommandEvent& WXUNUSED(event) )
245 if ( m_GS_msg->GetValue().IsEmpty() ) {
249 std::string msg("G:smsg ");
251 msg.append( m_GS_msg->GetValue().c_str() );
253 // strip off return char which GetValue() has
254 size_t pos = msg.find_last_not_of("\r\n");
256 if (pos != std::string::npos) {
265 void Standalone::createTab_Server(wxNotebook* parent)
267 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
269 wxBoxSizer *panelSizer = new wxBoxSizer( wxVERTICAL );
271 wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
273 wxFlexGridSizer* fgSizer5 = new wxFlexGridSizer( 0, 2, 0, 0 );
274 fgSizer5->AddGrowableCol(1, 1);
276 wxStaticText* m_staticText6 = new wxStaticText( panel, wxID_ANY, wxT("Server Name"), wxDefaultPosition, wxDefaultSize, 0 );
277 fgSizer5->Add( m_staticText6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
279 m_S_ServerName = new wxTextCtrl( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
280 m_S_ServerName->SetMaxLength( 31 );
281 fgSizer5->Add( m_S_ServerName, 0, wxALL|wxEXPAND, 5 );
283 wxStaticText* m_staticText7 = new wxStaticText( panel, wxID_ANY, wxT("Host Password"), wxDefaultPosition, wxDefaultSize, 0 );
284 fgSizer5->Add( m_staticText7, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
286 m_S_HostPass = new wxTextCtrl( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
287 m_S_HostPass->SetMaxLength( 16 );
288 fgSizer5->Add( m_S_HostPass, 0, wxALL|wxEXPAND, 5 );
290 bSizer->Add( fgSizer5, 0, wxEXPAND, 0 );
292 wxStaticLine* m_staticline1 = new wxStaticLine( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
293 bSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
295 wxFlexGridSizer* fgSizer7 = new wxFlexGridSizer( 0, 2, 0, 0 );
296 fgSizer7->SetFlexibleDirection( wxBOTH );
297 fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
299 wxStaticText* m_staticText9 = new wxStaticText( panel, wxID_ANY, wxT("# Connections :"), wxDefaultPosition, wxDefaultSize, 0 );
300 fgSizer7->Add( m_staticText9, 0, wxALL, 5 );
302 m_S_NumConn = new wxStaticText( panel, wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, 0|wxSUNKEN_BORDER );
303 fgSizer7->Add( m_S_NumConn, 0, wxALL, 5 );
305 bSizer->Add( fgSizer7, 0, wxEXPAND, 5 );
307 wxStaticText* m_staticText8 = new wxStaticText( panel, wxID_ANY, wxT("Address and Ping"), wxDefaultPosition, wxDefaultSize, 0 );
308 bSizer->Add( m_staticText8, 0, wxALL, 5 );
310 wxFlexGridSizer* fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
311 fgSizer3->SetFlexibleDirection( wxBOTH );
312 fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
314 m_S_Connections = new wxTextCtrl( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 300,300 ), wxTE_MULTILINE|wxTE_READONLY );
315 fgSizer3->Add( m_S_Connections, 0, wxALL|wxEXPAND, 5 );
317 wxBoxSizer* bbSizer = new wxBoxSizer( wxVERTICAL );
319 m_S_btnKick = new wxButton( panel, ID_B_KICK, wxT("Kick"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
320 bbSizer->Add( m_S_btnKick, 1, wxALL, 5 );
322 m_S_btnMRefresh = new wxButton( panel, ID_B_MREFRESH, wxT(" Refresh\nMissions"), wxDefaultPosition, wxDefaultSize, 0 );
323 bbSizer->Add( m_S_btnMRefresh, 2, wxALL, 5 );
325 m_S_btnResetAll = new wxButton( panel, ID_B_RESET_ALL, wxT("Reset All"), wxDefaultPosition, wxDefaultSize, 0 );
326 bbSizer->Add( m_S_btnResetAll, 3, wxALL, 5 );
328 fgSizer3->Add( bbSizer, 1, wxEXPAND, 5 );
330 bSizer->Add( fgSizer3, 0, wxEXPAND, 5 );
332 panelSizer->Add( bSizer, 1, wxALL|wxEXPAND, 5 );
334 panel->SetSizer( panelSizer );
335 panelSizer->Fit( panel );
336 panelSizer->SetSizeHints( panel );
338 parent->AddPage( panel, wxT("Server"), true );
341 void Standalone::createTab_Multi(wxNotebook* parent)
343 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
345 wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL);
347 wxBoxSizer* bSizer = new wxBoxSizer(wxVERTICAL);
349 m_M_sliderFPS = new wxSlider( panel, ID_FPS_SLIDER, 30, 15, 60, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL );
350 bSizer->Add( m_M_sliderFPS, 0, wxALL|wxEXPAND, 5 );
352 wxFlexGridSizer* fgSizer8;
353 fgSizer8 = new wxFlexGridSizer( 0, 5, 0, 0 );
354 fgSizer8->AddGrowableCol(2, 1);
356 wxStaticText* m_staticText71 = new wxStaticText( panel, wxID_ANY, wxT("Frame Cap : "), wxDefaultPosition, wxDefaultSize, 0 );
357 m_staticText71->Wrap( -1 );
358 fgSizer8->Add( m_staticText71, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
360 wxPanel* fpsPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
361 wxBoxSizer* fpsSizer = new wxBoxSizer(wxHORIZONTAL);
362 m_M_FPS = new wxStaticText( fpsPanel, wxID_ANY, "30", wxDefaultPosition, wxSize(60, -1), 0 );
364 fpsSizer->Add( m_M_FPS, 0, wxALL, 2 );
365 fpsPanel->SetSizer(fpsSizer);
366 fpsSizer->Fit(fpsPanel);
367 fgSizer8->Add(fpsPanel, 0, wxALL, 3);
370 fgSizer8->Add( 0, 0, 1, wxEXPAND );
372 wxStaticText* m_staticText81 = new wxStaticText( panel, wxID_ANY, wxT("Realized FPS : "), wxDefaultPosition, wxDefaultSize, 0 );
373 m_staticText81->Wrap( -1 );
374 fgSizer8->Add( m_staticText81, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
376 wxPanel*fpscapPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
377 wxBoxSizer* fpscapSizer = new wxBoxSizer(wxHORIZONTAL);
378 m_M_FPSRel = new wxStaticText( fpscapPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(60, -1), 0 );
379 m_M_FPSRel->Wrap( -1 );
380 fpscapSizer->Add( m_M_FPSRel, 0, wxALL, 2 );
381 fpscapPanel->SetSizer(fpscapSizer);
382 fpscapSizer->Fit(fpscapPanel);
383 fgSizer8->Add(fpscapPanel, 0, wxALL, 3);
386 bSizer->Add( fgSizer8, 0, wxEXPAND, 5 );
388 wxStaticLine* m_staticline2 = new wxStaticLine( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
389 bSizer->Add( m_staticline2, 0, wxEXPAND | wxALL, 5 );
392 bSizer->Add( 0, 0, 0, wxALL, 20 );
395 wxFlexGridSizer* fgSizer9;
396 fgSizer9 = new wxFlexGridSizer( 0, 2, 0, 0 );
397 fgSizer9->SetFlexibleDirection( wxBOTH );
398 fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
400 wxStaticText* m_staticText91 = new wxStaticText( panel, wxID_ANY, wxT("Mission Name : "), wxDefaultPosition, wxDefaultSize, 0 );
401 m_staticText91->Wrap( -1 );
402 fgSizer9->Add( m_staticText91, 0, wxALL, 5 );
404 wxPanel* mnPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
405 wxBoxSizer* mnSizer = new wxBoxSizer(wxHORIZONTAL);
406 m_M_MissionName = new wxStaticText( mnPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(150, -1), 0 );
407 m_M_MissionName->Wrap( -1 );
408 mnSizer->Add( m_M_MissionName, 0, wxALL, 2 );
409 mnPanel->SetSizer(mnSizer);
410 mnSizer->Fit(mnPanel);
411 fgSizer9->Add(mnPanel, 0, wxALL, 3);
413 wxStaticText* m_staticText101 = new wxStaticText( panel, wxID_ANY, wxT("Mission Time : "), wxDefaultPosition, wxDefaultSize, 0 );
414 m_staticText101->Wrap( -1 );
415 fgSizer9->Add( m_staticText101, 0, wxALL, 5 );
417 wxPanel* mtPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
418 wxBoxSizer* mtSizer = new wxBoxSizer(wxHORIZONTAL);
419 m_M_MissionTime = new wxStaticText( mtPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(150, -1), 0 );
420 m_M_MissionTime->Wrap( -1 );
421 mtSizer->Add( m_M_MissionTime, 0, wxALL, 2 );
422 mtPanel->SetSizer(mtSizer);
423 mtSizer->Fit(mtPanel);
424 fgSizer9->Add(mtPanel, 0, wxALL, 3);
427 bSizer->Add( fgSizer9, 0, wxEXPAND, 5 );
430 bSizer->Add( 0, 0, 0, wxALL, 20 );
432 wxBoxSizer* bSizer3 = new wxBoxSizer(wxHORIZONTAL);
434 wxBoxSizer* bSizer4 = new wxBoxSizer(wxVERTICAL);
436 wxStaticText* m_staticText11 = new wxStaticText( panel, wxID_ANY, wxT("Mission Goals"), wxDefaultPosition, wxDefaultSize, 0 );
437 m_staticText11->Wrap( -1 );
438 bSizer4->Add( m_staticText11, 0, wxALL, 5 );
440 m_M_Goals = new wxTreeCtrl( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT );
441 bSizer4->Add( m_M_Goals, 1, wxALL|wxEXPAND, 5 );
443 bSizer3->Add(bSizer4, 1, wxEXPAND);
445 wxBoxSizer* bSizer5 = new wxBoxSizer(wxVERTICAL);
447 wxStaticText* m_staticText12 = new wxStaticText( panel, wxID_ANY, wxT("Netgame Information"), wxDefaultPosition, wxDefaultSize, 0 );
448 m_staticText12->Wrap( -1 );
449 bSizer5->Add( m_staticText12, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
451 wxFlexGridSizer* fgSizer11;
452 fgSizer11 = new wxFlexGridSizer( 0, 2, 0, 0 );
453 fgSizer11->AddGrowableRow(0, 1);
454 fgSizer11->AddGrowableRow(1, 1);
455 fgSizer11->AddGrowableRow(2, 1);
456 fgSizer11->AddGrowableRow(3, 1);
458 wxStaticText* m_staticText13 = new wxStaticText( panel, wxID_ANY, wxT("Max Players"), wxDefaultPosition, wxDefaultSize, 0 );
459 m_staticText13->Wrap( -1 );
460 fgSizer11->Add( m_staticText13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
462 m_M_ngMaxPlayers = new wxStaticText( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
463 m_M_ngMaxPlayers->Wrap( -1 );
464 fgSizer11->Add( m_M_ngMaxPlayers, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
466 wxStaticText* m_staticText15 = new wxStaticText( panel, wxID_ANY, wxT("Max Observers"), wxDefaultPosition, wxDefaultSize, 0 );
467 m_staticText15->Wrap( -1 );
468 fgSizer11->Add( m_staticText15, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
470 m_M_ngMaxObservers = new wxStaticText( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
471 m_M_ngMaxObservers->Wrap( -1 );
472 fgSizer11->Add( m_M_ngMaxObservers, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
474 wxStaticText* m_staticText17 = new wxStaticText( panel, wxID_ANY, wxT("Security"), wxDefaultPosition, wxDefaultSize, 0 );
475 m_staticText17->Wrap( -1 );
476 fgSizer11->Add( m_staticText17, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
478 m_M_ngSecurity = new wxStaticText( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
479 m_M_ngSecurity->Wrap( -1 );
480 fgSizer11->Add( m_M_ngSecurity, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
482 wxStaticText* m_staticText19 = new wxStaticText( panel, wxID_ANY, wxT("Respawns"), wxDefaultPosition, wxDefaultSize, 0 );
483 m_staticText19->Wrap( -1 );
484 fgSizer11->Add( m_staticText19, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
486 m_M_ngRespawns = new wxStaticText( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
487 m_M_ngRespawns->Wrap( -1 );
488 fgSizer11->Add( m_M_ngRespawns, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
490 bSizer5->Add( fgSizer11, 1, wxEXPAND );
492 bSizer3->Add(bSizer5, 1, wxEXPAND);
494 bSizer->Add( bSizer3, 1, wxEXPAND, 5 );
496 panelSizer->Add(bSizer, 1, wxALL|wxEXPAND, 5);
498 panel->SetSizer( panelSizer );
499 panelSizer->Fit( panel );
500 panelSizer->SetSizeHints( panel );
502 parent->AddPage( panel, wxT("Multi-Player") );
505 void Standalone::createTab_Player(wxNotebook* parent)
507 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
509 wxBoxSizer* panelSizer = new wxBoxSizer( wxVERTICAL );
511 wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
513 wxBoxSizer* bSizer21;
514 bSizer21 = new wxBoxSizer( wxHORIZONTAL );
516 wxStaticText* m_staticText211 = new wxStaticText( panel, wxID_ANY, wxT("Player"), wxDefaultPosition, wxDefaultSize, 0 );
517 m_staticText211->Wrap( -1 );
518 bSizer21->Add( m_staticText211, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
520 wxArrayString m_choice11Choices;
521 m_P_Players = new wxChoice( panel, wxID_ANY, wxDefaultPosition, wxSize(200, -1), m_choice11Choices, 0 );
522 m_P_Players->SetSelection( 0 );
523 bSizer21->Add( m_P_Players, 0, wxALL, 5 );
525 bSizer->Add( bSizer21, 0, wxEXPAND );
528 wxStaticLine* m_staticline4 = new wxStaticLine( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
529 bSizer->Add( m_staticline4, 0, wxEXPAND | wxALL, 5 );
531 wxFlexGridSizer* fgSizer14;
532 fgSizer14 = new wxFlexGridSizer( 0, 2, 0, 0 );
534 wxStaticText* m_staticText26 = new wxStaticText( panel, wxID_ANY, wxT("Ship Type"), wxDefaultPosition, wxDefaultSize, 0 );
535 m_staticText26->Wrap( -1 );
536 fgSizer14->Add( m_staticText26, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
538 wxPanel* stPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
539 wxBoxSizer* stSizer = new wxBoxSizer(wxHORIZONTAL);
540 m_P_ShipType = new wxStaticText( stPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(150, -1), 0 );
541 m_P_ShipType->Wrap( -1 );
542 stSizer->Add(m_P_ShipType, 0, wxALL, 2);
543 stPanel->SetSizer(stSizer);
544 stSizer->Fit(stPanel);
545 fgSizer14->Add( stPanel, 0, wxALL, 5 );
547 wxStaticText* m_staticText28 = new wxStaticText( panel, wxID_ANY, wxT("Avg Ping"), wxDefaultPosition, wxDefaultSize, 0 );
548 m_staticText28->Wrap( -1 );
549 fgSizer14->Add( m_staticText28, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
551 wxPanel* apPanel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
552 wxBoxSizer* apSizer = new wxBoxSizer(wxHORIZONTAL);
553 m_P_AvgPing = new wxStaticText( apPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(150, -1), 0 );
554 m_P_AvgPing->Wrap( -1 );
555 apSizer->Add(m_P_AvgPing, 0, wxALL, 2);
556 apPanel->SetSizer(apSizer);
557 apSizer->Fit(apPanel);
558 fgSizer14->Add( apPanel, 0, wxALL, 5 );
560 bSizer->Add( fgSizer14, 0, wxEXPAND );
562 bSizer->Add( 0, 0, 0, wxALL, 10);
565 bSizer6 = new wxBoxSizer( wxHORIZONTAL );
571 wxBoxSizer* atsboxSizer = new wxBoxSizer( wxVERTICAL );
573 wxStaticText* atsText = new wxStaticText( panel, wxID_ANY, wxT("All Time Stats") );
574 atsboxSizer->Add( atsText, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
576 wxFlexGridSizer* atsgSizer = new wxFlexGridSizer( 0, 2, 0, 0 );
577 atsgSizer->AddGrowableCol(1, 1);
581 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Shots"), wxDefaultPosition, wxDefaultSize, 0 );
583 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
584 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
585 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
586 m_P_atsPriShots = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
587 m_P_atsPriShots->Wrap( -1 );
588 p1sizer->Add( m_P_atsPriShots, 1, wxALL|wxEXPAND, 1);
589 p1->SetSizer( p1sizer );
591 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
596 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Hits"), wxDefaultPosition, wxDefaultSize, 0 );
598 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
599 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
600 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
601 m_P_atsPriHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
602 m_P_atsPriHits->Wrap( -1 );
603 p1sizer->Add( m_P_atsPriHits, 0, wxALL|wxEXPAND, 1);
604 p1->SetSizer( p1sizer );
606 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
611 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary BH Hits"), wxDefaultPosition, wxDefaultSize, 0 );
613 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
614 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
615 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
616 m_P_atsPriBHHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
617 m_P_atsPriBHHits->Wrap( -1 );
618 p1sizer->Add( m_P_atsPriBHHits, 0, wxALL|wxEXPAND, 1);
619 p1->SetSizer( p1sizer );
621 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
626 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
628 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
629 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
630 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
631 m_P_atsPriHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
632 m_P_atsPriHitPer->Wrap( -1 );
633 p1sizer->Add( m_P_atsPriHitPer, 0, wxALL|wxEXPAND, 1);
634 p1->SetSizer( p1sizer );
636 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
641 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary BH Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
643 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
644 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
645 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
646 m_P_atsPriBHHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
647 m_P_atsPriBHHitPer->Wrap( -1 );
648 p1sizer->Add( m_P_atsPriBHHitPer, 0, wxALL|wxEXPAND, 1);
649 p1->SetSizer( p1sizer );
651 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
656 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Shots"), wxDefaultPosition, wxDefaultSize, 0 );
658 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
659 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
660 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
661 m_P_atsSecShots = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
662 m_P_atsSecShots->Wrap( -1 );
663 p1sizer->Add( m_P_atsSecShots, 0, wxALL|wxEXPAND, 1);
664 p1->SetSizer( p1sizer );
666 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
671 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Hits"), wxDefaultPosition, wxDefaultSize, 0 );
673 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
674 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
675 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
676 m_P_atsSecHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
677 m_P_atsSecHits->Wrap( -1 );
678 p1sizer->Add( m_P_atsSecHits, 0, wxALL|wxEXPAND, 1);
679 p1->SetSizer( p1sizer );
681 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
686 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary BH Hits"), wxDefaultPosition, wxDefaultSize, 0 );
688 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
689 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
690 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
691 m_P_atsSecBHHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
692 m_P_atsSecBHHits->Wrap( -1 );
693 p1sizer->Add( m_P_atsSecBHHits, 0, wxALL|wxEXPAND, 1);
694 p1->SetSizer( p1sizer );
696 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
701 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
703 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
704 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
705 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
706 m_P_atsSecHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
707 m_P_atsSecHitPer->Wrap( -1 );
708 p1sizer->Add( m_P_atsSecHitPer, 0, wxALL|wxEXPAND, 1);
709 p1->SetSizer( p1sizer );
711 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
714 // secondary BH hit %
716 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary BH Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
718 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
719 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
720 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
721 m_P_atsSecBHHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
722 m_P_atsSecBHHitPer->Wrap( -1 );
723 p1sizer->Add( m_P_atsSecBHHitPer, 0, wxALL|wxEXPAND, 1);
724 p1->SetSizer( p1sizer );
726 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
731 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Assists"), wxDefaultPosition, wxDefaultSize, 0 );
733 atsgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
734 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
735 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
736 m_P_atsAssists = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
737 m_P_atsAssists->Wrap( -1 );
738 p1sizer->Add( m_P_atsAssists, 0, wxALL|wxEXPAND, 1);
739 p1->SetSizer( p1sizer );
741 atsgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
744 atsboxSizer->Add( atsgSizer, 1, wxEXPAND );
746 bSizer6->Add( atsboxSizer, 1, wxEXPAND, 5 );
748 wxStaticLine* m_staticline3 = new wxStaticLine( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
749 bSizer6->Add( m_staticline3, 0, wxEXPAND | wxALL, 5 );
755 wxBoxSizer* msboxSizer = new wxBoxSizer( wxVERTICAL );
757 wxStaticText* msText = new wxStaticText( panel, wxID_ANY, wxT("Mission Stats") );
758 msboxSizer->Add( msText, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
760 wxFlexGridSizer* msgSizer = new wxFlexGridSizer( 0, 2, 0, 0 );
761 msgSizer->AddGrowableCol(1, 1);
765 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Shots"), wxDefaultPosition, wxDefaultSize, 0 );
767 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
768 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
769 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
770 m_P_msPriShots = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
771 m_P_msPriShots->Wrap( -1 );
772 p1sizer->Add( m_P_msPriShots, 1, wxALL|wxEXPAND, 1);
773 p1->SetSizer( p1sizer );
775 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
780 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Hits"), wxDefaultPosition, wxDefaultSize, 0 );
782 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
783 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
784 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
785 m_P_msPriHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
786 m_P_msPriHits->Wrap( -1 );
787 p1sizer->Add( m_P_msPriHits, 0, wxALL|wxEXPAND, 1);
788 p1->SetSizer( p1sizer );
790 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
795 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary BH Hits"), wxDefaultPosition, wxDefaultSize, 0 );
797 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
798 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
799 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
800 m_P_msPriBHHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
801 m_P_msPriBHHits->Wrap( -1 );
802 p1sizer->Add( m_P_msPriBHHits, 0, wxALL|wxEXPAND, 1);
803 p1->SetSizer( p1sizer );
805 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
810 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
812 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
813 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
814 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
815 m_P_msPriHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
816 m_P_msPriHitPer->Wrap( -1 );
817 p1sizer->Add( m_P_msPriHitPer, 0, wxALL|wxEXPAND, 1);
818 p1->SetSizer( p1sizer );
820 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
825 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Primary BH Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
827 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
828 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
829 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
830 m_P_msPriBHHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
831 m_P_msPriBHHitPer->Wrap( -1 );
832 p1sizer->Add( m_P_msPriBHHitPer, 0, wxALL|wxEXPAND, 1);
833 p1->SetSizer( p1sizer );
835 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
840 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Shots"), wxDefaultPosition, wxDefaultSize, 0 );
842 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
843 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
844 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
845 m_P_msSecShots = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
846 m_P_msSecShots->Wrap( -1 );
847 p1sizer->Add( m_P_msSecShots, 0, wxALL|wxEXPAND, 1);
848 p1->SetSizer( p1sizer );
850 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
855 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Hits"), wxDefaultPosition, wxDefaultSize, 0 );
857 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
858 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
859 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
860 m_P_msSecHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
861 m_P_msSecHits->Wrap( -1 );
862 p1sizer->Add( m_P_msSecHits, 0, wxALL|wxEXPAND, 1);
863 p1->SetSizer( p1sizer );
865 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
870 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary BH Hits"), wxDefaultPosition, wxDefaultSize, 0 );
872 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
873 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
874 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
875 m_P_msSecBHHits = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
876 m_P_msSecBHHits->Wrap( -1 );
877 p1sizer->Add( m_P_msSecBHHits, 0, wxALL|wxEXPAND, 1);
878 p1->SetSizer( p1sizer );
880 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
885 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
887 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
888 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
889 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
890 m_P_msSecHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
891 m_P_msSecHitPer->Wrap( -1 );
892 p1sizer->Add( m_P_msSecHitPer, 0, wxALL|wxEXPAND, 1);
893 p1->SetSizer( p1sizer );
895 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
898 // secondary BH hit %
900 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Secondary BH Hit %"), wxDefaultPosition, wxDefaultSize, 0 );
902 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
903 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
904 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
905 m_P_msSecBHHitPer = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
906 m_P_msSecBHHitPer->Wrap( -1 );
907 p1sizer->Add( m_P_msSecBHHitPer, 0, wxALL|wxEXPAND, 1);
908 p1->SetSizer( p1sizer );
910 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
915 wxStaticText* itxt = new wxStaticText( panel, wxID_ANY, wxT("Assists"), wxDefaultPosition, wxDefaultSize, 0 );
917 msgSizer->Add( itxt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
918 wxPanel* p1 = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER);
919 wxBoxSizer* p1sizer = new wxBoxSizer( wxHORIZONTAL );
920 m_P_msAssists = new wxStaticText( p1, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
921 m_P_msAssists->Wrap( -1 );
922 p1sizer->Add( m_P_msAssists, 0, wxALL|wxEXPAND, 1);
923 p1->SetSizer( p1sizer );
925 msgSizer->Add( p1, 0, wxALL|wxEXPAND, 1 );
928 msboxSizer->Add( msgSizer, 1, wxEXPAND );
930 bSizer6->Add( msboxSizer, 1, wxEXPAND );
932 bSizer->Add( bSizer6, 1, wxEXPAND );
934 panelSizer->Add( bSizer, 1, wxALL|wxEXPAND, 5 );
936 panel->SetSizer( panelSizer );
937 panelSizer->Fit( panel );
938 panelSizer->SetSizeHints(panel);
940 parent->AddPage( panel, wxT("Player Info") );
943 void Standalone::createTab_GodStuff(wxNotebook* parent)
945 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
947 wxBoxSizer* panelSizer = new wxBoxSizer( wxVERTICAL );
949 wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
951 wxBoxSizer* bSizer2 = new wxBoxSizer( wxHORIZONTAL );
953 wxStaticText* m_staticText21 = new wxStaticText( panel, wxID_ANY, wxT("Player"), wxDefaultPosition, wxDefaultSize, 0 );
954 bSizer2->Add( m_staticText21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
956 wxArrayString m_choice1Choices;
957 m_GS_Players = new wxChoice( panel, wxID_ANY, wxDefaultPosition, wxSize(200, -1), m_choice1Choices, 0 );
958 m_GS_Players->SetSelection( 0 );
959 bSizer2->Add( m_GS_Players, 0, wxALL|wxEXPAND, 5 );
961 bSizer->Add( bSizer2, 0, wxEXPAND, 5 );
963 bSizer->Add( 0, 0, 0, wxALL, 10 );
965 wxStaticText* m_staticText22 = new wxStaticText( panel, wxID_ANY, wxT("Server Message"), wxDefaultPosition, wxDefaultSize, 0 );
966 bSizer->Add( m_staticText22, 0, wxALL, 5 );
968 m_GS_msg = new wxTextCtrl( panel, ID_T_MSG, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
969 m_GS_msg->SetMaxLength(150);
970 bSizer->Add( m_GS_msg, 0, wxALL|wxEXPAND, 5 );
972 bSizer->Add( 0, 0, 0, wxALL, 5 );
974 m_GS_Messages = new wxTextCtrl( panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY );
975 bSizer->Add( m_GS_Messages, 1, wxALL|wxEXPAND, 5 );
977 panelSizer->Add( bSizer, 1, wxALL|wxEXPAND, 5 );
979 panel->SetSizer( panelSizer );
980 panelSizer->Fit( panel );
981 panelSizer->SetSizeHints( panel );
983 parent->AddPage( panel, wxT("God Stuff") );
986 void Standalone::createTab_Debug(wxNotebook* parent)
988 wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
990 wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
992 wxBoxSizer* hbSizer = new wxBoxSizer( wxHORIZONTAL );
994 wxStaticText* m_staticText1 = new wxStaticText( panel, wxID_ANY, wxT("Standalone State :"), wxDefaultPosition, wxDefaultSize, 0 );
995 hbSizer->Add( m_staticText1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
997 wxPanel* p1 = new wxPanel( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER );
999 wxBoxSizer* p1Sizer = new wxBoxSizer( wxHORIZONTAL );
1001 m_D_State = new wxStaticText( p1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
1002 p1Sizer->Add( m_D_State, 1, wxALL|wxEXPAND, 2);
1004 p1->SetSizer( p1Sizer );
1007 hbSizer->Add( p1, 1, wxALL|wxEXPAND, 5 );
1009 bSizer->Add( hbSizer, 0, wxALL|wxEXPAND, 5 );
1011 panel->SetSizer( bSizer );
1014 bSizer->Fit( panel );
1016 parent->AddPage( panel, wxT("Debug") );
1019 bool Standalone::startFreeSpace(int argc, wxCmdLineArgsArray &argv)
1021 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
1024 epath.Append( wxT("freespace") );
1026 epath.Append( wxT("freespace2") );
1030 epath.Append( wxT("_demo") );
1034 epath.Append( wxT(".exe") );
1037 epath.Append( wxT(" -standalone") );
1039 for (int i = 1; i < argc; i++) {
1040 wxString arg( argv[i] );
1042 // check if -port argument and set var
1043 if ( arg.IsSameAs( wxT("-port"), false) && (argc > i+1) ) {
1044 fsport = wxAtoi(argv[i+1]);
1047 epath.Append( wxT(" ") );
1051 fspid = wxExecute(epath, wxEXEC_ASYNC | wxEXEC_MAKE_GROUP_LEADER | wxEXEC_HIDE_CONSOLE);
1056 void Standalone::ResetAll()
1058 m_popup->Show(false);
1060 m_S_ServerName->Clear();
1061 m_S_HostPass->Clear();
1062 m_S_NumConn->SetLabel( wxT("0") );
1063 m_S_Connections->Clear();
1065 m_M_sliderFPS->SetValue(30);
1066 m_M_FPSRel->SetLabel( wxT("0.0") );
1067 m_M_MissionName->SetLabel("");
1068 m_M_MissionTime->SetLabel("");
1069 m_M_ngMaxPlayers->SetLabel("");
1070 m_M_ngMaxObservers->SetLabel("");
1071 m_M_ngSecurity->SetLabel("");
1072 m_M_ngRespawns->SetLabel("");
1073 m_M_Goals->DeleteAllItems();
1075 m_P_Players->Clear();
1076 m_P_ShipType->SetLabel("");
1077 m_P_AvgPing->SetLabel("");
1080 static int callback_standalone_client(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
1082 #define MAX_BUF_SIZE 1050
1083 unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + MAX_BUF_SIZE + LWS_SEND_BUFFER_POST_PADDING];
1084 unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
1089 case LWS_CALLBACK_CLIENT_ESTABLISHED:
1090 lwsl_notice("CLIENT_ESTABLISHED\n");
1091 lws_callback_on_writable(wsi);
1094 case LWS_CALLBACK_CLOSED:
1095 lwsl_notice("CLOSED\n");
1096 wxGetApp().Client().wsDisconnect();
1099 case LWS_CALLBACK_CLIENT_RECEIVE:
1100 lwsl_notice("CLIENT_RECEIVE => in: %s, len: %lu\n", in ? (char*)in : "nul", len);
1101 wxGetApp().Client().wsMessage( (const char *)in, len );
1104 case LWS_CALLBACK_CLIENT_WRITEABLE: {
1105 if ( !wxGetApp().Client().wsGetSendBuffer().empty() ) {
1106 std::string msg = wxGetApp().Client().wsGetSendBuffer().front();
1108 lwsl_notice("CLIENT_WRITEABLE => msg: %s\n", msg.c_str());
1109 size = wxStrlcpy((char *)p, msg.c_str(), MAX_BUF_SIZE);
1111 rval = lws_write(wsi, p, size, LWS_WRITE_TEXT);
1114 lwsl_err("ERROR sending buffer!\n");
1118 wxGetApp().Client().wsGetSendBuffer().pop_front();
1120 lws_callback_on_writable(wsi);
1121 } else lwsl_notice("CLIENT_WRITEABLE <empty>\n");
1127 case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
1128 lwsl_notice("CONNECTION_ERROR\n");
1129 wxGetApp().Client().wsDisconnect();
1139 static struct lws_protocols protocols[] = {
1142 callback_standalone_client,
1146 { NULL, NULL, 0, 0 }
1149 bool Standalone::wsInitialize()
1151 struct lws_context_creation_info info;
1153 memset(&info, 0, sizeof(info));
1154 memset(&ccinfo, 0, sizeof(ccinfo));
1156 info.port = CONTEXT_PORT_NO_LISTEN;
1157 info.protocols = protocols;
1161 stand_context = lws_create_context(&info);
1163 if (stand_context == NULL) {
1167 ccinfo.context = stand_context;
1168 ccinfo.address = "127.0.0.1";
1169 ccinfo.port = fsport;
1171 ccinfo.host = ccinfo.address;
1172 ccinfo.origin = ccinfo.address;
1173 ccinfo.ietf_version_or_minus_one = -1;
1174 ccinfo.protocol = protocols[0].name;
1176 // async call, actual connection to occur later
1177 wsi_standalone = lws_client_connect_via_info(&ccinfo);
1179 lws_service(stand_context, 0);
1184 void Standalone::wsDoFrame()
1186 if ( !stand_context ) {
1190 // if connection is lost attempt reconnect every 2 seconds
1191 if ( !wsi_standalone && !(++m_rate_limit % 60) ) {
1192 wsi_standalone = lws_client_connect_via_info(&ccinfo);
1196 lws_service(stand_context, 0);
1199 void Standalone::wsDisconnect()
1201 lwsl_notice("disconnect!\n");
1202 wsi_standalone = NULL;
1205 void Standalone::wsMessage(const char *msg, size_t len)
1207 if (msg == NULL || len < 5) {
1211 if ( !wxStrcmp(msg, "reset") ) {
1216 if ( !wxStrncmp(msg, "popup ", 6) ) {
1218 m_popup->Show(false);
1220 wxArrayString popmsg = wxSplit(msg+6, ';');
1222 m_popup->SetTitle( popmsg.Item(0) );
1223 m_popup->SetLabel1( popmsg.Item(1) );
1224 m_popup->SetLabel2( popmsg.Item(2) );
1226 m_popup->Show(true);
1232 char mtype = msg[0];
1236 } else if (mtype == 'D') {
1237 m_D_State->SetLabel(msg+2);
1240 else if (mtype == 'S') {
1241 wxString cmd(msg+2, 4);
1243 if (cmd == "name") {
1244 m_S_ServerName->SetValue(msg+7);
1245 } else if (cmd == "pass") {
1246 m_S_HostPass->SetValue(msg+7);
1247 } else if (cmd == "conn") {
1249 } else if (cmd == "ping") {
1254 else if (mtype == 'M') {
1255 wxString cmd(msg+2, 4);
1257 if (cmd == "name") {
1258 m_M_MissionName->SetLabel(msg+7);
1259 } else if (cmd == "time") {
1260 m_M_MissionTime->SetLabel(msg+7);
1261 } else if (cmd == "info") {
1262 wxArrayString ng_info = wxSplit(msg+7, ',');
1264 m_M_ngMaxPlayers->SetLabel( ng_info.Item(0) );
1265 m_M_ngMaxObservers->SetLabel( ng_info.Item(1) );
1266 m_M_ngSecurity->SetLabel( ng_info.Item(2) );
1267 m_M_ngRespawns->SetLabel( ng_info.Item(3) );
1268 } else if (cmd == "fps ") {
1269 m_M_FPSRel->SetLabel(msg+6);
1270 } else if (cmd == "goal") {
1275 else if (mtype == 'P') {
1276 wxString cmd(msg+2, 4);
1278 if (cmd == "info") {
1283 else if (mtype == 'G') {
1284 wxString cmd(msg+2, 4);
1286 if (cmd == "mesg") {
1287 m_GS_Messages->AppendText(msg+7);
1292 void Standalone::wsSend(std::string &msg)
1294 send_buf.push_back(msg);
1296 if (wsi_standalone) {
1297 lws_callback_on_writable(wsi_standalone);