浏览代码

Merge pull request #6394 from Laserlicht/battlemode_button

rework battle mode button
Ivan Savenko 5 天之前
父节点
当前提交
0fb8e12edd

二进制
Mods/vcmi/Content/Sprites/lobby/battle-normal.png


二进制
Mods/vcmi/Content/Sprites/lobby/battle-pressed.png


+ 0 - 8
Mods/vcmi/Content/Sprites/lobby/battleButton.json

@@ -1,8 +0,0 @@
-{
-	"basepath" : "lobby/",
-	"images" :
-	[
-		{ "frame" : 0, "file" : "battle-normal.png"},
-		{ "frame" : 1, "file" : "battle-pressed.png"}
-	]
-}

二进制
Mods/vcmi/Content/Sprites/lobby/dropdownNormal.png


二进制
Mods/vcmi/Content/Sprites/lobby/dropdownPressed.png


+ 3 - 2
Mods/vcmi/Content/config/english.json

@@ -141,7 +141,8 @@
 	"vcmi.lobby.deleteFile" : "Do you want to delete following file?",
 	"vcmi.lobby.deleteFolder" : "Do you want to delete following folder?",
 	"vcmi.lobby.deleteMode" : "Switch to delete mode and back",
-	"vcmi.lobby.battleOnlyMode" : "Battle Only Mode",
+	"vcmi.lobby.battleOnlyMode" : "Battle Mode",
+	"vcmi.lobby.battleOnlyMode.help" : "Play a simple battle without adventure map",
 	"vcmi.lobby.battleOnlyModeSubTitle" : "Select heroes, army, skills, artifact and battleground for simple battle without adventure map",
 	"vcmi.lobby.battleOnlyModeBattlefield" : "Battlefield",
 	"vcmi.lobby.battleOnlyModeBattlefieldSelect" : "Select Battlefield",
@@ -884,7 +885,7 @@
 	"vcmi.optionsTab.turnTime.chess.2"    : "Chess: 02:00 + 01:00 + 00:15 + 00:00",
 	"vcmi.optionsTab.turnTime.chess.1"    : "Chess: 01:00 + 01:00 + 00:00 + 00:00",
 
-	"vcmi.optionsTab.simturns.select"         : "Select simultaneous turns preset",
+	"vcmi.optionsTab.simturns.select"         : "Select sim. turns preset",
 	"vcmi.optionsTab.simturns.none"           : "No simultaneous turns",
 	"vcmi.optionsTab.simturns.tillContactMax" : "Simturns: Until contact",
 	"vcmi.optionsTab.simturns.tillContact1"   : "Simturns: 1 week, break on contact",

+ 7 - 6
Mods/vcmi/Content/config/german.json

@@ -140,7 +140,8 @@
 	"vcmi.lobby.deleteFile" : "Möchtet Ihr folgende Datei löschen?",
 	"vcmi.lobby.deleteFolder" : "Möchtet Ihr folgenden Ordner löschen?",
 	"vcmi.lobby.deleteMode" : "In den Löschmodus wechseln und zurück",
-	"vcmi.lobby.battleOnlyMode" : "Nur Kämpfen Modus",
+	"vcmi.lobby.battleOnlyMode" : "Kampfmodus",
+	"vcmi.lobby.battleOnlyMode.help" : "Spiele einen einfachen Kampf ohne Abenteuerkarte",
 	"vcmi.lobby.battleOnlyModeSubTitle" : "Wähle Helden, Armeen, Skills, Artefakte und ein Schlachtfeld für einen Kampf ohne Abenteuerkarte",
 	"vcmi.lobby.battleOnlyModeBattlefield" : "Schlachtfeld",
 	"vcmi.lobby.battleOnlyModeBattlefieldSelect" : "Schlachtfeld auswählen",
@@ -853,7 +854,7 @@
 	"vcmi.optionsTab.simturnsMax.help" : "Spielt gleichzeitig für eine bestimmte Anzahl von Tagen oder bis zum Kontakt mit einem anderen Spieler",
 	"vcmi.optionsTab.simturnsAI.help" : "{Simultane KI Züge}\nExperimentelle Option. Ermöglicht es den KI-Spielern, gleichzeitig mit dem menschlichen Spieler zu agieren, wenn simultane Spielzüge aktiviert sind.",
 
