#ifndef RECRUITMENTSCENE_H #define RECRUITMENTSCENE_H #include "gui/scene.h" #include "gui/buttoneventlistener.h" #include "ui/hotseat_recruitment/iconhint.h" #include #include #include class UnitIcon; class RaceIcon; class Player; class Unit; class Race; namespace Ui { class RecruitmentScene; } class RecruitmentScene; class RaceIconEventListener : public QObject { Q_OBJECT public: RaceIconEventListener() = delete; RaceIconEventListener(QObject *parent, RecruitmentScene* scene); virtual bool eventFilter(QObject * watched, QEvent * event) Q_DECL_OVERRIDE; private: RecruitmentScene* scene_; }; class UnitIconEventListener : public QObject { Q_OBJECT public: UnitIconEventListener() = delete; UnitIconEventListener(QObject *parent, RecruitmentScene* scene); virtual bool eventFilter(QObject * watched, QEvent * event) Q_DECL_OVERRIDE; private: RecruitmentScene* scene_; }; class RecruitmentScene : public Scene { Q_OBJECT public: explicit RecruitmentScene(QWidget *parent = 0); ~RecruitmentScene(); /* * Перегруженная виртуальная функция класса Scene, * посредством которой сцене передаются аргументы инициализации. * Для данной сцены принимаются 2 аргумента, разделённые символом '|': * 1) Числовое значение - id объекта Player, для которого происходит набор отряда * 2) Числовое значение - исходное количество монет для найма/улучшения юнитов */ void parseArgs(QString args) override; /* * Перегруженная виртуальная функция класса Scene. * Инициализирует сцену в соответствии с принятыми через parseArgs аргументами */ void init() override; private: void initAvailableRaces(); void initAvailableUnits(); void showChosenUnits(); public: Player *getActivePlayer(); bool buyUnit(std::shared_ptr unit); bool removeUnit(std::shared_ptr unit); void changeRace(std::shared_ptr race); void updateMoney(); private slots: void on_back_button_clicked(); void on_complete_choice_button_clicked(); public: /* * races_list - this is a vector of size = RACES_NUMBER * It contains pointers to races in races' icons list in GUI * i-th race in races' icons list has its race stored in races_list[i]; */ std::vector> races_list; /* * available_units_list - this is a vector of size = AVAILABLE_UNIT_NUMBER * It contains pointer of each unit in available units' icons list in GUI * i-th unit in available units' icons list has its pointer stored in available_units_list[i]; */ std::vector> available_units_list; /* * chosen_units_list - this is a vector of size = MAX_PARTY_SIZE * It contains pointer of each unit in chosen units' icons list in GUI * i-th unit in chosen units' icons list has its name stored in chosen_units_list[i]; */ std::vector> chosen_units_list; public: /* * RACES_NUMBER - количество рас. * Не должно превосходить количество QLabel available_race_* * элементов графического интерфейса сцены */ static const unsigned RACES_NUMBER = 2; /* * AVAILABLE_UNIT_NUMBER - максимальное количество доступных юнитов для расы. * Не должно превосходить количества QLable available_unit_* элементов * графического интерфейса сцены */ static const unsigned AVAILABLE_UNIT_NUMBER = 5; /* * MAX_PARTY_SIZE - максимальное количество юнитов в отряде. * Не должно превосходить количества QLable chosen_unit* элементов * графического интерфейса сцены. */ static const unsigned MAX_PARTY_SIZE = 10; private: /* * available_money_ - максимальное количество монет у игрока. * За монеты можно нанимать и улучшать юнитов. * Количество монет задаётся в поле money и передаётся вторым аргументом * в функцию ParseArgs этой сцены. Необходимо, чтобы при смене игрока и ре-инициализации сцены * в неё передавать исходное количество монет для игроков */ unsigned int available_money_; /* * current_money_ - текущее количество монет у игрока. */ int current_money_; /* * current_player_id_ - id текущего игрока, который соответствует его id в классе PlayerManager */ int current_player_id_; /* * current_player_ - указатель на объекта класса Player текущего игрока. * В класс Player передаются на хранение созданные юниты */ Player* current_player_; /* * movie - объект класса QMovie, отвечающий за воспроизведение gif-анимации * на графическом объекте QLabel image */ QMovie *movie; /* * Указатель на объект класса обработчика кнопок, отвечающего за изменение * кнопок при нажатии и наведении на них курсора мыши */ ButtonEventListener *watcher; /* * Указатель на объект класса обработчика расовых кнопок-объектов QLabel, * отвечающего за действия при наведении курсора и нажатии на "кнопки" рас. */ RaceIconEventListener *race_icon_watcher; /* * Указатель на объект класса обработчика расовых кнопок-объектов QLabel, * отвечающего за действия при наведении курсора и нажатии на "кнопки" юнитов. */ UnitIconEventListener *unit_icon_watcher; /* * Указатель на объект корневого элемента графического интерфейса сцены, * созданной посредством QtDesigner */ Ui::RecruitmentScene *ui; }; #endif // RECRUITMENTSCENE_H