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"
62 class LauncherApp: public wxApp
65 virtual bool OnInit();
69 IMPLEMENT_APP(LauncherApp)
71 bool LauncherApp::OnInit()
74 // make sure we create files with user access only
75 umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
78 Launcher *frame = new Launcher(NULL);
88 bool wxBackgroundBitmap::ProcessEvent(wxEvent &Event)
90 if (Event.GetEventType() == wxEVT_ERASE_BACKGROUND) {
91 wxEraseEvent &EraseEvent = dynamic_cast<wxEraseEvent &>(Event);
92 wxDC *DC = EraseEvent.GetDC();
93 DC->DrawBitmap(Bitmap, 0, 0, false);
97 return Inherited::ProcessEvent(Event);
102 wxBEGIN_EVENT_TABLE(wxLauncherButton, wxStaticBitmap)
103 EVT_LEFT_DOWN(wxLauncherButton::onMouseDown)
104 EVT_LEFT_UP(wxLauncherButton::onMouseUp)
105 EVT_MOTION(wxLauncherButton::onMouseEnter)
109 wxLauncherButton::wxLauncherButton(wxWindow *parent, wxWindowID id, const wxBitmap& label, const wxPoint& pos, const wxSize& size)
111 this->Create(parent, id, label, pos, size);
113 parent->Connect(wxEVT_MOTION, wxMouseEventHandler(wxLauncherButton::onMouseLeave), NULL, this);
120 wxLauncherButton::~wxLauncherButton()
124 void wxLauncherButton::onMouseEnter(wxMouseEvent& event)
127 this->SetBitmap(m_bitmap_hover);
129 ((Launcher*)GetGrandParent())->SndPlayHover();
133 // hack to toggle off certain buttons that don't get the onMouseLeave
134 // call due to placement/overlap
138 const wxWindowList wl = GetParent()->GetChildren();
140 wxWindowList::compatibility_iterator node = wl.GetFirst();
143 wxLauncherButton *cur = (wxLauncherButton*)node->GetData();
145 if ( cur->GetId() != event.GetId() ) {
146 cur->onMouseLeave(mv);
149 node = node->GetNext();
157 void wxLauncherButton::onMouseLeave(wxMouseEvent& event)
160 this->SetBitmap(m_bitmap);
168 void wxLauncherButton::onMouseDown(wxMouseEvent& event)
170 this->SetBitmap(m_bitmap_pressed);
172 ((Launcher*)GetGrandParent())->SndPlayPressed();
177 void wxLauncherButton::onMouseUp(wxMouseEvent& event)
179 this->SetBitmap(m_bitmap_hover);
181 wxCommandEvent ev(wxEVT_COMMAND_BUTTON_CLICKED, event.GetId());
182 GetGrandParent()->GetEventHandler()->ProcessEvent(ev);
188 wxBEGIN_EVENT_TABLE(Launcher, wxDialog)
189 EVT_CLOSE(Launcher::OnClose)
190 EVT_BUTTON(ID_B_PLAY, Launcher::OnPlay)
191 EVT_BUTTON(ID_B_SETUP, Launcher::OnSetup)
192 EVT_BUTTON(ID_B_README, Launcher::OnReadme)
193 EVT_BUTTON(ID_B_UPDATE, Launcher::OnUpdate)
194 EVT_BUTTON(ID_B_HELP, Launcher::OnHelp)
195 EVT_BUTTON(ID_B_UNINSTALL, Launcher::OnUninstall)
196 EVT_BUTTON(ID_B_VOLITION, Launcher::OnVolition)
197 EVT_BUTTON(ID_B_PXO, Launcher::OnPXO)
198 EVT_BUTTON(ID_B_QUIT, Launcher::OnQuit)
202 Launcher::Launcher( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
203 : wxDialog( parent, id, title, pos, size, style )
205 this->SetBackgroundColour( wxColour( 0, 0, 0 ) );
210 this->SetClientSize(375, 440);
212 this->SetTitle( wxT("FreeSpace 2 Demo Launcher") );
214 this->SetTitle( wxT("FreeSpace 2 Launcher") );
220 p_background = new wxBackgroundBitmap(fs2_background_xpm);
222 m_panel = new wxPanel(this);
223 m_panel->PushEventHandler(p_background);
226 m_btn_Play = new wxLauncherButton( m_panel, ID_B_PLAY, wxBitmap(fs2_btn_play_xpm), wxPoint(45, 102), wxSize(131, 58) );
227 m_btn_Play->SetBitmapHover( wxBitmap(fs2_btn_play_hover_xpm) );
228 m_btn_Play->SetBitmapPressed( wxBitmap(fs2_btn_play_click_xpm) );
230 m_btn_Setup = new wxLauncherButton( m_panel, ID_B_SETUP, wxBitmap(fs2_btn_setup_xpm), wxPoint(199, 102), wxSize(131, 58) );
231 m_btn_Setup->SetBitmapHover( wxBitmap(fs2_btn_setup_hover_xpm) );
232 m_btn_Setup->SetBitmapPressed( wxBitmap(fs2_btn_setup_click_xpm) );
234 m_btn_Readme = new wxLauncherButton( m_panel, ID_B_README, wxBitmap(fs2_btn_readme_xpm), wxPoint(45, 175), wxSize(131, 58) );
235 m_btn_Readme->SetBitmapHover( wxBitmap(fs2_btn_readme_hover_xpm) );
236 m_btn_Readme->SetBitmapPressed( wxBitmap(fs2_btn_readme_click_xpm) );
238 m_btn_Update = new wxLauncherButton( m_panel, ID_B_UPDATE, wxBitmap(fs2_btn_update_xpm), wxPoint(199, 175), wxSize(131, 58) );
239 m_btn_Update->SetBitmapHover( wxBitmap(fs2_btn_update_hover_xpm) );
240 m_btn_Update->SetBitmapPressed( wxBitmap(fs2_btn_update_click_xpm) );
242 m_btn_Help = new wxLauncherButton( m_panel, ID_B_HELP, wxBitmap(fs2_btn_help_xpm), wxPoint(45, 247), wxSize(131, 58) );
243 m_btn_Help->SetBitmapHover( wxBitmap(fs2_btn_help_hover_xpm) );
244 m_btn_Help->SetBitmapPressed( wxBitmap(fs2_btn_help_click_xpm) );
246 m_btn_Uninstall = new wxLauncherButton( m_panel, ID_B_UNINSTALL, wxBitmap(fs2_btn_uninstall_xpm), wxPoint(199, 247), wxSize(131, 58) );
247 m_btn_Uninstall->SetBitmapHover( wxBitmap(fs2_btn_uninstall_hover_xpm) );
248 m_btn_Uninstall->SetBitmapPressed( wxBitmap(fs2_btn_uninstall_click_xpm) );
250 m_btn_Volition = new wxLauncherButton( m_panel, ID_B_VOLITION, wxBitmap(fs2_btn_volition_xpm), wxPoint(15, 304), wxSize(90, 108) );
251 m_btn_Volition->SetBitmapHover( wxBitmap(fs2_btn_volition_hover_xpm) );
252 m_btn_Volition->SetBitmapPressed( wxBitmap(fs2_btn_volition_click_xpm) );
254 m_btn_PXO = new wxLauncherButton( m_panel, ID_B_PXO, wxBitmap(fs2_btn_pxo_xpm), wxPoint(249, 305), wxSize(114, 113) );
255 m_btn_PXO->SetBitmapHover( wxBitmap(fs2_btn_pxo_hover_xpm) );
256 m_btn_PXO->SetBitmapPressed( wxBitmap(fs2_btn_pxo_click_xpm) );
258 m_btn_Quit = new wxLauncherButton( m_panel, ID_B_QUIT, wxBitmap(fs2_btn_quit_xpm), wxPoint(116, 339), wxSize(131, 58) );
259 m_btn_Quit->SetBitmapHover( wxBitmap(fs2_btn_quit_hover_xpm) );
260 m_btn_Quit->SetBitmapPressed( wxBitmap(fs2_btn_quit_click_xpm) );
262 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
264 this->SetTitle( wxT("FreeSpace Demo Launcher") );
266 this->SetTitle( wxT("FreeSpace Launcher") );
270 bSizer3 = new wxBoxSizer( wxVERTICAL );
272 wxStaticBitmap *m_bitmap1 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( freespace_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
273 bSizer3->Add( m_bitmap1, 0, wxALIGN_LEFT|wxALIGN_TOP|wxALL, 5 );
275 wxFlexGridSizer* fgSizer3;
276 fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
277 fgSizer3->SetFlexibleDirection( wxBOTH );
278 fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
280 wxStaticBitmap *m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( volition_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
281 fgSizer3->Add( m_bitmap2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
284 bSizer5 = new wxBoxSizer( wxVERTICAL );
286 m_btn_Play = new wxButton( this, ID_B_PLAY, wxT("Play FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
287 m_btn_Play->SetDefault();
288 bSizer5->Add( m_btn_Play, 0, wxALL|wxEXPAND, 5 );
290 m_btn_Setup = new wxButton( this, ID_B_SETUP, wxT("Setup"), wxDefaultPosition, wxDefaultSize, 0 );
291 bSizer5->Add( m_btn_Setup, 0, wxALL|wxEXPAND, 5 );
293 m_btn_Readme = new wxButton( this, ID_B_README, wxT("View README"), wxDefaultPosition, wxDefaultSize, 0 );
294 bSizer5->Add( m_btn_Readme, 0, wxALL|wxEXPAND, 5 );
296 m_btn_Update = new wxButton( this, ID_B_UPDATE, wxT("Update FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
297 bSizer5->Add( m_btn_Update, 0, wxALL|wxEXPAND, 5 );
299 m_btn_Volition = new wxButton( this, ID_B_VOLITION, wxT("FreeSpace Webpage"), wxDefaultPosition, wxDefaultSize, 0 );
300 bSizer5->Add( m_btn_Volition, 0, wxALL|wxEXPAND, 5 );
302 m_btn_Uninstall = new wxButton( this, ID_B_UNINSTALL, wxT("Uninstall"), wxDefaultPosition, wxDefaultSize, 0 );
303 bSizer5->Add( m_btn_Uninstall, 0, wxALL|wxEXPAND, 5 );
305 m_btn_Quit = new wxButton( this, ID_B_QUIT, wxT("Quit"), wxDefaultPosition, wxDefaultSize, 0 );
306 bSizer5->Add( m_btn_Quit, 0, wxALL|wxEXPAND, 5 );
308 fgSizer3->Add( bSizer5, 1, wxALIGN_CENTER|wxALL, 10 );
310 bSizer3->Add( fgSizer3, 1, wxALIGN_BOTTOM|wxALIGN_RIGHT|wxEXPAND, 5 );
312 this->SetSizer( bSizer3 );
314 bSizer3->Fit( this );
318 this->Centre( wxBOTH );
321 Launcher::~Launcher()
326 void Launcher::OnClose( wxCloseEvent& WXUNUSED(event) )
329 m_panel->RemoveEventHandler(p_background);
336 void Launcher::OnPlay( wxCommandEvent& WXUNUSED(event) )
338 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
340 epath.Append( wxT("fs") );
343 epath.Append( wxT("2") );
346 #if defined(FS1_DEMO) || defined(FS2_DEMO)
347 epath.Append( wxT("demo") );
351 epath.Append( wxT(".exe") );
354 wxExecute(epath, wxEXEC_ASYNC | wxEXEC_MAKE_GROUP_LEADER);
359 void Launcher::OnSetup( wxCommandEvent& WXUNUSED(event) )
361 LauncherSetup setup(this);
366 void Launcher::OnReadme( wxCommandEvent& WXUNUSED(event) )
368 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
370 epath.Append( wxT("readme.txt") );
372 wxLaunchDefaultApplication(epath);
375 void Launcher::OnUpdate( wxCommandEvent& WXUNUSED(event) )
377 wxMessageBox( wxT("Not implemented") );
380 void Launcher::OnHelp( wxCommandEvent& WXUNUSED(event) )
383 wxDialog *help = new wxDialog(this, wxID_ANY, wxT("Launcher Help"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxSYSTEM_MENU);
386 bSizer = new wxBoxSizer( wxVERTICAL );
389 wxSize txtsize = help->GetTextExtent( wxT(" This opens a Help document containing information about the LauncherWWWW") );
390 txtsize.SetHeight(420);
392 wxTextCtrl *m_help_txt = new wxTextCtrl( help, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
393 m_help_txt->SetMinSize(txtsize);
395 m_help_txt->AppendText(fs2demo_help_txt);
397 m_help_txt->AppendText(fs2_help_txt);
399 m_help_txt->SetInsertionPoint(0);
400 bSizer->Add( m_help_txt, 0, wxALL|wxEXPAND, 5 );
402 wxButton *m_b_Ok = new wxButton( help, wxID_OK, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
403 bSizer->Add( m_b_Ok, 0, wxALIGN_RIGHT|wxALL, 5 );
405 help->SetSizer( bSizer );
409 help->Centre( wxBOTH );
417 void Launcher::OnUninstall( wxCommandEvent& WXUNUSED(event) )
419 wxMessageBox( wxT("Not implemented") );
422 void Launcher::OnVolition( wxCommandEvent& WXUNUSED(event) )
424 wxLaunchDefaultBrowser( wxT("http://www.volition-inc.com") );
427 void Launcher::OnPXO( wxCommandEvent& WXUNUSED(event) )
429 wxLaunchDefaultBrowser( wxT("http://www.pxo.net") );
432 void Launcher::OnQuit( wxCommandEvent& WXUNUSED(event) )
437 void Launcher::JumpToSetup()
439 if ( !os_config_read_uint(NULL, "StraightToSetup", 1) ) {
443 // FS1 doesn't do a setup jump so just go with what the user sets up
444 // and/or what the game binary will set
447 wxString title( wxT("Welcome to FreeSpace 2!") );
449 wxString message( wxT("Since this is your first time running FreeSapce2, ")
450 wxT("you will now be automatically taken to the Setup ")
453 wxString ext_message( wxT("NOTE TO USER:\n")
454 wxT("It is important that you view each section of ")
455 wxT("the Setup window and configure it to your ")
456 wxT("liking. Press the Help button if you have ")
457 wxT("questions about a particular section. Once you ")
458 wxT("are satisfied with your settings, select the OK ")
459 wxT("button at the bottom of the Setup window to ")
462 wxMessageDialog prompt(this, message, title, wxOK | wxICON_INFORMATION);
463 prompt.SetExtendedMessage(ext_message);
467 // now jump to setup dialog
468 LauncherSetup setup(this);
474 void Launcher::SndPlayHover()
477 alSourcePlay(m_snd_hover_source_id);
481 void Launcher::SndPlayPressed()
484 alSourcePlay(m_snd_click_source_id);
488 void Launcher::SndEnable(bool enabled)
497 void Launcher::init_sound()
504 if ( os_config_read_uint("Audio", "LauncherSoundEnabled", 1) == 0 ) {
508 al_device = alcOpenDevice(NULL);
510 if (al_device == NULL) {
514 al_context = alcCreateContext(al_device, NULL);
516 if (al_context == NULL) {
517 alcCloseDevice(al_device);
521 alcMakeContextCurrent(al_context);
524 alGenBuffers(1, &m_snd_hover_buf_id);
525 alBufferData(m_snd_hover_buf_id, AL_FORMAT_MONO8, fs2_snd_hover_wav, sizeof(fs2_snd_hover_wav), 22050);
527 alGenSources(1, &m_snd_hover_source_id);
528 alSourcef(m_snd_hover_source_id, AL_GAIN, 1.0f);
529 alSourcei(m_snd_hover_source_id, AL_BUFFER, m_snd_hover_buf_id);
532 alGenBuffers(1, &m_snd_click_buf_id);
533 alBufferData(m_snd_click_buf_id, AL_FORMAT_MONO8, fs2_snd_click_wav, sizeof(fs2_snd_click_wav), 22050);
535 alGenSources(1, &m_snd_click_source_id);
536 alSourcef(m_snd_click_source_id, AL_GAIN, 1.0f);
537 alSourcei(m_snd_click_source_id, AL_BUFFER, m_snd_click_buf_id);
543 void Launcher::close_sound()
549 alSourceStop(m_snd_click_source_id);
551 alSourcei(m_snd_click_source_id, AL_BUFFER, 0);
552 alDeleteSources(1, &m_snd_click_source_id);
553 alDeleteBuffers(1, &m_snd_click_buf_id);
555 alSourceStop(m_snd_hover_source_id);
557 alSourcei(m_snd_hover_source_id, AL_BUFFER, 0);
558 alDeleteSources(1, &m_snd_hover_source_id);
559 alDeleteBuffers(1, &m_snd_hover_buf_id);
561 alcMakeContextCurrent(NULL);
562 alcDestroyContext(al_context);
563 alcCloseDevice(al_device);