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"
48 #include "res/fs2_help_txt.h"
49 #include "res/fs2_snd_hover_wav.h"
50 #include "res/fs2_snd_click_wav.h"
52 #include "res/freespace_img.xpm"
53 #include "res/volition_img.xpm"
58 class LauncherApp: public wxApp
61 virtual bool OnInit();
65 IMPLEMENT_APP(LauncherApp)
67 bool LauncherApp::OnInit()
70 // make sure we create files with user access only
71 umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
74 Launcher *frame = new Launcher(NULL);
84 bool wxBackgroundBitmap::ProcessEvent(wxEvent &Event)
86 if (Event.GetEventType() == wxEVT_ERASE_BACKGROUND) {
87 wxEraseEvent &EraseEvent = dynamic_cast<wxEraseEvent &>(Event);
88 wxDC *DC = EraseEvent.GetDC();
89 DC->DrawBitmap(Bitmap, 0, 0, false);
93 return Inherited::ProcessEvent(Event);
98 wxBEGIN_EVENT_TABLE(wxLauncherButton, wxStaticBitmap)
99 EVT_LEFT_DOWN(wxLauncherButton::onMouseDown)
100 EVT_LEFT_UP(wxLauncherButton::onMouseUp)
101 EVT_MOTION(wxLauncherButton::onMouseEnter)
105 wxLauncherButton::wxLauncherButton(wxWindow *parent, wxWindowID id, const wxBitmap& label, const wxPoint& pos, const wxSize& size)
107 this->Create(parent, id, label, pos, size);
109 parent->Connect(wxEVT_MOTION, wxMouseEventHandler(wxLauncherButton::onMouseLeave), NULL, this);
116 wxLauncherButton::~wxLauncherButton()
120 void wxLauncherButton::onMouseEnter(wxMouseEvent& event)
123 this->SetBitmap(m_bitmap_hover);
125 ((Launcher*)GetGrandParent())->SndPlayHover();
129 // hack to toggle off certain buttons that don't get the onMouseLeave
130 // call due to placement/overlap
134 const wxWindowList wl = GetParent()->GetChildren();
136 wxWindowList::compatibility_iterator node = wl.GetFirst();
139 wxLauncherButton *cur = (wxLauncherButton*)node->GetData();
141 if ( cur->GetId() != event.GetId() ) {
142 cur->onMouseLeave(mv);
145 node = node->GetNext();
153 void wxLauncherButton::onMouseLeave(wxMouseEvent& event)
156 this->SetBitmap(m_bitmap);
164 void wxLauncherButton::onMouseDown(wxMouseEvent& event)
166 this->SetBitmap(m_bitmap_pressed);
168 ((Launcher*)GetGrandParent())->SndPlayPressed();
173 void wxLauncherButton::onMouseUp(wxMouseEvent& event)
175 this->SetBitmap(m_bitmap_hover);
177 wxCommandEvent ev(wxEVT_COMMAND_BUTTON_CLICKED, event.GetId());
178 GetGrandParent()->GetEventHandler()->ProcessEvent(ev);
184 wxBEGIN_EVENT_TABLE(Launcher, wxDialog)
185 EVT_CLOSE(Launcher::OnClose)
186 EVT_BUTTON(ID_B_PLAY, Launcher::OnPlay)
187 EVT_BUTTON(ID_B_SETUP, Launcher::OnSetup)
188 EVT_BUTTON(ID_B_README, Launcher::OnReadme)
189 EVT_BUTTON(ID_B_UPDATE, Launcher::OnUpdate)
190 EVT_BUTTON(ID_B_HELP, Launcher::OnHelp)
191 EVT_BUTTON(ID_B_UNINSTALL, Launcher::OnUninstall)
192 EVT_BUTTON(ID_B_VOLITION, Launcher::OnVolition)
193 EVT_BUTTON(ID_B_PXO, Launcher::OnPXO)
194 EVT_BUTTON(ID_B_QUIT, Launcher::OnQuit)
198 Launcher::Launcher( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
199 : wxDialog( parent, id, title, pos, size, style )
201 this->SetBackgroundColour( wxColour( 0, 0, 0 ) );
206 this->SetClientSize(375, 440);
208 this->SetTitle( wxT("FreeSpace 2 Demo Launcher") );
210 this->SetTitle( wxT("FreeSpace 2 Launcher") );
216 p_background = new wxBackgroundBitmap(fs2_background_xpm);
218 m_panel = new wxPanel(this);
219 m_panel->PushEventHandler(p_background);
222 m_btn_Play = new wxLauncherButton( m_panel, ID_B_PLAY, wxBitmap(fs2_btn_play_xpm), wxPoint(45, 102), wxSize(131, 58) );
223 m_btn_Play->SetBitmapHover( wxBitmap(fs2_btn_play_hover_xpm) );
224 m_btn_Play->SetBitmapPressed( wxBitmap(fs2_btn_play_click_xpm) );
226 m_btn_Setup = new wxLauncherButton( m_panel, ID_B_SETUP, wxBitmap(fs2_btn_setup_xpm), wxPoint(199, 102), wxSize(131, 58) );
227 m_btn_Setup->SetBitmapHover( wxBitmap(fs2_btn_setup_hover_xpm) );
228 m_btn_Setup->SetBitmapPressed( wxBitmap(fs2_btn_setup_click_xpm) );
230 m_btn_Readme = new wxLauncherButton( m_panel, ID_B_README, wxBitmap(fs2_btn_readme_xpm), wxPoint(45, 175), wxSize(131, 58) );
231 m_btn_Readme->SetBitmapHover( wxBitmap(fs2_btn_readme_hover_xpm) );
232 m_btn_Readme->SetBitmapPressed( wxBitmap(fs2_btn_readme_click_xpm) );
234 m_btn_Update = new wxLauncherButton( m_panel, ID_B_UPDATE, wxBitmap(fs2_btn_update_xpm), wxPoint(199, 175), wxSize(131, 58) );
235 m_btn_Update->SetBitmapHover( wxBitmap(fs2_btn_update_hover_xpm) );
236 m_btn_Update->SetBitmapPressed( wxBitmap(fs2_btn_update_click_xpm) );
238 m_btn_Help = new wxLauncherButton( m_panel, ID_B_HELP, wxBitmap(fs2_btn_help_xpm), wxPoint(45, 247), wxSize(131, 58) );
239 m_btn_Help->SetBitmapHover( wxBitmap(fs2_btn_help_hover_xpm) );
240 m_btn_Help->SetBitmapPressed( wxBitmap(fs2_btn_help_click_xpm) );
242 m_btn_Uninstall = new wxLauncherButton( m_panel, ID_B_UNINSTALL, wxBitmap(fs2_btn_uninstall_xpm), wxPoint(199, 247), wxSize(131, 58) );
243 m_btn_Uninstall->SetBitmapHover( wxBitmap(fs2_btn_uninstall_hover_xpm) );
244 m_btn_Uninstall->SetBitmapPressed( wxBitmap(fs2_btn_uninstall_click_xpm) );
246 m_btn_Volition = new wxLauncherButton( m_panel, ID_B_VOLITION, wxBitmap(fs2_btn_volition_xpm), wxPoint(15, 304), wxSize(90, 108) );
247 m_btn_Volition->SetBitmapHover( wxBitmap(fs2_btn_volition_hover_xpm) );
248 m_btn_Volition->SetBitmapPressed( wxBitmap(fs2_btn_volition_click_xpm) );
250 m_btn_PXO = new wxLauncherButton( m_panel, ID_B_PXO, wxBitmap(fs2_btn_pxo_xpm), wxPoint(249, 305), wxSize(114, 113) );
251 m_btn_PXO->SetBitmapHover( wxBitmap(fs2_btn_pxo_hover_xpm) );
252 m_btn_PXO->SetBitmapPressed( wxBitmap(fs2_btn_pxo_click_xpm) );
254 m_btn_Quit = new wxLauncherButton( m_panel, ID_B_QUIT, wxBitmap(fs2_btn_quit_xpm), wxPoint(116, 339), wxSize(131, 58) );
255 m_btn_Quit->SetBitmapHover( wxBitmap(fs2_btn_quit_hover_xpm) );
256 m_btn_Quit->SetBitmapPressed( wxBitmap(fs2_btn_quit_click_xpm) );
258 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
260 this->SetTitle( wxT("FreeSpace Demo Launcher") );
262 this->SetTitle( wxT("FreeSpace Launcher") );
266 bSizer3 = new wxBoxSizer( wxVERTICAL );
268 wxStaticBitmap *m_bitmap1 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( freespace_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
269 bSizer3->Add( m_bitmap1, 0, wxALIGN_LEFT|wxALIGN_TOP|wxALL, 5 );
271 wxFlexGridSizer* fgSizer3;
272 fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
273 fgSizer3->SetFlexibleDirection( wxBOTH );
274 fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
276 wxStaticBitmap *m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( volition_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
277 fgSizer3->Add( m_bitmap2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
280 bSizer5 = new wxBoxSizer( wxVERTICAL );
282 m_btn_Play = new wxButton( this, ID_B_PLAY, wxT("Play FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
283 m_btn_Play->SetDefault();
284 bSizer5->Add( m_btn_Play, 0, wxALL|wxEXPAND, 5 );
286 m_btn_Setup = new wxButton( this, ID_B_SETUP, wxT("Setup"), wxDefaultPosition, wxDefaultSize, 0 );
287 bSizer5->Add( m_btn_Setup, 0, wxALL|wxEXPAND, 5 );
289 m_btn_Readme = new wxButton( this, ID_B_README, wxT("View README"), wxDefaultPosition, wxDefaultSize, 0 );
290 bSizer5->Add( m_btn_Readme, 0, wxALL|wxEXPAND, 5 );
292 m_btn_Update = new wxButton( this, ID_B_UPDATE, wxT("Update FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
293 bSizer5->Add( m_btn_Update, 0, wxALL|wxEXPAND, 5 );
295 m_btn_Volition = new wxButton( this, ID_B_VOLITION, wxT("FreeSpace Webpage"), wxDefaultPosition, wxDefaultSize, 0 );
296 bSizer5->Add( m_btn_Volition, 0, wxALL|wxEXPAND, 5 );
298 m_btn_Uninstall = new wxButton( this, ID_B_UNINSTALL, wxT("Uninstall"), wxDefaultPosition, wxDefaultSize, 0 );
299 bSizer5->Add( m_btn_Uninstall, 0, wxALL|wxEXPAND, 5 );
301 m_btn_Quit = new wxButton( this, ID_B_QUIT, wxT("Quit"), wxDefaultPosition, wxDefaultSize, 0 );
302 bSizer5->Add( m_btn_Quit, 0, wxALL|wxEXPAND, 5 );
304 fgSizer3->Add( bSizer5, 1, wxALIGN_CENTER|wxALL, 10 );
306 bSizer3->Add( fgSizer3, 1, wxALIGN_BOTTOM|wxALIGN_RIGHT|wxEXPAND, 5 );
308 this->SetSizer( bSizer3 );
310 bSizer3->Fit( this );
314 this->Centre( wxBOTH );
317 Launcher::~Launcher()
322 void Launcher::OnClose( wxCloseEvent& WXUNUSED(event) )
325 m_panel->RemoveEventHandler(p_background);
332 void Launcher::OnPlay( wxCommandEvent& WXUNUSED(event) )
334 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
336 epath.Append( wxT("fs") );
339 epath.Append( wxT("2") );
342 #if defined(FS1_DEMO) || defined(FS2_DEMO)
343 epath.Append( wxT("demo") );
347 epath.Append( wxT(".exe") );
350 wxExecute(epath, wxEXEC_ASYNC | wxEXEC_MAKE_GROUP_LEADER);
355 void Launcher::OnSetup( wxCommandEvent& WXUNUSED(event) )
357 LauncherSetup setup(this);
362 void Launcher::OnReadme( wxCommandEvent& WXUNUSED(event) )
364 wxLaunchDefaultApplication("README.txt");
367 void Launcher::OnUpdate( wxCommandEvent& WXUNUSED(event) )
369 wxMessageBox( wxT("Not implemented") );
372 void Launcher::OnHelp( wxCommandEvent& WXUNUSED(event) )
375 wxDialog *help = new wxDialog(this, wxID_ANY, wxT("Launcher Help"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxSYSTEM_MENU);
378 bSizer = new wxBoxSizer( wxVERTICAL );
381 wxSize txtsize = help->GetTextExtent( wxT(" This opens a Help document containing information about the LauncherWWWW") );
382 txtsize.SetHeight(420);
384 wxTextCtrl *m_help_txt = new wxTextCtrl( help, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
385 m_help_txt->SetMinSize(txtsize);
386 m_help_txt->AppendText(fs2_help_txt);
387 m_help_txt->SetInsertionPoint(0);
388 bSizer->Add( m_help_txt, 0, wxALL|wxEXPAND, 5 );
390 wxButton *m_b_Ok = new wxButton( help, wxID_OK, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
391 bSizer->Add( m_b_Ok, 0, wxALIGN_RIGHT|wxALL, 5 );
393 help->SetSizer( bSizer );
397 help->Centre( wxBOTH );
405 void Launcher::OnUninstall( wxCommandEvent& WXUNUSED(event) )
407 wxMessageBox( wxT("Not implemented") );
410 void Launcher::OnVolition( wxCommandEvent& WXUNUSED(event) )
412 wxLaunchDefaultBrowser( wxT("http://www.volition-inc.com") );
415 void Launcher::OnPXO( wxCommandEvent& WXUNUSED(event) )
417 wxLaunchDefaultBrowser( wxT("http://www.pxo.net") );
420 void Launcher::OnQuit( wxCommandEvent& WXUNUSED(event) )
425 void Launcher::JumpToSetup()
427 if ( !os_config_read_uint(NULL, "StraightToSetup", 1) ) {
431 // FS1 doesn't do a setup jump so just go with what the user sets up
432 // and/or what the game binary will set
435 wxString title( wxT("Welcome to FreeSpace 2!") );
437 wxString message( wxT("Since this is your first time running FreeSapce2, ")
438 wxT("you will now be automatically taken to the Setup ")
441 wxString ext_message( wxT("NOTE TO USER:\n")
442 wxT("It is important that you view each section of ")
443 wxT("the Setup window and configure it to your ")
444 wxT("liking. Press the Help button if you have ")
445 wxT("questions about a particular section. Once you ")
446 wxT("are satisfied with your settings, select the OK ")
447 wxT("button at the bottom of the Setup window to ")
450 wxMessageDialog prompt(this, message, title, wxOK | wxICON_INFORMATION);
451 prompt.SetExtendedMessage(ext_message);
455 // now jump to setup dialog
456 LauncherSetup setup(this);
462 void Launcher::SndPlayHover()
465 alSourcePlay(m_snd_hover_source_id);
469 void Launcher::SndPlayPressed()
472 alSourcePlay(m_snd_click_source_id);
476 void Launcher::SndEnable(bool enabled)
485 void Launcher::init_sound()
492 if ( os_config_read_uint("Audio", "LauncherSoundEnabled", 1) == 0 ) {
496 al_device = alcOpenDevice(NULL);
498 if (al_device == NULL) {
502 al_context = alcCreateContext(al_device, NULL);
504 if (al_context == NULL) {
505 alcCloseDevice(al_device);
509 alcMakeContextCurrent(al_context);
512 alGenBuffers(1, &m_snd_hover_buf_id);
513 alBufferData(m_snd_hover_buf_id, AL_FORMAT_MONO8, fs2_snd_hover_wav, sizeof(fs2_snd_hover_wav), 22050);
515 alGenSources(1, &m_snd_hover_source_id);
516 alSourcef(m_snd_hover_source_id, AL_GAIN, 1.0f);
517 alSourcei(m_snd_hover_source_id, AL_BUFFER, m_snd_hover_buf_id);
520 alGenBuffers(1, &m_snd_click_buf_id);
521 alBufferData(m_snd_click_buf_id, AL_FORMAT_MONO8, fs2_snd_click_wav, sizeof(fs2_snd_click_wav), 22050);
523 alGenSources(1, &m_snd_click_source_id);
524 alSourcef(m_snd_click_source_id, AL_GAIN, 1.0f);
525 alSourcei(m_snd_click_source_id, AL_BUFFER, m_snd_click_buf_id);
531 void Launcher::close_sound()
537 alSourceStop(m_snd_click_source_id);
539 alSourcei(m_snd_click_source_id, AL_BUFFER, 0);
540 alDeleteSources(1, &m_snd_click_source_id);
541 alDeleteBuffers(1, &m_snd_click_buf_id);
543 alSourceStop(m_snd_hover_source_id);
545 alSourcei(m_snd_hover_source_id, AL_BUFFER, 0);
546 alDeleteSources(1, &m_snd_hover_source_id);
547 alDeleteBuffers(1, &m_snd_hover_buf_id);
549 alcMakeContextCurrent(NULL);
550 alcDestroyContext(al_context);
551 alcCloseDevice(al_device);