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
10 #include "launchersetup.h"
12 #include "wx/filename.h"
13 #include "wx/stdpaths.h"
16 #include "osregistry.h"
20 #include "res/fs2_background.xpm"
21 #include "res/fs2_btn_help.xpm"
22 #include "res/fs2_btn_help-hover.xpm"
23 #include "res/fs2_btn_help-click.xpm"
24 #include "res/fs2_btn_play.xpm"
25 #include "res/fs2_btn_play-hover.xpm"
26 #include "res/fs2_btn_play-click.xpm"
27 #include "res/fs2_btn_pxo.xpm"
28 #include "res/fs2_btn_pxo-hover.xpm"
29 #include "res/fs2_btn_pxo-click.xpm"
30 #include "res/fs2_btn_quit.xpm"
31 #include "res/fs2_btn_quit-hover.xpm"
32 #include "res/fs2_btn_quit-click.xpm"
33 #include "res/fs2_btn_readme.xpm"
34 #include "res/fs2_btn_readme-hover.xpm"
35 #include "res/fs2_btn_readme-click.xpm"
36 #include "res/fs2_btn_setup.xpm"
37 #include "res/fs2_btn_setup-hover.xpm"
38 #include "res/fs2_btn_setup-click.xpm"
39 #include "res/fs2_btn_uninstall.xpm"
40 #include "res/fs2_btn_uninstall-hover.xpm"
41 #include "res/fs2_btn_uninstall-click.xpm"
42 #include "res/fs2_btn_update.xpm"
43 #include "res/fs2_btn_update-hover.xpm"
44 #include "res/fs2_btn_update-click.xpm"
45 #include "res/fs2_btn_volition.xpm"
46 #include "res/fs2_btn_volition-hover.xpm"
47 #include "res/fs2_btn_volition-click.xpm"
49 #include "res/fs2demo_help_txt.h"
51 #include "res/fs2_help_txt.h"
53 #include "res/fs2_snd_hover_wav.h"
54 #include "res/fs2_snd_click_wav.h"
56 #include "res/freespace_img.xpm"
57 #include "res/volition_img.xpm"
59 #include "res/launcher_ico.h"
63 class LauncherApp: public wxApp
66 virtual bool OnInit();
70 IMPLEMENT_APP(LauncherApp)
72 bool LauncherApp::OnInit()
75 // make sure we create files with user access only
76 umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
79 wxImage::AddHandler(new wxPNGHandler());
81 Launcher *frame = new Launcher(NULL);
91 bool wxBackgroundBitmap::ProcessEvent(wxEvent &Event)
93 if (Event.GetEventType() == wxEVT_ERASE_BACKGROUND) {
94 wxEraseEvent &EraseEvent = dynamic_cast<wxEraseEvent &>(Event);
95 wxDC *DC = EraseEvent.GetDC();
96 DC->DrawBitmap(Bitmap, 0, 0, false);
100 return Inherited::ProcessEvent(Event);
105 wxBEGIN_EVENT_TABLE(wxLauncherButton, wxStaticBitmap)
106 EVT_LEFT_DOWN(wxLauncherButton::onMouseDown)
107 EVT_LEFT_UP(wxLauncherButton::onMouseUp)
108 EVT_MOTION(wxLauncherButton::onMouseEnter)
112 wxLauncherButton::wxLauncherButton(wxWindow *parent, wxWindowID id, const wxBitmap& label, const wxPoint& pos, const wxSize& size)
114 this->Create(parent, id, label, pos, size);
116 parent->Connect(wxEVT_MOTION, wxMouseEventHandler(wxLauncherButton::onMouseLeave), NULL, this);
123 wxLauncherButton::~wxLauncherButton()
127 void wxLauncherButton::onMouseEnter(wxMouseEvent& event)
130 this->SetBitmap(m_bitmap_hover);
132 ((Launcher*)GetGrandParent())->SndPlayHover();
136 // hack to toggle off certain buttons that don't get the onMouseLeave
137 // call due to placement/overlap
141 const wxWindowList wl = GetParent()->GetChildren();
143 wxWindowList::compatibility_iterator node = wl.GetFirst();
146 wxLauncherButton *cur = (wxLauncherButton*)node->GetData();
148 if ( cur->GetId() != event.GetId() ) {
149 cur->onMouseLeave(mv);
152 node = node->GetNext();
160 void wxLauncherButton::onMouseLeave(wxMouseEvent& event)
163 this->SetBitmap(m_bitmap);
171 void wxLauncherButton::onMouseDown(wxMouseEvent& event)
173 this->SetBitmap(m_bitmap_pressed);
175 ((Launcher*)GetGrandParent())->SndPlayPressed();
180 void wxLauncherButton::onMouseUp(wxMouseEvent& event)
182 this->SetBitmap(m_bitmap_hover);
184 wxCommandEvent ev(wxEVT_COMMAND_BUTTON_CLICKED, event.GetId());
185 GetGrandParent()->GetEventHandler()->ProcessEvent(ev);
191 wxBEGIN_EVENT_TABLE(Launcher, wxDialog)
192 EVT_CLOSE(Launcher::OnClose)
193 EVT_BUTTON(ID_B_PLAY, Launcher::OnPlay)
194 EVT_BUTTON(ID_B_SETUP, Launcher::OnSetup)
195 EVT_BUTTON(ID_B_README, Launcher::OnReadme)
196 EVT_BUTTON(ID_B_UPDATE, Launcher::OnUpdate)
197 EVT_BUTTON(ID_B_HELP, Launcher::OnHelp)
198 EVT_BUTTON(ID_B_UNINSTALL, Launcher::OnUninstall)
199 EVT_BUTTON(ID_B_VOLITION, Launcher::OnVolition)
200 EVT_BUTTON(ID_B_PXO, Launcher::OnPXO)
201 EVT_BUTTON(ID_B_QUIT, Launcher::OnQuit)
205 Launcher::Launcher( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
206 : wxDialog( parent, id, title, pos, size, style )
208 this->SetBackgroundColour( wxColour( 0, 0, 0 ) );
213 icon.CopyFromBitmap( wxBITMAP_PNG_FROM_DATA(launcher_ico) );
214 this->SetIcon( icon );
217 this->SetClientSize(375, 440);
219 this->SetTitle( wxT("FreeSpace 2 Demo Launcher") );
221 this->SetTitle( wxT("FreeSpace 2 Launcher") );
227 p_background = new wxBackgroundBitmap(fs2_background_xpm);
229 m_panel = new wxPanel(this);
230 m_panel->PushEventHandler(p_background);
233 m_btn_Play = new wxLauncherButton( m_panel, ID_B_PLAY, wxBitmap(fs2_btn_play_xpm), wxPoint(45, 102), wxSize(131, 58) );
234 m_btn_Play->SetBitmapHover( wxBitmap(fs2_btn_play_hover_xpm) );
235 m_btn_Play->SetBitmapPressed( wxBitmap(fs2_btn_play_click_xpm) );
237 m_btn_Setup = new wxLauncherButton( m_panel, ID_B_SETUP, wxBitmap(fs2_btn_setup_xpm), wxPoint(199, 102), wxSize(131, 58) );
238 m_btn_Setup->SetBitmapHover( wxBitmap(fs2_btn_setup_hover_xpm) );
239 m_btn_Setup->SetBitmapPressed( wxBitmap(fs2_btn_setup_click_xpm) );
241 m_btn_Readme = new wxLauncherButton( m_panel, ID_B_README, wxBitmap(fs2_btn_readme_xpm), wxPoint(45, 175), wxSize(131, 58) );
242 m_btn_Readme->SetBitmapHover( wxBitmap(fs2_btn_readme_hover_xpm) );
243 m_btn_Readme->SetBitmapPressed( wxBitmap(fs2_btn_readme_click_xpm) );
245 m_btn_Update = new wxLauncherButton( m_panel, ID_B_UPDATE, wxBitmap(fs2_btn_update_xpm), wxPoint(199, 175), wxSize(131, 58) );
246 m_btn_Update->SetBitmapHover( wxBitmap(fs2_btn_update_hover_xpm) );
247 m_btn_Update->SetBitmapPressed( wxBitmap(fs2_btn_update_click_xpm) );
249 m_btn_Help = new wxLauncherButton( m_panel, ID_B_HELP, wxBitmap(fs2_btn_help_xpm), wxPoint(45, 247), wxSize(131, 58) );
250 m_btn_Help->SetBitmapHover( wxBitmap(fs2_btn_help_hover_xpm) );
251 m_btn_Help->SetBitmapPressed( wxBitmap(fs2_btn_help_click_xpm) );
253 m_btn_Uninstall = new wxLauncherButton( m_panel, ID_B_UNINSTALL, wxBitmap(fs2_btn_uninstall_xpm), wxPoint(199, 247), wxSize(131, 58) );
254 m_btn_Uninstall->SetBitmapHover( wxBitmap(fs2_btn_uninstall_hover_xpm) );
255 m_btn_Uninstall->SetBitmapPressed( wxBitmap(fs2_btn_uninstall_click_xpm) );
257 m_btn_Volition = new wxLauncherButton( m_panel, ID_B_VOLITION, wxBitmap(fs2_btn_volition_xpm), wxPoint(15, 304), wxSize(90, 108) );
258 m_btn_Volition->SetBitmapHover( wxBitmap(fs2_btn_volition_hover_xpm) );
259 m_btn_Volition->SetBitmapPressed( wxBitmap(fs2_btn_volition_click_xpm) );
261 m_btn_PXO = new wxLauncherButton( m_panel, ID_B_PXO, wxBitmap(fs2_btn_pxo_xpm), wxPoint(249, 305), wxSize(114, 113) );
262 m_btn_PXO->SetBitmapHover( wxBitmap(fs2_btn_pxo_hover_xpm) );
263 m_btn_PXO->SetBitmapPressed( wxBitmap(fs2_btn_pxo_click_xpm) );
265 m_btn_Quit = new wxLauncherButton( m_panel, ID_B_QUIT, wxBitmap(fs2_btn_quit_xpm), wxPoint(116, 339), wxSize(131, 58) );
266 m_btn_Quit->SetBitmapHover( wxBitmap(fs2_btn_quit_hover_xpm) );
267 m_btn_Quit->SetBitmapPressed( wxBitmap(fs2_btn_quit_click_xpm) );
269 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
271 this->SetTitle( wxT("FreeSpace Demo Launcher") );
273 this->SetTitle( wxT("FreeSpace Launcher") );
277 bSizer3 = new wxBoxSizer( wxVERTICAL );
279 wxStaticBitmap *m_bitmap1 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( freespace_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
280 bSizer3->Add( m_bitmap1, 0, wxALIGN_LEFT|wxALIGN_TOP|wxALL, 5 );
282 wxFlexGridSizer* fgSizer3;
283 fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
284 fgSizer3->SetFlexibleDirection( wxBOTH );
285 fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
287 wxStaticBitmap *m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( volition_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
288 fgSizer3->Add( m_bitmap2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
291 bSizer5 = new wxBoxSizer( wxVERTICAL );
293 m_btn_Play = new wxButton( this, ID_B_PLAY, wxT("Play FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
294 m_btn_Play->SetDefault();
295 bSizer5->Add( m_btn_Play, 0, wxALL|wxEXPAND, 5 );
297 m_btn_Setup = new wxButton( this, ID_B_SETUP, wxT("Setup"), wxDefaultPosition, wxDefaultSize, 0 );
298 bSizer5->Add( m_btn_Setup, 0, wxALL|wxEXPAND, 5 );
300 m_btn_Readme = new wxButton( this, ID_B_README, wxT("View README"), wxDefaultPosition, wxDefaultSize, 0 );
301 bSizer5->Add( m_btn_Readme, 0, wxALL|wxEXPAND, 5 );
303 m_btn_Update = new wxButton( this, ID_B_UPDATE, wxT("Update FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
304 bSizer5->Add( m_btn_Update, 0, wxALL|wxEXPAND, 5 );
306 m_btn_Volition = new wxButton( this, ID_B_VOLITION, wxT("FreeSpace Webpage"), wxDefaultPosition, wxDefaultSize, 0 );
307 bSizer5->Add( m_btn_Volition, 0, wxALL|wxEXPAND, 5 );
309 m_btn_Uninstall = new wxButton( this, ID_B_UNINSTALL, wxT("Uninstall"), wxDefaultPosition, wxDefaultSize, 0 );
310 bSizer5->Add( m_btn_Uninstall, 0, wxALL|wxEXPAND, 5 );
312 m_btn_Quit = new wxButton( this, ID_B_QUIT, wxT("Quit"), wxDefaultPosition, wxDefaultSize, 0 );
313 bSizer5->Add( m_btn_Quit, 0, wxALL|wxEXPAND, 5 );
315 fgSizer3->Add( bSizer5, 1, wxALIGN_CENTER|wxALL, 10 );
317 bSizer3->Add( fgSizer3, 1, wxALIGN_BOTTOM|wxALIGN_RIGHT|wxEXPAND, 5 );
319 this->SetSizer( bSizer3 );
321 bSizer3->Fit( this );
325 this->Centre( wxBOTH );
328 Launcher::~Launcher()
333 void Launcher::OnClose( wxCloseEvent& WXUNUSED(event) )
336 m_panel->RemoveEventHandler(p_background);
343 void Launcher::OnPlay( wxCommandEvent& WXUNUSED(event) )
345 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
347 epath.Append( wxT("fs") );
350 epath.Append( wxT("2") );
353 #if defined(FS1_DEMO) || defined(FS2_DEMO)
354 epath.Append( wxT("demo") );
358 epath.Append( wxT(".exe") );
361 wxExecute(epath, wxEXEC_ASYNC | wxEXEC_MAKE_GROUP_LEADER);
366 void Launcher::OnSetup( wxCommandEvent& WXUNUSED(event) )
368 LauncherSetup setup(this);
373 void Launcher::OnReadme( wxCommandEvent& WXUNUSED(event) )
375 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
377 epath.Append( wxT("readme.txt") );
379 wxLaunchDefaultApplication(epath);
382 void Launcher::OnUpdate( wxCommandEvent& WXUNUSED(event) )
384 wxMessageBox( wxT("Not implemented") );
387 void Launcher::OnHelp( wxCommandEvent& WXUNUSED(event) )
390 wxDialog *help = new wxDialog(this, wxID_ANY, wxT("Launcher Help"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxSYSTEM_MENU);
393 bSizer = new wxBoxSizer( wxVERTICAL );
396 wxSize txtsize = help->GetTextExtent( wxT(" This opens a Help document containing information about the LauncherWWWW") );
397 txtsize.SetHeight(420);
399 wxTextCtrl *m_help_txt = new wxTextCtrl( help, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
400 m_help_txt->SetMinSize(txtsize);
402 m_help_txt->AppendText(fs2demo_help_txt);
404 m_help_txt->AppendText(fs2_help_txt);
406 m_help_txt->SetInsertionPoint(0);
407 bSizer->Add( m_help_txt, 0, wxALL|wxEXPAND, 5 );
409 wxButton *m_b_Ok = new wxButton( help, wxID_OK, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
410 bSizer->Add( m_b_Ok, 0, wxALIGN_RIGHT|wxALL, 5 );
412 help->SetSizer( bSizer );
416 help->Centre( wxBOTH );
424 void Launcher::OnUninstall( wxCommandEvent& WXUNUSED(event) )
426 wxMessageBox( wxT("Not implemented") );
429 void Launcher::OnVolition( wxCommandEvent& WXUNUSED(event) )
431 wxLaunchDefaultBrowser( wxT("http://www.volition-inc.com") );
434 void Launcher::OnPXO( wxCommandEvent& WXUNUSED(event) )
436 wxLaunchDefaultBrowser( wxT("https://pxo.nottheeye.com") );
439 void Launcher::OnQuit( wxCommandEvent& WXUNUSED(event) )
444 void Launcher::JumpToSetup()
446 if ( !os_config_read_uint(NULL, "StraightToSetup", 1) ) {
450 // FS1 doesn't do a setup jump so just go with what the user sets up
451 // and/or what the game binary will set
454 wxString title( wxT("Welcome to FreeSpace 2!") );
456 wxString message( wxT("Since this is your first time running FreeSapce2, ")
457 wxT("you will now be automatically taken to the Setup ")
460 wxString ext_message( wxT("NOTE TO USER:\n")
461 wxT("It is important that you view each section of ")
462 wxT("the Setup window and configure it to your ")
463 wxT("liking. Press the Help button if you have ")
464 wxT("questions about a particular section. Once you ")
465 wxT("are satisfied with your settings, select the OK ")
466 wxT("button at the bottom of the Setup window to ")
469 wxMessageDialog prompt(this, message, title, wxOK | wxICON_INFORMATION);
470 prompt.SetExtendedMessage(ext_message);
474 // now jump to setup dialog
475 LauncherSetup setup(this);
481 void Launcher::SndPlayHover()
484 alSourcePlay(m_snd_hover_source_id);
488 void Launcher::SndPlayPressed()
491 alSourcePlay(m_snd_click_source_id);
495 void Launcher::SndEnable(bool enabled)
504 void Launcher::init_sound()
511 if ( os_config_read_uint("Audio", "LauncherSoundEnabled", 1) == 0 ) {
515 al_device = alcOpenDevice(NULL);
517 if (al_device == NULL) {
521 al_context = alcCreateContext(al_device, NULL);
523 if (al_context == NULL) {
524 alcCloseDevice(al_device);
528 alcMakeContextCurrent(al_context);
531 alGenBuffers(1, &m_snd_hover_buf_id);
532 alBufferData(m_snd_hover_buf_id, AL_FORMAT_MONO8, fs2_snd_hover_wav, sizeof(fs2_snd_hover_wav), 22050);
534 alGenSources(1, &m_snd_hover_source_id);
535 alSourcef(m_snd_hover_source_id, AL_GAIN, 1.0f);
536 alSourcei(m_snd_hover_source_id, AL_BUFFER, m_snd_hover_buf_id);
539 alGenBuffers(1, &m_snd_click_buf_id);
540 alBufferData(m_snd_click_buf_id, AL_FORMAT_MONO8, fs2_snd_click_wav, sizeof(fs2_snd_click_wav), 22050);
542 alGenSources(1, &m_snd_click_source_id);
543 alSourcef(m_snd_click_source_id, AL_GAIN, 1.0f);
544 alSourcei(m_snd_click_source_id, AL_BUFFER, m_snd_click_buf_id);
550 void Launcher::close_sound()
556 alSourceStop(m_snd_click_source_id);
558 alSourcei(m_snd_click_source_id, AL_BUFFER, 0);
559 alDeleteSources(1, &m_snd_click_source_id);
560 alDeleteBuffers(1, &m_snd_click_buf_id);
562 alSourceStop(m_snd_hover_source_id);
564 alSourcei(m_snd_hover_source_id, AL_BUFFER, 0);
565 alDeleteSources(1, &m_snd_hover_source_id);
566 alDeleteBuffers(1, &m_snd_hover_buf_id);
568 alcMakeContextCurrent(NULL);
569 alcDestroyContext(al_context);
570 alcCloseDevice(al_device);