Explorar o código

unlimited replay option

Laserlicht hai 1 ano
pai
achega
cb9c4bbaf0

+ 3 - 1
Mods/vcmi/config/vcmi/english.json

@@ -307,9 +307,11 @@
 
 	"vcmi.optionsTab.extraOptions.hover" : "Extra Options",
 	"vcmi.optionsTab.extraOptions.help" : "Additional settings for the game.",
-	
+
 	"vcmi.optionsTab.cheatAllowed.hover" : "Allow cheats",
+	"vcmi.optionsTab.unlimitedReplay.hover" : "Unlimited battle replay",
 	"vcmi.optionsTab.cheatAllowed.help" : "{Allow cheats}\nAllows the inputs of cheats during the game.",
+	"vcmi.optionsTab.unlimitedReplay.help" : "{Unlimited battle replay}\nNo limit of replaying battles.",
 
 	// Custom victory conditions for H3 campaigns and HotA maps
 	"vcmi.map.victoryCondition.daysPassed.toOthers" : "The enemy has managed to survive till this day. Victory is theirs!",

+ 2 - 0
Mods/vcmi/config/vcmi/german.json

@@ -303,7 +303,9 @@
 	"vcmi.optionsTab.extraOptions.help" : "Zusätzliche Einstellungen für das Spiel.",
 	
 	"vcmi.optionsTab.cheatAllowed.hover" : "Cheats erlauben",
+	"vcmi.optionsTab.unlimitedReplay.hover" : "Unbegrenzte Kampfwiederholung",
 	"vcmi.optionsTab.cheatAllowed.help" : "{Cheats erlauben}\nErlaubt die Eingabe von Cheats während des Spiels.",
+	"vcmi.optionsTab.unlimitedReplay.help" : "{Unbegrenzte Kampfwiederholung}\nKämpfe lassen sich unbegrenzt wiederholen.",
 
 	// Custom victory conditions for H3 campaigns and HotA maps
 	"vcmi.map.victoryCondition.daysPassed.toOthers" : "Der Feind hat es geschafft, bis zum heutigen Tag zu überleben. Der Sieg gehört ihm!",

+ 4 - 4
client/CServerHandler.cpp

@@ -507,11 +507,11 @@ void CServerHandler::setTurnTimerInfo(const TurnTimerInfo & info) const
 	sendLobbyPack(lstt);
 }
 
-void CServerHandler::setCheatAllowedInfo(bool allowed) const
+void CServerHandler::setExtraOptionsInfo(const ExtraOptionsInfo & info) const
 {
-	LobbySetCheatAllowed lsca;
-	lsca.allowed = allowed;
-	sendLobbyPack(lsca);
+	LobbySetExtraOptions lseo;
+	lseo.extraOptionsInfo = info;
+	sendLobbyPack(lseo);
 }
 
 void CServerHandler::sendMessage(const std::string & txt) const

+ 2 - 2
client/CServerHandler.h

@@ -72,7 +72,7 @@ public:
 	virtual void setDifficulty(int to) const = 0;
 	virtual void setTurnTimerInfo(const TurnTimerInfo &) const = 0;
 	virtual void setSimturnsInfo(const SimturnsInfo &) const = 0;
-	virtual void setCheatAllowedInfo(bool allowed) const = 0;
+	virtual void setExtraOptionsInfo(const ExtraOptionsInfo & info) const = 0;
 	virtual void sendMessage(const std::string & txt) const = 0;
 	virtual void sendGuiAction(ui8 action) const = 0; // TODO: possibly get rid of it?
 	virtual void sendStartGame(bool allowOnlyAI = false) const = 0;
@@ -159,7 +159,7 @@ public:
 	void setDifficulty(int to) const override;
 	void setTurnTimerInfo(const TurnTimerInfo &) const override;
 	void setSimturnsInfo(const SimturnsInfo &) const override;
-	void setCheatAllowedInfo(bool allowed) const override;
+	void setExtraOptionsInfo(const ExtraOptionsInfo &) const override;
 	void sendMessage(const std::string & txt) const override;
 	void sendGuiAction(ui8 action) const override;
 	void sendRestartGame() const override;

+ 1 - 1
client/battle/BattleInterfaceClasses.cpp

