Implements skirmish maps, based on patch by sanderd17, fixes #1198. Skirmish maps are like scenarios, except the player can choose their civ during match setup. To create a skirmish map: place some skirmish entities for each player in Atlas (see templates/skirmish/* for examples), uncheck the player's civ in Atlas' player panel if desired, and save in the maps/skirmishes directory. The map will appear in match setup under the "Skirmish" match type.
Implements custom, VFS-based map load/save dialogs for Atlas (replaces
broken native file dialogs), fixes #631, #889.
Fixes map loading/saving to handle arbitrary subdirectories for better
organization.
Adds default settings to Atlas player panel, fixes #1872. Each setting
now has a checkbox to choose whether it should be saved with the map
(avoids writing lots of useless default data for each map).
Adds map preview setting to Atlas, refs #1745.
Cleans up and simplifies some duplicate code.
Fixes optional serialization performance test.
This was SVN commit r13938.
2013-10-03 19:29:16 -07:00
/* Copyright (C) 2013 Wildfire Games.
* This file is part of 0 A . D .
*
* 0 A . D . is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 2 of the License , or
* ( at your option ) any later version .
*
* 0 A . D . is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with 0 A . D . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "precompiled.h"
# include "MapDialog.h"
# include "GameInterface/MessagePasser.h"
# include "GameInterface/Messages.h"
2013-10-05 09:22:51 -07:00
# include <wx/filename.h>
# include <wx/notebook.h>
Implements skirmish maps, based on patch by sanderd17, fixes #1198. Skirmish maps are like scenarios, except the player can choose their civ during match setup. To create a skirmish map: place some skirmish entities for each player in Atlas (see templates/skirmish/* for examples), uncheck the player's civ in Atlas' player panel if desired, and save in the maps/skirmishes directory. The map will appear in match setup under the "Skirmish" match type.
Implements custom, VFS-based map load/save dialogs for Atlas (replaces
broken native file dialogs), fixes #631, #889.
Fixes map loading/saving to handle arbitrary subdirectories for better
organization.
Adds default settings to Atlas player panel, fixes #1872. Each setting
now has a checkbox to choose whether it should be saved with the map
(avoids writing lots of useless default data for each map).
Adds map preview setting to Atlas, refs #1745.
Cleans up and simplifies some duplicate code.
Fixes optional serialization performance test.
This was SVN commit r13938.
2013-10-03 19:29:16 -07:00
enum {
ID_MapDialogFilename = 1 ,
ID_MapDialogNotebook ,
ID_ScenarioPage ,
ID_SkirmishPage
} ;
static const wxString scenarioPath ( L " maps/scenarios/ " ) ;
static const wxString skirmishPath ( L " maps/skirmishes/ " ) ;
MapDialog : : MapDialog ( wxWindow * parent , MapDialogType type )
: wxDialog ( parent , wxID_ANY , wxEmptyString , wxDefaultPosition , wxSize ( 600 , 400 ) , wxCAPTION | wxRESIZE_BORDER | wxCLOSE_BOX | wxSYSTEM_MENU ) , m_Type ( type )
{
Freeze ( ) ;
SetIcon ( wxIcon ( _T ( " ICON_ScenarioEditor " ) ) ) ; // load from atlas.rc
if ( m_Type = = MAPDIALOG_OPEN )
SetTitle ( _ ( " Choose map to open " ) ) ;
else // MAPDIALOG_SAVE
SetTitle ( _ ( " Choose map to save " ) ) ;
AtlasMessage : : qGetMapList qry ;
qry . Post ( ) ;
wxSizer * sizer = new wxBoxSizer ( wxVERTICAL ) ;
wxNotebook * notebook = new wxNotebook ( this , ID_MapDialogNotebook ) ;
{
wxPanel * page = new wxPanel ( notebook , ID_ScenarioPage ) ;
wxSizer * pageSizer = new wxBoxSizer ( wxVERTICAL ) ;
// TODO: Should display something nicer than raw VFS paths
wxListBox * listBox = new wxListBox ( page , wxID_ANY , wxDefaultPosition , wxDefaultSize , 0 , NULL , wxLB_SINGLE | wxLB_HSCROLL ) ;
const std : : vector < std : : wstring > & scenarioFilenames = * qry . scenarioFilenames ;
for ( size_t i = 0 ; i < scenarioFilenames . size ( ) ; + + i )
{
wxString name = scenarioFilenames [ i ] . substr ( scenarioPath . Length ( ) ) ;
listBox - > Append ( name , new wxStringClientData ( scenarioFilenames [ i ] ) ) ;
}
pageSizer - > Add ( listBox , wxSizerFlags ( ) . Proportion ( 1 ) . Expand ( ) . Align ( wxBOTTOM ) ) ;
page - > SetSizer ( pageSizer ) ;
notebook - > AddPage ( page , _ ( " Scenarios " ) ) ;
}
{
wxPanel * page = new wxPanel ( notebook , ID_SkirmishPage ) ;
wxSizer * pageSizer = new wxBoxSizer ( wxVERTICAL ) ;
// TODO: Should display something nicer than raw VFS paths
wxListBox * listBox = new wxListBox ( page , wxID_ANY , wxDefaultPosition , wxDefaultSize , 0 , NULL , wxLB_SINGLE | wxLB_HSCROLL ) ;
const std : : vector < std : : wstring > & skirmishFilenames = * qry . skirmishFilenames ;
for ( size_t i = 0 ; i < skirmishFilenames . size ( ) ; + + i )
{
wxString name = skirmishFilenames [ i ] . substr ( skirmishPath . Length ( ) ) ;
listBox - > Append ( name , new wxStringClientData ( skirmishFilenames [ i ] ) ) ;
}
pageSizer - > Add ( listBox , wxSizerFlags ( ) . Proportion ( 1 ) . Expand ( ) ) ;
page - > SetSizer ( pageSizer ) ;
notebook - > AddPage ( page , _ ( " Skirmishes " ) ) ;
}
notebook - > SetSelection ( 0 ) ;
sizer - > Add ( notebook , wxSizerFlags ( ) . Proportion ( 1 ) . Expand ( ) ) ;
sizer - > AddSpacer ( 5 ) ;
wxSizer * filenameSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
filenameSizer - > AddSpacer ( 10 ) ;
filenameSizer - > Add ( new wxStaticText ( this , wxID_ANY , _ ( " Map name: " ) ) , wxSizerFlags ( ) . Align ( wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL ) ) ;
wxTextCtrl * filename = new wxTextCtrl ( this , ID_MapDialogFilename , wxEmptyString ) ;
if ( m_Type = = MAPDIALOG_OPEN )
filename - > Disable ( ) ;
filenameSizer - > Add ( filename , wxSizerFlags ( ) . Proportion ( 1 ) . Expand ( ) ) ;
sizer - > Add ( filenameSizer , wxSizerFlags ( ) . Expand ( ) ) ;
sizer - > AddSpacer ( 20 ) ;
wxSizer * buttonSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
if ( m_Type = = MAPDIALOG_OPEN )
buttonSizer - > Add ( new wxButton ( this , wxID_OPEN , _ ( " Open " ) ) ) ;
else // MAPDIALOG_SAVE
buttonSizer - > Add ( new wxButton ( this , wxID_SAVE , _ ( " Save " ) ) ) ;
buttonSizer - > AddSpacer ( 5 ) ;
buttonSizer - > Add ( new wxButton ( this , wxID_CANCEL , _ ( " Cancel " ) ) ) ;
sizer - > Add ( buttonSizer , wxSizerFlags ( ) . Align ( wxALIGN_RIGHT ) . Border ( wxRIGHT | wxBOTTOM , 10 ) ) ;
SetSizer ( sizer ) ;
Layout ( ) ;
Thaw ( ) ;
}
wxString MapDialog : : GetFilename ( ) const
{
wxFileName filename ( m_Filename , wxPATH_UNIX ) ;
filename . SetExt ( L " xml " ) ;
if ( m_SelectedPage = = 0 )
return scenarioPath + filename . GetFullPath ( wxPATH_UNIX ) ;
else if ( m_SelectedPage = = 1 )
return skirmishPath + filename . GetFullPath ( wxPATH_UNIX ) ;
else
return wxEmptyString ;
}
void MapDialog : : OnListBox ( wxCommandEvent & evt )
{
if ( evt . GetInt ( ) < 0 )
m_Filename = wxEmptyString ;
else
m_Filename = evt . GetString ( ) ;
wxDynamicCast ( FindWindow ( ID_MapDialogFilename ) , wxTextCtrl ) - > ChangeValue ( m_Filename ) ;
if ( evt . GetEventType ( ) = = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED )
{
if ( m_Type = = MAPDIALOG_OPEN )
OpenFile ( ) ;
else
SaveFile ( ) ;
}
}
void MapDialog : : OnCancel ( wxCommandEvent & WXUNUSED ( evt ) )
{
EndModal ( wxID_CANCEL ) ;
}
void MapDialog : : OnOpen ( wxCommandEvent & WXUNUSED ( evt ) )
{
OpenFile ( ) ;
}
void MapDialog : : OnSave ( wxCommandEvent & WXUNUSED ( evt ) )
{
SaveFile ( ) ;
}
void MapDialog : : OnFilename ( wxCommandEvent & evt )
{
m_Filename = evt . GetString ( ) ;
}
void MapDialog : : OnNotebookChanged ( wxNotebookEvent & evt )
{
m_SelectedPage = evt . GetSelection ( ) ;
}
void MapDialog : : OpenFile ( )
{
wxString filename = GetFilename ( ) ;
if ( filename . empty ( ) )
return ;
AtlasMessage : : qVFSFileExists qry ( filename . wc_str ( ) ) ;
qry . Post ( ) ;
if ( ! qry . exists )
return ;
EndModal ( wxID_OK ) ;
}
void MapDialog : : SaveFile ( )
{
wxString filename = GetFilename ( ) ;
if ( filename . empty ( ) )
return ;
// TODO: this test would work better outside the VFS
AtlasMessage : : qVFSFileExists qry ( filename . wc_str ( ) ) ;
qry . Post ( ) ;
if ( qry . exists )
{
if ( wxMessageBox ( _ ( " WARNING: ' " ) + filename + _ ( " ' already exists, it may be overwritten. Continue? " ) , _ ( " Overwrite map confirmation " ) , wxICON_EXCLAMATION | wxYES_NO ) ! = wxYES )
return ;
}
EndModal ( wxID_OK ) ;
}
BEGIN_EVENT_TABLE ( MapDialog , wxDialog )
EVT_BUTTON ( wxID_CANCEL , MapDialog : : OnCancel )
EVT_BUTTON ( wxID_OPEN , MapDialog : : OnOpen )
EVT_BUTTON ( wxID_SAVE , MapDialog : : OnSave )
EVT_LISTBOX ( wxID_ANY , MapDialog : : OnListBox )
EVT_LISTBOX_DCLICK ( wxID_ANY , MapDialog : : OnListBox )
EVT_TEXT ( ID_MapDialogFilename , MapDialog : : OnFilename )
EVT_NOTEBOOK_PAGE_CHANGED ( ID_MapDialogNotebook , MapDialog : : OnNotebookChanged )
END_EVENT_TABLE ( )