-	"vcmi.optionsTab.turnTime.select"     : "Spielzug-Timer-Voreinst. wählen",
+	"vcmi.optionsTab.turnTime.select"     : "Timer-Voreinstellung wählen",
 	"vcmi.optionsTab.turnTime.unlimited"  : "Unbegrenzter Spielzug-Timer",
 	"vcmi.optionsTab.turnTime.classic.1"  : "Klassischer Timer: 1 Minute",
 	"vcmi.optionsTab.turnTime.classic.2"  : "Klassischer Timer: 2 Minuten",
@@ -868,15 +869,15 @@
 	"vcmi.optionsTab.turnTime.chess.2"    : "Schach: 02:00 01:00 00:15 00:00",
 	"vcmi.optionsTab.turnTime.chess.1"    : "Schach: 01:00 01:00 00:00 00:00",
 
-	"vcmi.optionsTab.simturns.select"         : "Voreinst. für simultane Züge wählen",
+	"vcmi.optionsTab.simturns.select"         : "Voreinst. für Züge wählen",
 	"vcmi.optionsTab.simturns.none"           : "Keine simultanen Züge",
 	"vcmi.optionsTab.simturns.tillContactMax" : "Simzüge: Bis zum Kontakt",
 	"vcmi.optionsTab.simturns.tillContact1"   : "Simzüge: 1 Woche, Stop bei Kontakt",
 	"vcmi.optionsTab.simturns.tillContact2"   : "Simzüge: 2 Wochen, Stop bei Kontakt",
 	"vcmi.optionsTab.simturns.tillContact4"   : "Simzüge: 1 Monat, Stop bei Kontakt",
-	"vcmi.optionsTab.simturns.blocked1"       : "Simzüge: 1 Woche, Kontakte block.",
-	"vcmi.optionsTab.simturns.blocked2"       : "Simzüge: 2 Wochen, Kontakte block.",
-	"vcmi.optionsTab.simturns.blocked4"       : "Simzüge: 1 Monat, Kontakte block.",
+	"vcmi.optionsTab.simturns.blocked1"       : "Simzüge: 1 Woche, Kontakte blockieren",
+	"vcmi.optionsTab.simturns.blocked2"       : "Simzüge: 2 Wochen, Kontakte blockieren",
+	"vcmi.optionsTab.simturns.blocked4"       : "Simzüge: 1 Monat, Kontakte blockieren",
 
 	"vcmi.campaignSet.chronicles" : "Heroes Chronicles",
 	"vcmi.campaignSet.hota" : "Horn of the Abyss",

+ 10 - 6
client/lobby/CLobbyScreen.cpp

@@ -58,8 +58,12 @@ CLobbyScreen::CLobbyScreen(ESelectionScreen screenType, bool hideScreen)
 		buttonOptions = std::make_shared<CButton>(Point(411, 510), AnimationPath::builtin("GSPBUTT.DEF"), LIBRARY->generaltexth->zelp[46], std::bind(&CLobbyScreen::toggleTab, this, tabOpt), EShortcut::LOBBY_ADDITIONAL_OPTIONS);
 		if(settings["general"]["enableUiEnhancements"].Bool())
 		{
-			buttonTurnOptions = std::make_shared<CButton>(Point(619, 105), AnimationPath::builtin("GSPBUT2.DEF"), LIBRARY->generaltexth->zelp[46], std::bind(&CLobbyScreen::toggleTab, this, tabTurnOptions), EShortcut::LOBBY_TURN_OPTIONS);
-			buttonExtraOptions = std::make_shared<CButton>(Point(619, 510), AnimationPath::builtin("GSPBUT2.DEF"), LIBRARY->generaltexth->zelp[46], std::bind(&CLobbyScreen::toggleTab, this, tabExtraOptions), EShortcut::LOBBY_EXTRA_OPTIONS);
+			if(screenType == ESelectionScreen::newGame)
+				buttonBattleMode = std::make_shared<CButton>(Point(619, 105), AnimationPath::builtin("GSPButton2Arrow"), CButton::tooltip("", LIBRARY->generaltexth->translate("vcmi.lobby.battleOnlyMode.help")), [this](){
+					updateAfterStateChange(); // creates tabBattleOnlyMode -> cannot created by init of object because GAME->server().isGuest() isn't valid at that point
+					toggleTab(tabBattleOnlyMode);
+				}, EShortcut::LOBBY_BATTLE_MODE);
+			buttonExtraOptions = std::make_shared<CButton>(Point(619, 510), AnimationPath::builtin("GSPButton2Arrow"), LIBRARY->generaltexth->zelp[46], std::bind(&CLobbyScreen::toggleTab, this, tabExtraOptions), EShortcut::LOBBY_EXTRA_OPTIONS);
 		}
 	};
 