@@ -471,7 +471,7 @@ BattleResultWindow::BattleResultWindow(const BattleResult & br, CPlayerInterface
 	exit = std::make_shared<CButton>(Point(384, 505), AnimationPath::builtin("iok6432.def"), std::make_pair("", ""), [&](){ bExitf();}, EShortcut::GLOBAL_ACCEPT);
 	exit->setBorderColor(Colors::METALLIC_GOLD);
 	
-	if(allowReplay)
+	if(allowReplay || owner.cb->getStartInfo()->extraOptionsInfo.unlimitedReplay)
 	{
 		repeat = std::make_shared<CButton>(Point(24, 505), AnimationPath::builtin("icn6432.def"), std::make_pair("", ""), [&](){ bRepeatf();}, EShortcut::GLOBAL_CANCEL);
 		repeat->setBorderColor(Colors::METALLIC_GOLD);

+ 13 - 2
client/lobby/OptionsTabBase.cpp

@@ -91,7 +91,15 @@ OptionsTabBase::OptionsTabBase(const JsonPath & configPath)
 	});
 
 	addCallback("setCheatAllowed", [&](int index){
-		CSH->setCheatAllowedInfo(index);
+		ExtraOptionsInfo info = SEL->getStartInfo()->extraOptionsInfo;
+		info.cheatsAllowed = index;
+		CSH->setExtraOptionsInfo(info);
+	});
+
+	addCallback("setUnlimitedReplay", [&](int index){
+		ExtraOptionsInfo info = SEL->getStartInfo()->extraOptionsInfo;
+		info.unlimitedReplay = index;
+		CSH->setExtraOptionsInfo(info);
 	});
 
 	addCallback("setTurnTimerAccumulate", [&](int index){
@@ -391,5 +399,8 @@ void OptionsTabBase::recreate()
 	}
 
 	if(auto buttonCheatAllowed = widget<CToggleButton>("buttonCheatAllowed"))
-		buttonCheatAllowed->setSelectedSilent(SEL->getStartInfo()->cheatAllowed);
+		buttonCheatAllowed->setSelectedSilent(SEL->getStartInfo()->extraOptionsInfo.cheatsAllowed);
+
+	if(auto buttonUnlimitedReplay = widget<CToggleButton>("buttonUnlimitedReplay"))
+		buttonUnlimitedReplay->setSelectedSilent(SEL->getStartInfo()->extraOptionsInfo.unlimitedReplay);
 }

+ 41 - 12
config/widgets/extraOptionsTab.json

@@ -1,4 +1,6 @@
 {
+	"library" : "config/widgets/settings/library.json",
+	
 	"items":
 	[
 		{
@@ -52,21 +54,48 @@
 			"color": [24, 41, 90, 255]
 		},
 		{
-			"name": "buttonCheatAllowed",
+			"name": "ExtraOptionsButtons",
+			"type" : "verticalLayout",
+			"customType" : "toggleButton",
 			"position": {"x": 70, "y": 100},
-			"type": "toggleButton",
-			"image": "lobby/checkbox",
-			"callback" : "setCheatAllowed",
-			"selected" : true
+			"items":
+			[
+				{
+					"name": "buttonCheatAllowed",
+					"image": "lobby/checkbox",
+					"callback" : "setCheatAllowed",
+					"selected" : true
+				},
+				{
+					"name": "buttonUnlimitedReplay",
+					"image": "lobby/checkbox",
+					"callback" : "setUnlimitedReplay",
+					"selected" : true
+				}
+			]
 		},
 		{
-			"name": "labelCheatAllowed",
-			"type": "label",
-			"font": "small",
-			"alignment": "left",
-			"color": "yellow",
-			"text": "vcmi.optionsTab.cheatAllowed.hover",
-			"position": {"x": 110, "y": 103}
+			"name": "ExtraOptionsLabels",
+			"type" : "verticalLayout",
+			"customType" : "label",
+			"position": {"x": 110, "y": 103},
+			"items":
+			[
+				{
+					"name": "labelCheatAllowed",
+					"font": "small",
+					"alignment": "left",
+					"color": "yellow",
+					"text": "vcmi.optionsTab.cheatAllowed.hover"
+				},
+				{
+					"name": "labelUnlimitedReplay",
+					"font": "small",
+					"alignment": "left",
+					"color": "yellow",
+					"text": "vcmi.optionsTab.unlimitedReplay.hover"
+				}
+			]
 		}
 	]
 }

