Просмотр исходного кода

Merge pull request #3086 from Laserlicht/show_random

show random maps
Ivan Savenko 2 лет назад
Родитель
Сommit
8752551786

+ 8 - 0
client/lobby/CSelectionBase.cpp

@@ -111,6 +111,14 @@ void CSelectionBase::toggleTab(std::shared_ptr<CIntObject> tab)
 	{
 		curTab.reset();
 	}
+
+	if(tabSel->showRandom && tab != tabOpt)
+	{
+		tabSel->curFolder = "";
+		tabSel->showRandom = false;
+		tabSel->filter(0, true);
+	}
+
 	GH.windows().totalRedraw();
 }
 

+ 12 - 0
client/lobby/RandomMapTab.cpp

@@ -11,6 +11,8 @@
 
 #include "RandomMapTab.h"
 #include "CSelectionBase.h"
+#include "CLobbyScreen.h"
+#include "SelectionTab.h"
 
 #include "../CGameInfo.h"
 #include "../CServerHandler.h"
@@ -121,6 +123,16 @@ RandomMapTab::RandomMapTab():
 	const JsonNode config(JsonPath::builtin("config/widgets/randomMapTab.json"));
 	build(config);
 	
+	if(auto w = widget<CButton>("buttonShowRandomMaps"))
+	{
+		w->addCallback([&]()
+		{
+			(static_cast<CLobbyScreen *>(parent))->toggleTab((static_cast<CLobbyScreen *>(parent))->tabSel);
+			(static_cast<CLobbyScreen *>(parent))->tabSel->showRandom = true;
+			(static_cast<CLobbyScreen *>(parent))->tabSel->filter(0, true);
+		});
+	}
+
 	//set combo box callbacks
 	if(auto w = widget<ComboBox>("templateList"))
 	{

+ 8 - 2
client/lobby/SelectionTab.cpp

@@ -147,7 +147,7 @@ static ESortBy getSortBySelectionScreen(ESelectionScreen Type)
 }
 
 SelectionTab::SelectionTab(ESelectionScreen Type)
-	: CIntObject(LCLICK | SHOW_POPUP | KEYBOARD | DOUBLECLICK), callOnSelect(nullptr), tabType(Type), selectionPos(0), sortModeAscending(true), inputNameRect{32, 539, 350, 20}, curFolder(""), currentMapSizeFilter(0)
+	: CIntObject(LCLICK | SHOW_POPUP | KEYBOARD | DOUBLECLICK), callOnSelect(nullptr), tabType(Type), selectionPos(0), sortModeAscending(true), inputNameRect{32, 539, 350, 20}, curFolder(""), currentMapSizeFilter(0), showRandom(false)
 {
 	OBJ_CONSTRUCTION;
 
@@ -427,9 +427,15 @@ void SelectionTab::filter(int size, bool selectFirst)
 	{
 		if((elem->mapHeader && (!size || elem->mapHeader->width == size)) || tabType == ESelectionScreen::campaignList)
 		{
+			if(showRandom)
+				curFolder = "RANDOMMAPS/";
+
 			auto [folderName, baseFolder, parentExists, fileInFolder] = checkSubfolder(elem->originalFileURI);
 
-			if(parentExists)
+			if((showRandom && baseFolder != "RANDOMMAPS") || (!showRandom && baseFolder == "RANDOMMAPS"))
+				continue;
+
+			if(parentExists && !showRandom)
 			{
 				auto folder = std::make_shared<ElementInfo>();
 				folder->isFolder = true;

+ 1 - 0
client/lobby/SelectionTab.h

@@ -78,6 +78,7 @@ public:
 	ESortBy generalSortingBy;
 	bool sortModeAscending;
 	int currentMapSizeFilter = 0;
+	bool showRandom;
 
 	std::shared_ptr<CTextInput> inputName;
 

+ 5 - 2
lib/gameState/CGameState.cpp

@@ -566,17 +566,20 @@ void CGameState::initNewGame(const IMapService * mapService, bool allowSavingRan
 		{
 			try
 			{
-				auto path = VCMIDirs::get().userCachePath() / "RandomMaps";
+				auto path = VCMIDirs::get().userDataPath() / "Maps" / "RandomMaps";
 				boost::filesystem::create_directories(path);
 
 				std::shared_ptr<CMapGenOptions> options = scenarioOps->mapGenOptions;
 
 				const std::string templateName = options->getMapTemplate()->getName();
 				const ui32 seed = scenarioOps->seedToBeUsed;
+				const std::string dt = vstd::getDateTimeISO8601Basic(std::time(0));
 
-				const std::string fileName = boost::str(boost::format("%s_%d.vmap") % templateName % seed );
+				const std::string fileName = boost::str(boost::format("%s_%s_%d.vmap") % dt % templateName % seed );
 				const auto fullPath = path / fileName;
 
+				randomMap->name.appendRawString(boost::str(boost::format(" %s") % dt));
+
 				mapService->saveMap(randomMap, fullPath);
 
 				logGlobal->info("Random map has been saved to:");

+ 1 - 1
lib/gameState/CGameState.h

@@ -99,7 +99,7 @@ public:
 
 	void preInit(Services * services);
 
-	void init(const IMapService * mapService, StartInfo * si, Load::ProgressAccumulator &, bool allowSavingRandomMap = false);
+	void init(const IMapService * mapService, StartInfo * si, Load::ProgressAccumulator &, bool allowSavingRandomMap = true);
 	void updateOnLoad(StartInfo * si);
 
 	ConstTransitivePtr<StartInfo> scenarioOps, initialOpts; //second one is a copy of settings received from pregame (not randomized)