@@ -225,8 +229,8 @@ void CLobbyScreen::toggleMode(bool host)
 	buttonSelect->setTextOverlay("  " + LIBRARY->generaltexth->allTexts[500], FONT_SMALL, buttonColor);
 	buttonOptions->setTextOverlay(LIBRARY->generaltexth->allTexts[501], FONT_SMALL, buttonColor);
 
-	if (buttonTurnOptions)
-		buttonTurnOptions->setTextOverlay(LIBRARY->generaltexth->translate("vcmi.optionsTab.turnOptions.hover"), FONT_SMALL, buttonColor);
+	if (buttonBattleMode)
+		buttonBattleMode->setTextOverlay(LIBRARY->generaltexth->translate("vcmi.lobby.battleOnlyMode"), FONT_SMALL, buttonColor);
 
 	if (buttonExtraOptions)
 		buttonExtraOptions->setTextOverlay(LIBRARY->generaltexth->translate("vcmi.optionsTab.extraOptions.hover"), FONT_SMALL, buttonColor);
@@ -239,8 +243,8 @@ void CLobbyScreen::toggleMode(bool host)
 	buttonSelect->block(!host);
 	buttonOptions->block(!host);
 
-	if (buttonTurnOptions)
-		buttonTurnOptions->block(!host);
+	if (buttonBattleMode)
+		buttonBattleMode->block(!host);
 
 	if (buttonExtraOptions)
 		buttonExtraOptions->block(!host);

+ 1 - 1
client/lobby/CSelectionBase.h

@@ -66,7 +66,7 @@ public:
 	std::shared_ptr<CButton> buttonSelect;
 	std::shared_ptr<CButton> buttonRMG;
 	std::shared_ptr<CButton> buttonOptions;
-	std::shared_ptr<CButton> buttonTurnOptions;
+	std::shared_ptr<CButton> buttonBattleMode;
 	std::shared_ptr<CButton> buttonExtraOptions;
 	std::shared_ptr<CButton> buttonStart;
 	std::shared_ptr<CButton> buttonBack;

+ 13 - 0
client/lobby/OptionsTabBase.cpp

@@ -10,6 +10,8 @@
 #include "StdInc.h"
 #include "OptionsTabBase.h"
 #include "CSelectionBase.h"
+#include "TurnOptionsTab.h"
+#include "CLobbyScreen.h"
 
 #include "../widgets/ComboBox.h"
 #include "../widgets/CTextInput.h"
@@ -79,6 +81,12 @@ OptionsTabBase::OptionsTabBase(const JsonPath & configPath)
 		GAME->server().setSimturnsInfo(getSimturnsPresets().at(index));
 	};
 
+	addCallback("tabTurnOptions", [&](int)
+	{
+		auto lobby = (static_cast<CLobbyScreen *>(parent));
+		lobby->toggleTab(lobby->tabTurnOptions);
+	});
+
 	addCallback("setTimerPreset", setTimerPresetCallback);
 	addCallback("setSimturnPreset", setSimturnsPresetCallback);
 
@@ -428,6 +436,11 @@ void OptionsTabBase::recreate(bool campaign)
 		buttonUnlimitedReplay->block(GAME->server().isGuest());
 	}
 
+	if(auto buttonTurnOptions = widget<CButton>("buttonTurnOptions"))
+	{
+		buttonTurnOptions->block(GAME->server().isGuest() || campaign);
+	}
+
 	if(auto textureCampaignOverdraw = widget<CFilledTexture>("textureCampaignOverdraw"))
 		textureCampaignOverdraw->setEnabled(campaign);
 }

+ 0 - 10
client/lobby/SelectionTab.cpp

