Index: source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Map/Map.cpp =================================================================== --- source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Map/Map.cpp +++ source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Map/Map.cpp @@ -21,6 +21,7 @@ #include "AtlasObject/AtlasObject.h" #include "GameInterface/Messages.h" +#include "General/Datafile.h" #include "ScenarioEditor/ScenarioEditor.h" #include "ScenarioEditor/Tools/Common/Tools.h" @@ -31,13 +32,16 @@ { ID_MapName, ID_MapDescription, + ID_MapPreview, ID_MapReveal, ID_MapType, - ID_MapPreview, - ID_MapTeams, + ID_MapVictoryDurationTime, + ID_MapLockTeams, + ID_MapLastManStanding, ID_MapKW_Demo, ID_MapKW_Naval, ID_RandomScript, + ID_OpenPlayerPanel, ID_RandomSize, ID_RandomSeed, ID_RandomReseed, @@ -46,8 +50,7 @@ ID_SimFast, ID_SimSlow, ID_SimPause, - ID_SimReset, - ID_OpenPlayerPanel + ID_SimReset }; enum @@ -141,15 +144,10 @@ sizer->AddSpacer(5); - // TODO: replace by filenames in binaries/data/mods/public/simulation/data/settings/victory_conditions/ - wxArrayString gameTypes; - gameTypes.Add(_T("conquest")); - gameTypes.Add(_T("conquest_structures")); - gameTypes.Add(_T("conquest_units")); - gameTypes.Add(_T("wonder")); - gameTypes.Add(_T("endless")); - gameTypes.Add(_T("regicide")); - gameTypes.Add(_T("capture_the_relic")); + wxArrayString gameTypes = Datafile::EnumerateDataFiles(_T("mods/public/simulation/data/settings/victory_conditions/"), _T("*.json")); + // Discard path and extension of game types + for (wxString& gameType : gameTypes) + gameType = wxFileName(gameType).GetName(); wxFlexGridSizer* gridSizer = new wxFlexGridSizer(2, 5, 5); gridSizer->AddGrowableCol(1); @@ -163,9 +161,16 @@ gridSizer->Add(new wxStaticText(this, wxID_ANY, _("Game type")), wxSizerFlags().Align(wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT)); gridSizer->Add(Tooltipped(new wxChoice(this, ID_MapType, wxDefaultPosition, wxDefaultSize, gameTypes), _("Select the game type (or victory condition)")), wxSizerFlags().Expand()); + gridSizer->Add(new wxStaticText(this, wxID_ANY, _("Victory duration")), wxSizerFlags().Align(wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT)); + gridSizer->Add(Tooltipped(new wxTextCtrl(this, ID_MapVictoryDurationTime, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxTextValidator(wxFILTER_DIGITS)), + _("Number of minutes until the player has won (only for certain victory conditions)")), wxSizerFlags().Expand()); + gridSizer->Add(new wxStaticText(this, wxID_ANY, _("Lock teams")), wxSizerFlags().Align(wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT)); - gridSizer->Add(Tooltipped(new wxCheckBox(this, ID_MapTeams, wxEmptyString), + gridSizer->Add(Tooltipped(new wxCheckBox(this, ID_MapLockTeams, wxEmptyString), _("If checked, teams will be locked"))); + gridSizer->Add(new wxStaticText(this, wxID_ANY, _("Last Man Standing")), wxSizerFlags().Align(wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT)); + gridSizer->Add(Tooltipped(new wxCheckBox(this, ID_MapLastManStanding, wxEmptyString), + _("If checked, the last remaining player will win (not the last remaining set of allies)"))); sizer->Add(gridSizer, wxSizerFlags().Expand()); sizer->AddSpacer(5); @@ -210,8 +215,20 @@ else wxDynamicCast(FindWindow(ID_MapType), wxChoice)->SetSelection(0); + if (wxString(m_MapSettings["GameType"]) == L"wonder" || wxString(m_MapSettings["GameType"]) == L"capture_the_relic") + wxDynamicCast(FindWindow(ID_MapVictoryDurationTime), wxTextCtrl)->ChangeValue(wxString(m_MapSettings["VictoryDuration"])); + + wxString mapGameType = wxDynamicCast(FindWindow(ID_MapType), wxChoice)->GetStringSelection(); + wxDynamicCast(FindWindow(ID_MapVictoryDurationTime), wxTextCtrl)->Enable(mapGameType == L"wonder" || mapGameType == L"capture_the_relic"); + // lock teams - wxDynamicCast(FindWindow(ID_MapTeams), wxCheckBox)->SetValue(wxString(m_MapSettings["LockTeams"]) == L"true"); + wxDynamicCast(FindWindow(ID_MapLockTeams), wxCheckBox)->SetValue(wxString(m_MapSettings["LockTeams"]) == L"true"); + + // Last Man Standing + wxDynamicCast(FindWindow(ID_MapLastManStanding), wxCheckBox)->SetValue(wxString(m_MapSettings["LastManStanding"]) == L"true" && + wxString(m_MapSettings["LockTeams"]) != L"true"); + + wxDynamicCast(FindWindow(ID_MapLastManStanding), wxCheckBox)->Enable(!wxDynamicCast(FindWindow(ID_MapLockTeams), wxCheckBox)->GetValue()); // keywords { @@ -247,7 +264,13 @@ m_MapSettings.setBool("RevealMap", wxDynamicCast(FindWindow(ID_MapReveal), wxCheckBox)->GetValue()); // game type / victory conditions - m_MapSettings.set("GameType", wxDynamicCast(FindWindow(ID_MapType), wxChoice)->GetStringSelection()); + wxString mapGameType = wxDynamicCast(FindWindow(ID_MapType), wxChoice)->GetStringSelection(); + m_MapSettings.set("GameType", mapGameType); + + if (mapGameType == L"wonder" || mapGameType == L"capture_the_relic") + m_MapSettings.setInt("VictoryDuration", wxAtoi(wxDynamicCast(FindWindow(ID_MapVictoryDurationTime), wxTextCtrl)->GetValue())); + + wxDynamicCast(FindWindow(ID_MapVictoryDurationTime), wxTextCtrl)->Enable(mapGameType == L"wonder" || mapGameType == L"capture_the_relic"); // keywords { @@ -269,7 +292,15 @@ } // teams locked - m_MapSettings.setBool("LockTeams", wxDynamicCast(FindWindow(ID_MapTeams), wxCheckBox)->GetValue()); + m_MapSettings.setBool("LockTeams", wxDynamicCast(FindWindow(ID_MapLockTeams), wxCheckBox)->GetValue()); + + // Last Man Standing (can't be enabled if teams are locked) + if (wxDynamicCast(FindWindow(ID_MapLockTeams), wxCheckBox)->GetValue()) + wxDynamicCast(FindWindow(ID_MapLastManStanding), wxCheckBox)->SetValue(false); + + wxDynamicCast(FindWindow(ID_MapLastManStanding), wxCheckBox)->Enable(!wxDynamicCast(FindWindow(ID_MapLockTeams), wxCheckBox)->GetValue()); + + m_MapSettings.setBool("LastManStanding", wxDynamicCast(FindWindow(ID_MapLastManStanding), wxCheckBox)->GetValue()); return m_MapSettings; } @@ -314,7 +345,7 @@ gridSizer->Add(new wxStaticText(this, wxID_ANY, _("Random seed")), wxSizerFlags().Align(wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT)); wxBoxSizer* seedSizer = new wxBoxSizer(wxHORIZONTAL); - seedSizer->Add(Tooltipped(new wxTextCtrl(this, ID_RandomSeed, _T("0"), wxDefaultPosition, wxDefaultSize, 0, wxTextValidator(wxFILTER_NUMERIC)), + seedSizer->Add(Tooltipped(new wxTextCtrl(this, ID_RandomSeed, _T("0"), wxDefaultPosition, wxDefaultSize, 0, wxTextValidator(wxFILTER_DIGITS)), _("Seed value for random map")), wxSizerFlags(1).Expand()); seedSizer->Add(Tooltipped(new wxButton(this, ID_RandomReseed, _("R"), wxDefaultPosition, wxSize(24, -1)), _("New random seed")));