Bläddra i källkod

Merge pull request #3971 from Laserlicht/battle_log

battle log as window
Ivan Savenko 1 år sedan
förälder
incheckning
94d5dc1d7b

+ 1 - 1
client/battle/BattleInterface.cpp

@@ -127,7 +127,7 @@ void BattleInterface::playIntroSoundAndUnlockInterface()
 	}
 }
 
-bool BattleInterface::openingPlaying()
+bool BattleInterface::openingPlaying() const
 {
 	return battleOpeningDelayActive;
 }

+ 1 - 1
client/battle/BattleInterface.h

@@ -149,7 +149,7 @@ public:
 	std::shared_ptr<BattleHero> attackingHero;
 	std::shared_ptr<BattleHero> defendingHero;
 
-	bool openingPlaying();
+	bool openingPlaying() const;
 	void openingEnd();
 
 	bool makingTurn() const;

+ 33 - 2
client/battle/BattleInterfaceClasses.cpp

@@ -33,6 +33,7 @@
 #include "../render/Graphics.h"
 #include "../widgets/Buttons.h"
 #include "../widgets/Images.h"
+#include "../widgets/Slider.h"
 #include "../widgets/TextControls.h"
 #include "../widgets/GraphicalPrimitiveCanvas.h"
 #include "../windows/CMessage.h"
@@ -141,8 +142,10 @@ void BattleConsole::scrollDown(ui32 by)
 	redraw();
 }
 
-BattleConsole::BattleConsole(std::shared_ptr<CPicture> backgroundSource, const Point & objectPos, const Point & imagePos, const Point &size)
-	: scrollPosition(-1)
+BattleConsole::BattleConsole(const BattleInterface & owner, std::shared_ptr<CPicture> backgroundSource, const Point & objectPos, const Point & imagePos, const Point &size)
+	: CIntObject(LCLICK)
+	, owner(owner)
+	, scrollPosition(-1)
 	, enteringText(false)
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
@@ -161,6 +164,14 @@ void BattleConsole::deactivate()
 	CIntObject::deactivate();
 }
 
+void BattleConsole::clickPressed(const Point & cursorPosition)
+{
+	if(owner.makingTurn() && !owner.openingPlaying())
+	{
+		GH.windows().createAndPushWindow<BattleConsoleWindow>(boost::algorithm::join(logEntries, "\n"));
+	}
+}
+
 void BattleConsole::setEnteringMode(bool on)
 {
 	consoleText.clear();
@@ -203,6 +214,26 @@ void BattleConsole::clear()
 	write({});
 }
 
+BattleConsoleWindow::BattleConsoleWindow(const std::string & text)
+	: CWindowObject(BORDERED)
+{
+	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
+
+	pos.w = 429;
+	pos.h = 434;
+
+	updateShadow();
+	center();
+
+	backgroundTexture = std::make_shared<CFilledTexture>(ImagePath::builtin("DiBoxBck"), Rect(0, 0, pos.w, pos.h));
+	buttonOk = std::make_shared<CButton>(Point(183, 388), AnimationPath::builtin("IOKAY"), CButton::tooltip(), [this](){ close(); }, EShortcut::GLOBAL_ACCEPT);
+	Rect textArea(18, 17, 393, 354);
+	textBoxBackgroundBorder = std::make_shared<TransparentFilledRectangle>(textArea, ColorRGBA(0, 0, 0, 75), ColorRGBA(128, 100, 75));
+	textBox = std::make_shared<CTextBox>(text, textArea.resize(-5), CSlider::BROWN);
+	if(textBox->slider)
+		textBox->slider->scrollToMax();
+}
+
 const CGHeroInstance * BattleHero::instance()
 {
 	return hero;

+ 16 - 1
client/battle/BattleInterfaceClasses.h

@@ -47,6 +47,8 @@ class BattleRenderer;
 class BattleConsole : public CIntObject, public IStatusBar
 {
 private:
+	const BattleInterface & owner;
+
 	std::shared_ptr<CPicture> background;
 
 	/// List of all texts added during battle, essentially - log of entire battle
@@ -70,11 +72,13 @@ private:
 	/// select line(s) that will be visible in UI
 	std::vector<std::string> getVisibleText();
 public:
-	BattleConsole(std::shared_ptr<CPicture> backgroundSource, const Point & objectPos, const Point & imagePos, const Point &size);
+	BattleConsole(const BattleInterface & owner, std::shared_ptr<CPicture> backgroundSource, const Point & objectPos, const Point & imagePos, const Point &size);
 
 	void showAll(Canvas & to) override;
 	void deactivate() override;
 
+	void clickPressed(const Point & cursorPosition) override;
+
 	bool addText(const std::string &text); //adds text at the last position; returns false if failed (e.g. text longer than 70 characters)
 	void scrollUp(ui32 by = 1); //scrolls console up by 'by' positions
 	void scrollDown(ui32 by = 1); //scrolls console up by 'by' positions
@@ -87,6 +91,17 @@ public:
 	void setEnteredText(const std::string & text) override;
 };
 
+class BattleConsoleWindow : public CWindowObject
+{
+private:
+	std::shared_ptr<CFilledTexture> backgroundTexture;
+	std::shared_ptr<CButton> buttonOk;
+	std::shared_ptr<TransparentFilledRectangle> textBoxBackgroundBorder;
+	std::shared_ptr<CTextBox> textBox;
+public:
+	BattleConsoleWindow(const std::string & text);
+};
+
 /// Hero battle animation
 class BattleHero : public CIntObject
 {

+ 1 - 1
client/battle/BattleWindow.cpp

@@ -199,7 +199,7 @@ std::shared_ptr<BattleConsole> BattleWindow::buildBattleConsole(const JsonNode &
 	auto rect = readRect(config["rect"]);
 	auto offset = readPosition(config["imagePosition"]);
 	auto background = widget<CPicture>("menuBattle");
-	return std::make_shared<BattleConsole>(background, rect.topLeft(), offset, rect.dimensions() );
+	return std::make_shared<BattleConsole>(owner, background, rect.topLeft(), offset, rect.dimensions() );
 }
 
 void BattleWindow::toggleQueueVisibility()