+ 21 - 0
lib/ExtraOptionsInfo.cpp

@@ -0,0 +1,21 @@
+/*
+ * ExtraOptionsInfo.cpp, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#include "StdInc.h"
+#include "ExtraOptionsInfo.h"
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+bool ExtraOptionsInfo::operator == (const ExtraOptionsInfo & other) const
+{
+	return cheatsAllowed == other.cheatsAllowed &&
+			unlimitedReplay == other.unlimitedReplay;
+}
+
+VCMI_LIB_NAMESPACE_END

+ 30 - 0
lib/ExtraOptionsInfo.h

@@ -0,0 +1,30 @@
+/*
+ * ExtraOptionsInfo.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+
+#pragma once
+
+VCMI_LIB_NAMESPACE_BEGIN
+
+struct DLL_LINKAGE ExtraOptionsInfo
+{
+	bool cheatsAllowed = true;
+	bool unlimitedReplay = false;
+
+	bool operator == (const ExtraOptionsInfo & other) const;
+
+	template <typename Handler>
+	void serialize(Handler &h, const int version)
+	{
+		h & cheatsAllowed;
+		h & unlimitedReplay;
+	}
+};
+
+VCMI_LIB_NAMESPACE_END

+ 5 - 5
lib/StartInfo.h

@@ -13,6 +13,7 @@
 
 #include "GameConstants.h"
 #include "TurnTimerInfo.h"
+#include "ExtraOptionsInfo.h"
 #include "campaign/CampaignConstants.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
@@ -105,8 +106,6 @@ struct DLL_LINKAGE StartInfo
 	EMode mode;
 	ui8 difficulty; //0=easy; 4=impossible
 
-	bool cheatAllowed;
-
 	using TPlayerInfos = std::map<PlayerColor, PlayerSettings>;
 	TPlayerInfos playerInfos; //color indexed
 
@@ -117,6 +116,7 @@ struct DLL_LINKAGE StartInfo
 	std::string fileURI;
 	SimturnsInfo simturnsInfo;
 	TurnTimerInfo turnTimerInfo;
+	ExtraOptionsInfo extraOptionsInfo;
 	std::string mapname; // empty for random map, otherwise name of the map or savegame
 	bool createRandomMap() const { return mapGenOptions != nullptr; }
 	std::shared_ptr<CMapGenOptions> mapGenOptions;
@@ -144,16 +144,16 @@ struct DLL_LINKAGE StartInfo
 		h & simturnsInfo;
 		h & turnTimerInfo;
 		if(version >= 832)
-			h & cheatAllowed;
+			h & extraOptionsInfo;
 		else
-			cheatAllowed = true;
+			extraOptionsInfo = ExtraOptionsInfo();
 		h & mapname;
 		h & mapGenOptions;
 		h & campState;
 	}
 
 	StartInfo() : mode(INVALID), difficulty(1), seedToBeUsed(0), seedPostInit(0),
-		mapfileChecksum(0), startTimeIso8601(vstd::getDateTimeISO8601Basic(std::time(nullptr))), fileURI(""), cheatAllowed(true)
+		mapfileChecksum(0), startTimeIso8601(vstd::getDateTimeISO8601Basic(std::time(nullptr))), fileURI("")
 	{
 
 	}

+ 1 - 1
lib/networkPacks/NetPackVisitor.h

@@ -164,7 +164,7 @@ public:
 	virtual void visitLobbySetPlayerName(LobbySetPlayerName & pack) {}
 	virtual void visitLobbySetSimturns(LobbySetSimturns & pack) {}
 	virtual void visitLobbySetTurnTime(LobbySetTurnTime & pack) {}
-	virtual void visitLobbySetCheatAllowed(LobbySetCheatAllowed & pack) {}
+	virtual void visitLobbySetExtraOptions(LobbySetExtraOptions & pack) {}
 	virtual void visitLobbySetDifficulty(LobbySetDifficulty & pack) {}
 	virtual void visitLobbyForceSetPlayer(LobbyForceSetPlayer & pack) {}
 	virtual void visitLobbyShowMessage(LobbyShowMessage & pack) {}

+ 2 - 2
lib/networkPacks/NetPacksLib.cpp

@@ -770,9 +770,9 @@ void LobbySetTurnTime::visitTyped(ICPackVisitor & visitor)
 	visitor.visitLobbySetTurnTime(*this);
 }
 
-void LobbySetCheatAllowed::visitTyped(ICPackVisitor & visitor)
+void LobbySetExtraOptions::visitTyped(ICPackVisitor & visitor)
 {
-	visitor.visitLobbySetCheatAllowed(*this);
+	visitor.visitLobbySetExtraOptions(*this);
 }
 
 void LobbySetDifficulty::visitTyped(ICPackVisitor & visitor)

+ 3 - 3
lib/networkPacks/PacksForLobby.h

@@ -287,15 +287,15 @@ struct DLL_LINKAGE LobbySetTurnTime : public CLobbyPackToServer
 	}
 };
 
-struct DLL_LINKAGE LobbySetCheatAllowed : public CLobbyPackToServer
+struct DLL_LINKAGE LobbySetExtraOptions : public CLobbyPackToServer
 {
-	bool allowed;
+	ExtraOptionsInfo extraOptionsInfo;
 
 	void visitTyped(ICPackVisitor & visitor) override;
 
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
-		h & allowed;
+		h & extraOptionsInfo;
 	}
 };
 

+ 1 - 1
lib/registerTypes/RegisterTypesLobbyPacks.h

@@ -57,7 +57,7 @@ void registerTypesLobbyPacks(Serializer &s)
 	s.template registerType<CLobbyPackToServer, LobbySetSimturns>();
 	s.template registerType<CLobbyPackToServer, LobbySetDifficulty>();
 	s.template registerType<CLobbyPackToServer, LobbyForceSetPlayer>();
-	s.template registerType<CLobbyPackToServer, LobbySetCheatAllowed>();
+	s.template registerType<CLobbyPackToServer, LobbySetExtraOptions>();
 }
 
 VCMI_LIB_NAMESPACE_END

+ 1 - 1
server/LobbyNetPackVisitors.h

@@ -88,7 +88,7 @@ public:
 	virtual void visitLobbySetPlayer(LobbySetPlayer & pack) override;
 	virtual void visitLobbySetPlayerName(LobbySetPlayerName & pack) override;
 	virtual void visitLobbySetTurnTime(LobbySetTurnTime & pack) override;
-	virtual void visitLobbySetCheatAllowed(LobbySetCheatAllowed & pack) override;
+	virtual void visitLobbySetExtraOptions(LobbySetExtraOptions & pack) override;
 	virtual void visitLobbySetSimturns(LobbySetSimturns & pack) override;
 	virtual void visitLobbySetDifficulty(LobbySetDifficulty & pack) override;
 	virtual void visitLobbyForceSetPlayer(LobbyForceSetPlayer & pack) override;

+ 2 - 2
server/NetPacksLobbyServer.cpp

@@ -414,9 +414,9 @@ void ApplyOnServerNetPackVisitor::visitLobbySetTurnTime(LobbySetTurnTime & pack)
 	result = true;
 }
 
-void ApplyOnServerNetPackVisitor::visitLobbySetCheatAllowed(LobbySetCheatAllowed & pack)
+void ApplyOnServerNetPackVisitor::visitLobbySetExtraOptions(LobbySetExtraOptions & pack)
 {
-	srv.si->cheatAllowed = pack.allowed;
+	srv.si->extraOptionsInfo = pack.extraOptionsInfo;
 	result = true;
 }
 

+ 1 - 1
server/processors/PlayerMessageProcessor.cpp

@@ -440,7 +440,7 @@ bool PlayerMessageProcessor::handleCheatCode(const std::string & cheat, PlayerCo
 	std::vector<std::string> words;
 	boost::split(words, cheat, boost::is_any_of("\t\r\n "));
 
-	if (words.empty() || !gameHandler->getStartInfo()->cheatAllowed)
+	if (words.empty() || !gameHandler->getStartInfo()->extraOptionsInfo.cheatsAllowed)
 		return false;
 
 	//Make cheat name case-insensitive, but keep words/parameters (e.g. creature name) as it