2017-07-13 10:26:03 +02:00
|
|
|
/*
|
|
|
|
* CBattleInterfaceClasses.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
|
|
|
|
*
|
|
|
|
*/
|
2011-12-22 16:05:19 +03:00
|
|
|
#pragma once
|
|
|
|
|
2013-04-07 14:52:07 +03:00
|
|
|
#include "../gui/CIntObject.h"
|
2017-06-24 16:42:05 +02:00
|
|
|
#include "../../lib/battle/BattleHex.h"
|
2016-09-27 14:13:20 +02:00
|
|
|
#include "../windows/CWindowObject.h"
|
2011-12-22 16:05:19 +03:00
|
|
|
|
2022-07-26 15:07:42 +02:00
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
|
2011-12-22 16:05:19 +03:00
|
|
|
class CGHeroInstance;
|
2022-07-26 15:07:42 +02:00
|
|
|
struct BattleResult;
|
|
|
|
class CStack;
|
|
|
|
|
|
|
|
namespace battle
|
|
|
|
{
|
|
|
|
class Unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
VCMI_LIB_NAMESPACE_END
|
|
|
|
|
|
|
|
struct SDL_Surface;
|
2011-12-22 16:05:19 +03:00
|
|
|
class CBattleInterface;
|
|
|
|
class CPicture;
|
2018-04-07 13:34:11 +02:00
|
|
|
class CFilledTexture;
|
2014-08-03 14:16:19 +03:00
|
|
|
class CButton;
|
|
|
|
class CToggleButton;
|
|
|
|
class CToggleGroup;
|
2011-12-22 16:05:19 +03:00
|
|
|
class CLabel;
|
2018-04-07 13:34:11 +02:00
|
|
|
class CTextBox;
|
2012-08-28 19:28:21 +03:00
|
|
|
class CAnimImage;
|
2013-06-23 14:25:48 +03:00
|
|
|
class CPlayerInterface;
|
2011-12-22 16:05:19 +03:00
|
|
|
|
|
|
|
/// Class which shows the console at the bottom of the battle screen and manages the text of the console
|
2022-11-18 17:54:10 +02:00
|
|
|
class CBattleConsole : public CIntObject, public IStatusBar
|
2011-12-22 16:05:19 +03:00
|
|
|
{
|
|
|
|
private:
|
|
|
|
std::vector< std::string > texts; //a place where texts are stored
|
|
|
|
int lastShown; //last shown line of text
|
2022-11-18 17:54:10 +02:00
|
|
|
|
2011-12-22 16:05:19 +03:00
|
|
|
std::string ingcAlter; //alternative text set by in-game console - very important!
|
2022-11-18 17:54:10 +02:00
|
|
|
public:
|
|
|
|
CBattleConsole(const Rect & position);
|
2015-10-12 15:47:10 +02:00
|
|
|
void showAll(SDL_Surface * to = 0) override;
|
2022-11-18 17:54:10 +02:00
|
|
|
|
2011-12-22 16:05:19 +03:00
|
|
|
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
|
2022-11-18 17:54:10 +02:00
|
|
|
|
|
|
|
void clearMatching(const std::string & Text) override;
|
|
|
|
void clear() override;
|
|
|
|
void write(const std::string & Text) override;
|
|
|
|
void lock(bool shouldLock) override;
|
|
|
|
|
2011-12-22 16:05:19 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
/// Hero battle animation
|
|
|
|
class CBattleHero : public CIntObject
|
|
|
|
{
|
2012-08-29 17:55:31 +03:00
|
|
|
void switchToNextPhase();
|
2011-12-22 16:05:19 +03:00
|
|
|
public:
|
|
|
|
bool flip; //false if it's attacking hero, true otherwise
|
2017-09-05 15:44:27 +02:00
|
|
|
|
|
|
|
std::shared_ptr<CAnimation> animation;
|
|
|
|
std::shared_ptr<CAnimation> flagAnimation;
|
|
|
|
|
2011-12-22 16:05:19 +03:00
|
|
|
const CGHeroInstance * myHero; //this animation's hero instance
|
|
|
|
const CBattleInterface * myOwner; //battle interface to which this animation is assigned
|
|
|
|
int phase; //stage of animation
|
|
|
|
int nextPhase; //stage of animation to be set after current phase is fully displayed
|
2012-08-29 17:55:31 +03:00
|
|
|
int currentFrame, firstFrame, lastFrame; //frame of animation
|
2017-09-05 15:44:27 +02:00
|
|
|
|
|
|
|
size_t flagAnim;
|
|
|
|
ui8 animCount; //for flag animation
|
2015-10-12 15:47:10 +02:00
|
|
|
void show(SDL_Surface * to) override; //prints next frame of animation to to
|
2011-12-22 16:05:19 +03:00
|
|
|
void setPhase(int newPhase); //sets phase of hero animation
|
2016-09-27 14:13:20 +02:00
|
|
|
void hover(bool on) override;
|
2015-10-12 15:47:10 +02:00
|
|
|
void clickLeft(tribool down, bool previousState) override; //call-in
|
2016-09-27 14:13:20 +02:00
|
|
|
void clickRight(tribool down, bool previousState) override; //call-in
|
2017-09-05 15:44:27 +02:00
|
|
|
CBattleHero(const std::string & animationPath, bool filpG, PlayerColor player, const CGHeroInstance * hero, const CBattleInterface * owner);
|
2017-07-17 23:04:00 +02:00
|
|
|
~CBattleHero();
|
2011-12-22 16:05:19 +03:00
|
|
|
};
|
|
|
|
|
2016-09-27 14:13:20 +02:00
|
|
|
class CHeroInfoWindow : public CWindowObject
|
|
|
|
{
|
2018-04-07 13:34:11 +02:00
|
|
|
private:
|
|
|
|
std::vector<std::shared_ptr<CLabel>> labels;
|
|
|
|
std::vector<std::shared_ptr<CAnimImage>> icons;
|
2016-09-27 14:13:20 +02:00
|
|
|
public:
|
2018-04-07 13:34:11 +02:00
|
|
|
CHeroInfoWindow(const InfoAboutHero & hero, Point * position);
|
2016-09-27 14:13:20 +02:00
|
|
|
};
|
|
|
|
|
2011-12-22 16:05:19 +03:00
|
|
|
/// Class which manages the battle options window
|
2018-07-25 00:36:48 +02:00
|
|
|
class CBattleOptionsWindow : public WindowBase
|
2011-12-22 16:05:19 +03:00
|
|
|
{
|
|
|
|
private:
|
2018-04-07 13:34:11 +02:00
|
|
|
std::shared_ptr<CPicture> background;
|
|
|
|
std::shared_ptr<CButton> setToDefault;
|
|
|
|
std::shared_ptr<CButton> exit;
|
|
|
|
std::shared_ptr<CToggleGroup> animSpeeds;
|
|
|
|
std::vector<std::shared_ptr<CLabel>> labels;
|
|
|
|
std::vector<std::shared_ptr<CToggleButton>> toggles;
|
2011-12-22 16:05:19 +03:00
|
|
|
public:
|
2018-04-07 13:34:11 +02:00
|
|
|
CBattleOptionsWindow(const SDL_Rect & position, CBattleInterface * owner);
|
2011-12-22 16:05:19 +03:00
|
|
|
|
|
|
|
void bDefaultf(); //default button callback
|
|
|
|
void bExitf(); //exit button callback
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Class which is responsible for showing the battle result window
|
2018-07-25 00:36:48 +02:00
|
|
|
class CBattleResultWindow : public WindowBase
|
2011-12-22 16:05:19 +03:00
|
|
|
{
|
|
|
|
private:
|
2018-04-07 13:34:11 +02:00
|
|
|
std::shared_ptr<CPicture> background;
|
|
|
|
std::vector<std::shared_ptr<CLabel>> labels;
|
|
|
|
std::shared_ptr<CButton> exit;
|
|
|
|
std::vector<std::shared_ptr<CAnimImage>> icons;
|
|
|
|
std::shared_ptr<CTextBox> description;
|
|
|
|
CPlayerInterface & owner;
|
2011-12-22 16:05:19 +03:00
|
|
|
public:
|
2018-04-07 13:34:11 +02:00
|
|
|
CBattleResultWindow(const BattleResult & br, CPlayerInterface & _owner);
|
2017-07-17 23:04:00 +02:00
|
|
|
~CBattleResultWindow();
|
2011-12-22 16:05:19 +03:00
|
|
|
|
|
|
|
void bExitf(); //exit button callback
|
|
|
|
|
2015-10-12 15:47:10 +02:00
|
|
|
void activate() override;
|
|
|
|
void show(SDL_Surface * to = 0) override;
|
2011-12-22 16:05:19 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
/// Class which stands for a single hex field on a battlefield
|
|
|
|
class CClickableHex : public CIntObject
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
bool setAlterText; //if true, this hex has set alternative text in console and will clean it
|
|
|
|
public:
|
|
|
|
ui32 myNumber; //number of hex in commonly used format
|
2022-11-17 23:57:51 +02:00
|
|
|
//bool accessible; //if true, this hex is accessible for units
|
2011-12-22 16:05:19 +03:00
|
|
|
//CStack * ourStack;
|
2017-10-29 17:23:30 +02:00
|
|
|
bool strictHovered; //for determining if hex is hovered by mouse (this is different problem than hex's graphic hovering)
|
2011-12-22 16:05:19 +03:00
|
|
|
CBattleInterface * myInterface; //interface that owns me
|
2013-07-07 22:44:08 +03:00
|
|
|
static Point getXYUnitAnim(BattleHex hexNum, const CStack * creature, CBattleInterface * cbi); //returns (x, y) of left top corner of animation
|
2011-12-22 16:05:19 +03:00
|
|
|
|
|
|
|
//for user interactions
|
2015-10-12 15:47:10 +02:00
|
|
|
void hover (bool on) override;
|
|
|
|
void mouseMoved (const SDL_MouseMotionEvent &sEvent) override;
|
|
|
|
void clickLeft(tribool down, bool previousState) override;
|
|
|
|
void clickRight(tribool down, bool previousState) override;
|
2011-12-22 16:05:19 +03:00
|
|
|
CClickableHex();
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Shows the stack queue
|
|
|
|
class CStackQueue : public CIntObject
|
|
|
|
{
|
|
|
|
class StackBox : public CIntObject
|
|
|
|
{
|
|
|
|
public:
|
2018-04-07 13:34:11 +02:00
|
|
|
std::shared_ptr<CPicture> background;
|
|
|
|
std::shared_ptr<CAnimImage> icon;
|
|
|
|
std::shared_ptr<CLabel> amount;
|
|
|
|
std::shared_ptr<CAnimImage> stateIcon;
|
2011-12-22 16:05:19 +03:00
|
|
|
|
2018-04-07 13:34:11 +02:00
|
|
|
void setUnit(const battle::Unit * unit, size_t turn = 0);
|
2017-07-20 06:08:49 +02:00
|
|
|
StackBox(CStackQueue * owner);
|
2011-12-22 16:05:19 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
static const int QUEUE_SIZE = 10;
|
2018-04-07 13:34:11 +02:00
|
|
|
std::shared_ptr<CFilledTexture> background;
|
|
|
|
std::vector<std::shared_ptr<StackBox>> stackBoxes;
|
2011-12-22 16:05:19 +03:00
|
|
|
CBattleInterface * owner;
|
|
|
|
|
2017-07-20 06:08:49 +02:00
|
|
|
std::shared_ptr<CAnimation> icons;
|
|
|
|
std::shared_ptr<CAnimation> stateIcons;
|
|
|
|
|
2018-04-07 13:34:11 +02:00
|
|
|
public:
|
|
|
|
const bool embedded;
|
|
|
|
|
2011-12-22 16:05:19 +03:00
|
|
|
CStackQueue(bool Embedded, CBattleInterface * _owner);
|
|
|
|
~CStackQueue();
|
|
|
|
void update();
|
2014-08-03 14:16:19 +03:00
|
|
|
};
|