@@ -242,14 +242,6 @@ SelectionTab::SelectionTab(ESelectionScreen Type)
 		sortByDate->setOverlay(std::make_shared<CPicture>(ImagePath::builtin("lobby/selectionTabSortDate")));
 		buttonsSortBy.push_back(sortByDate);
 
-		if(tabType == ESelectionScreen::newGame)
-		{
-			buttonBattleOnlyMode = std::make_shared<CButton>(Point(23, 18), AnimationPath::builtin("lobby/battleButton"), CButton::tooltip("", LIBRARY->generaltexth->translate("vcmi.lobby.battleOnlyMode")), [this](){
-				auto lobby = static_cast<CLobbyScreen *>(parent);
-				lobby->toggleTab(lobby->tabBattleOnlyMode);
-			}, EShortcut::LOBBY_BATTLE_MODE);
-		}
-
 		if(tabType == ESelectionScreen::loadGame || tabType == ESelectionScreen::newGame)
 		{
 			buttonDeleteMode = std::make_shared<CButton>(Point(367, 18), AnimationPath::builtin("lobby/deleteButton"), CButton::tooltip("", LIBRARY->generaltexth->translate("vcmi.lobby.deleteMode")), [this, tabTitle, tabTitleDelete](){
@@ -324,8 +316,6 @@ void SelectionTab::toggleMode()
 	{
 		if(slider)
 			slider->block(true);
-		if(buttonBattleOnlyMode)
-			buttonBattleOnlyMode->block(true);
 	}
 	else
 	{

+ 0 - 2
client/lobby/SelectionTab.h

@@ -128,8 +128,6 @@ private:
 	std::shared_ptr<CButton> buttonDeleteMode;
 	bool deleteMode;
 
-	std::shared_ptr<CButton> buttonBattleOnlyMode;
-
 	bool enableUiEnhancements;
 	std::shared_ptr<CButton> buttonCampaignSet;
 

+ 25 - 0
client/render/AssetGenerator.cpp

@@ -92,6 +92,7 @@ void AssetGenerator::initialize()
 	animationFiles[AnimationPath::builtin("SPRITES/adventureLayersButton")] = createAdventureMapButton(ImagePath::builtin("adventureLayers.png"), true);
 	
 	animationFiles[AnimationPath::builtin("SPRITES/GSPButtonClear")] = createGSPButtonClear();
+	animationFiles[AnimationPath::builtin("SPRITES/GSPButton2Arrow")] = createGSPButton2Arrow();
 
 	for (PlayerColor color(-1); color < PlayerColor::PLAYER_LIMIT; ++color)
 	{
@@ -1009,6 +1010,30 @@ AssetGenerator::AnimationLayoutMap AssetGenerator::createGSPButtonClear()
 	return layout;
 }
 
+AssetGenerator::AnimationLayoutMap AssetGenerator::createGSPButton2Arrow()
+{
+	auto baseImg = ENGINE->renderHandler().loadAnimation(AnimationPath::builtin("GSPBUT2"), EImageBlitMode::OPAQUE);
+	auto overlayImg = ENGINE->renderHandler().loadAnimation(AnimationPath::builtin("GSPBUTT"), EImageBlitMode::OPAQUE);
+
+	AnimationLayoutMap layout;
+	for(int i = 0; i < 4; i++)
+	{
+		ImagePath spriteName = ImagePath::builtin("GSPButton2Arrow" + std::to_string(i) + ".png");
+
+		imageFiles[spriteName] = [baseImg, overlayImg, i](){
+			auto newImg = ENGINE->renderHandler().createImage(baseImg->getImage(i)->dimensions(), CanvasScalingPolicy::IGNORE);
+			auto canvas = newImg->getCanvas();
+			canvas.draw(baseImg->getImage(i), Point(0, 0));
+			canvas.draw(overlayImg->getImage(i), Point(0, 0), Rect(0, 0, 20, 20));
+			return newImg;
+		};
+
+		layout[0].push_back(ImageLocator(spriteName, EImageBlitMode::SIMPLE));
+	}
+
+	return layout;
+}
+
 AssetGenerator::CanvasPtr AssetGenerator::createGateListColored(PlayerColor color, PlayerColor backColor) const
 {
 	auto locator = ImageLocator(ImagePath::builtin("TpGate"), EImageBlitMode::COLORKEY);

+ 1 - 0
client/render/AssetGenerator.h

@@ -67,6 +67,7 @@ private:
 	CanvasPtr createCreatureInfoPanelElement(CreatureInfoPanelElement element) const;
 	CanvasPtr createQuestWindow() const;
 	AnimationLayoutMap createGSPButtonClear();
+	AnimationLayoutMap createGSPButton2Arrow();
 	CanvasPtr createGateListColored(PlayerColor color, PlayerColor backColor) const;
 	CanvasPtr createHeroSlotsColored(PlayerColor backColor) const;
 

+ 23 - 0
config/widgets/playerOptionsTab.json

@@ -85,6 +85,29 @@
 			"name": "simturnsPresetSelector",
 			"position": {"x": 56, "y": 555},
 			"dropDownPosition": {"x": 0, "y": -160}
+		},
+		{
+			"name": "buttonTurnOptions",
+			"type" : "button",
+			"position" : {
+				"x" : 260,
+				"y" : 535
+			},
+			"image" : "GSPBUT2",
+			"items" : [
+				{
+					"type" : "label",
+					"position" : {
+						"x" : 0,
+						"y" : 0
+					},
+					"text" : "vcmi.optionsTab.turnOptions.hover",
+					"font" : "small",
+					"color" : "white"
+				}
+			],
+			"help": "vcmi.optionsTab.turnOptions",
+			"callback" : "tabTurnOptions"
 		}
 	],
 

+ 6 - 6
config/widgets/turnOptionsDropdownLibrary.json

@@ -3,7 +3,7 @@
 	{
 		"type": "transparentFilledRectangle",
 		"visible": false,
-		"rect": {"x": 1, "y": 1, "w": 219, "h": 19},
+		"rect": {"x": 1, "y": 1, "w": 249, "h": 19},
 		"color": [0, 0, 0, 128],
 		"colorLine": [0, 0, 0, 128]
 	},
@@ -19,7 +19,7 @@
 	{
 		"type": "transparentFilledRectangle",
 		"visible": false,
-		"rect": {"x": 2, "y": 2, "w": 216, "h": 16},
+		"rect": {"x": 2, "y": 2, "w": 246, "h": 16},
 		"color": [0, 0, 0, 0],
 		"colorLine": [255, 255, 0, 255]
 	},
@@ -48,12 +48,12 @@
 					"type": "texture",
 					"image": "DiBoxBck",
 					"color" : "blue", 
-					"rect": {"x": 0, "y": 0, "w": 220, "h": 260}
+					"rect": {"x": 0, "y": 0, "w": 250, "h": 260}
 				},
 				{
 					"type": "transparentFilledRectangle",
 					"visible": false,
-					"rect": {"x": 0, "y": 0, "w": 220, "h": 260},
+					"rect": {"x": 0, "y": 0, "w": 250, "h": 260},
 					"color": [0, 0, 0, 0],
 					"colorLine": [64, 80, 128, 128]
 				},
@@ -345,12 +345,12 @@
 					"type": "texture",
 					"image": "DiBoxBck",
 					"color" : "blue", 
-					"rect": {"x": 0, "y": 0, "w": 220, "h": 160}
+					"rect": {"x": 0, "y": 0, "w": 250, "h": 160}
 				},
 				{
 					"type": "transparentFilledRectangle",
 					"visible": false,
-					"rect": {"x": 0, "y": 0, "w": 220, "h": 160},
+					"rect": {"x": 0, "y": 0, "w": 250, "h": 160},
 					"color": [0, 0, 0, 0],
 					"colorLine": [64, 80, 128, 128]
 				},

+ 2 - 2
config/widgets/turnOptionsTab.json

@@ -71,13 +71,13 @@
 		{
 			"type" : "dropDownTimers",
 			"name": "timerPresetSelector",
-			"position": {"x": 160, "y": 78},
+			"position": {"x": 170, "y": 78},
 			"dropDownPosition": {"x": 0, "y": 20}
 		},
 		{
 			"type" : "dropDownSimturns",
 			"name": "simturnsPresetSelector",
-			"position": {"x": 160, "y": 98},
+			"position": {"x": 170, "y": 98},
 			"dropDownPosition": {"x": 0, "y": 20}
 		},