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);
207 this->SetTitle( wxT("FreeSpace 2 Launcher") );
212 p_background = new wxBackgroundBitmap(fs2_background_xpm);
214 m_panel = new wxPanel(this);
215 m_panel->PushEventHandler(p_background);
218 m_btn_Play = new wxLauncherButton( m_panel, ID_B_PLAY, wxBitmap(fs2_btn_play_xpm), wxPoint(45, 102), wxSize(131, 58) );
219 m_btn_Play->SetBitmapHover( wxBitmap(fs2_btn_play_hover_xpm) );
220 m_btn_Play->SetBitmapPressed( wxBitmap(fs2_btn_play_click_xpm) );
222 m_btn_Setup = new wxLauncherButton( m_panel, ID_B_SETUP, wxBitmap(fs2_btn_setup_xpm), wxPoint(199, 102), wxSize(131, 58) );
223 m_btn_Setup->SetBitmapHover( wxBitmap(fs2_btn_setup_hover_xpm) );
224 m_btn_Setup->SetBitmapPressed( wxBitmap(fs2_btn_setup_click_xpm) );
226 m_btn_Readme = new wxLauncherButton( m_panel, ID_B_README, wxBitmap(fs2_btn_readme_xpm), wxPoint(45, 175), wxSize(131, 58) );
227 m_btn_Readme->SetBitmapHover( wxBitmap(fs2_btn_readme_hover_xpm) );
228 m_btn_Readme->SetBitmapPressed( wxBitmap(fs2_btn_readme_click_xpm) );
230 m_btn_Update = new wxLauncherButton( m_panel, ID_B_UPDATE, wxBitmap(fs2_btn_update_xpm), wxPoint(199, 175), wxSize(131, 58) );
231 m_btn_Update->SetBitmapHover( wxBitmap(fs2_btn_update_hover_xpm) );
232 m_btn_Update->SetBitmapPressed( wxBitmap(fs2_btn_update_click_xpm) );
234 m_btn_Help = new wxLauncherButton( m_panel, ID_B_HELP, wxBitmap(fs2_btn_help_xpm), wxPoint(45, 247), wxSize(131, 58) );
235 m_btn_Help->SetBitmapHover( wxBitmap(fs2_btn_help_hover_xpm) );
236 m_btn_Help->SetBitmapPressed( wxBitmap(fs2_btn_help_click_xpm) );
238 m_btn_Uninstall = new wxLauncherButton( m_panel, ID_B_UNINSTALL, wxBitmap(fs2_btn_uninstall_xpm), wxPoint(199, 247), wxSize(131, 58) );
239 m_btn_Uninstall->SetBitmapHover( wxBitmap(fs2_btn_uninstall_hover_xpm) );
240 m_btn_Uninstall->SetBitmapPressed( wxBitmap(fs2_btn_uninstall_click_xpm) );
242 m_btn_Volition = new wxLauncherButton( m_panel, ID_B_VOLITION, wxBitmap(fs2_btn_volition_xpm), wxPoint(15, 304), wxSize(90, 108) );
243 m_btn_Volition->SetBitmapHover( wxBitmap(fs2_btn_volition_hover_xpm) );
244 m_btn_Volition->SetBitmapPressed( wxBitmap(fs2_btn_volition_click_xpm) );
246 m_btn_PXO = new wxLauncherButton( m_panel, ID_B_PXO, wxBitmap(fs2_btn_pxo_xpm), wxPoint(249, 305), wxSize(114, 113) );
247 m_btn_PXO->SetBitmapHover( wxBitmap(fs2_btn_pxo_hover_xpm) );
248 m_btn_PXO->SetBitmapPressed( wxBitmap(fs2_btn_pxo_click_xpm) );
250 m_btn_Quit = new wxLauncherButton( m_panel, ID_B_QUIT, wxBitmap(fs2_btn_quit_xpm), wxPoint(116, 339), wxSize(131, 58) );
251 m_btn_Quit->SetBitmapHover( wxBitmap(fs2_btn_quit_hover_xpm) );
252 m_btn_Quit->SetBitmapPressed( wxBitmap(fs2_btn_quit_click_xpm) );
254 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
255 this->SetTitle( wxT("FreeSpace Launcher") );
258 bSizer3 = new wxBoxSizer( wxVERTICAL );
260 wxStaticBitmap *m_bitmap1 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( freespace_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
261 bSizer3->Add( m_bitmap1, 0, wxALIGN_LEFT|wxALIGN_TOP|wxALL, 5 );
263 wxFlexGridSizer* fgSizer3;
264 fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
265 fgSizer3->SetFlexibleDirection( wxBOTH );
266 fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
268 wxStaticBitmap *m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( volition_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
269 fgSizer3->Add( m_bitmap2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
272 bSizer5 = new wxBoxSizer( wxVERTICAL );
274 m_btn_Play = new wxButton( this, ID_B_PLAY, wxT("Play FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
275 m_btn_Play->SetDefault();
276 bSizer5->Add( m_btn_Play, 0, wxALL|wxEXPAND, 5 );
278 m_btn_Setup = new wxButton( this, ID_B_SETUP, wxT("Setup"), wxDefaultPosition, wxDefaultSize, 0 );
279 bSizer5->Add( m_btn_Setup, 0, wxALL|wxEXPAND, 5 );
281 m_btn_Readme = new wxButton( this, ID_B_README, wxT("View README"), wxDefaultPosition, wxDefaultSize, 0 );
282 bSizer5->Add( m_btn_Readme, 0, wxALL|wxEXPAND, 5 );
284 m_btn_Update = new wxButton( this, ID_B_UPDATE, wxT("Update FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
285 bSizer5->Add( m_btn_Update, 0, wxALL|wxEXPAND, 5 );
287 m_btn_Volition = new wxButton( this, ID_B_VOLITION, wxT("FreeSpace Webpage"), wxDefaultPosition, wxDefaultSize, 0 );
288 bSizer5->Add( m_btn_Volition, 0, wxALL|wxEXPAND, 5 );
290 m_btn_Uninstall = new wxButton( this, ID_B_UNINSTALL, wxT("Uninstall"), wxDefaultPosition, wxDefaultSize, 0 );
291 bSizer5->Add( m_btn_Uninstall, 0, wxALL|wxEXPAND, 5 );
293 m_btn_Quit = new wxButton( this, ID_B_QUIT, wxT("Quit"), wxDefaultPosition, wxDefaultSize, 0 );
294 bSizer5->Add( m_btn_Quit, 0, wxALL|wxEXPAND, 5 );
296 fgSizer3->Add( bSizer5, 1, wxALIGN_CENTER|wxALL, 10 );
298 bSizer3->Add( fgSizer3, 1, wxALIGN_BOTTOM|wxALIGN_RIGHT|wxEXPAND, 5 );
300 this->SetSizer( bSizer3 );
302 bSizer3->Fit( this );
306 this->Centre( wxBOTH );
309 Launcher::~Launcher()
314 void Launcher::OnClose( wxCloseEvent& WXUNUSED(event) )
317 m_panel->RemoveEventHandler(p_background);
324 void Launcher::OnPlay( wxCommandEvent& WXUNUSED(event) )
326 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
329 epath.Append( wxT("freespace2") );
331 epath.Append( wxT("freespace") );
335 epath.Append( wxT("_demo") );
339 epath.Append( wxT(".exe") );
342 wxExecute(epath, wxEXEC_ASYNC | wxEXEC_MAKE_GROUP_LEADER | wxEXEC_HIDE_CONSOLE);
347 void Launcher::OnSetup( wxCommandEvent& WXUNUSED(event) )
349 LauncherSetup setup(this);
354 void Launcher::OnReadme( wxCommandEvent& WXUNUSED(event) )
356 wxLaunchDefaultApplication("README.txt");
359 void Launcher::OnUpdate( wxCommandEvent& WXUNUSED(event) )
361 wxMessageBox( wxT("Not implemented") );
364 void Launcher::OnHelp( wxCommandEvent& WXUNUSED(event) )
366 wxDialog *help = new wxDialog(this, wxID_ANY, wxT("Launcher Help"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxSYSTEM_MENU);
369 bSizer = new wxBoxSizer( wxVERTICAL );
372 wxSize txtsize = help->GetTextExtent( wxT(" This opens a Help document containing information about the LauncherWW") );
373 txtsize.SetHeight(420);
375 wxTextCtrl *m_help_txt = new wxTextCtrl( help, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
376 m_help_txt->SetMinSize(txtsize);
377 m_help_txt->AppendText(fs2_help_txt);
378 m_help_txt->SetInsertionPoint(0);
379 bSizer->Add( m_help_txt, 0, wxALL|wxEXPAND, 5 );
381 wxButton *m_b_Ok = new wxButton( help, wxID_OK, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
382 bSizer->Add( m_b_Ok, 0, wxALIGN_BOTTOM|wxALIGN_RIGHT|wxALL, 5 );
384 help->SetSizer( bSizer );
388 help->Centre( wxBOTH );
395 void Launcher::OnUninstall( wxCommandEvent& WXUNUSED(event) )
397 wxMessageBox( wxT("Not implemented") );
400 void Launcher::OnVolition( wxCommandEvent& WXUNUSED(event) )
402 wxLaunchDefaultBrowser( wxT("http://www.volition-inc.com") );
405 void Launcher::OnPXO( wxCommandEvent& WXUNUSED(event) )
407 wxLaunchDefaultBrowser( wxT("http://www.pxo.net") );
410 void Launcher::OnQuit( wxCommandEvent& WXUNUSED(event) )
415 void Launcher::JumpToSetup()
417 if ( !os_config_read_uint(NULL, "StraightToSetup", 1) ) {
421 // FS1 doesn't do a setup jump so just go with what the user sets up
422 // and/or what the game binary will set
425 wxString title( wxT("Welcome to FreeSpace 2!") );
427 wxString message( wxT("Since this is your first time running FreeSapce2, ")
428 wxT("you will now be automatically taken to the Setup ")
431 wxString ext_message( wxT("NOTE TO USER:\n")
432 wxT("It is important that you view each section of ")
433 wxT("the Setup window and configure it to your ")
434 wxT("liking. Press the Help button if you have ")
435 wxT("questions about a particular section. Once you ")
436 wxT("are satisfied with your settings, select the OK ")
437 wxT("button at the bottom of the Setup window to ")
440 wxMessageDialog prompt(this, message, title, wxOK | wxICON_INFORMATION);
441 prompt.SetExtendedMessage(ext_message);
445 // now jump to setup dialog
446 LauncherSetup setup(this);
452 void Launcher::SndPlayHover()
455 alSourcePlay(m_snd_hover_source_id);
459 void Launcher::SndPlayPressed()
462 alSourcePlay(m_snd_click_source_id);
466 void Launcher::SndEnable(bool enabled)
475 void Launcher::init_sound()
482 if ( os_config_read_uint("Audio", "LauncherSoundEnabled", 1) == 0 ) {
486 al_device = alcOpenDevice(NULL);
488 if (al_device == NULL) {
492 al_context = alcCreateContext(al_device, NULL);
494 if (al_context == NULL) {
495 alcCloseDevice(al_device);
499 alcMakeContextCurrent(al_context);
502 alGenBuffers(1, &m_snd_hover_buf_id);
503 alBufferData(m_snd_hover_buf_id, AL_FORMAT_MONO8, fs2_snd_hover_wav, sizeof(fs2_snd_hover_wav), 22050);
505 alGenSources(1, &m_snd_hover_source_id);
506 alSourcef(m_snd_hover_source_id, AL_GAIN, 1.0f);
507 alSourcei(m_snd_hover_source_id, AL_BUFFER, m_snd_hover_buf_id);
510 alGenBuffers(1, &m_snd_click_buf_id);
511 alBufferData(m_snd_click_buf_id, AL_FORMAT_MONO8, fs2_snd_click_wav, sizeof(fs2_snd_click_wav), 22050);
513 alGenSources(1, &m_snd_click_source_id);
514 alSourcef(m_snd_click_source_id, AL_GAIN, 1.0f);
515 alSourcei(m_snd_click_source_id, AL_BUFFER, m_snd_click_buf_id);
521 void Launcher::close_sound()
527 alSourceStop(m_snd_click_source_id);
529 alSourcei(m_snd_click_source_id, AL_BUFFER, 0);
530 alDeleteSources(1, &m_snd_click_source_id);
531 alDeleteBuffers(1, &m_snd_click_buf_id);
533 alSourceStop(m_snd_hover_source_id);
535 alSourcei(m_snd_hover_source_id, AL_BUFFER, 0);
536 alDeleteSources(1, &m_snd_hover_source_id);
537 alDeleteBuffers(1, &m_snd_hover_buf_id);
539 alcMakeContextCurrent(NULL);
540 alcDestroyContext(al_context);
541 alcCloseDevice(al_device);