123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486 |
- #ifndef __CPREGAME_H__
- #define __CPREGAME_H__
- #include "../global.h"
- #include <set>
- #include <SDL.h>
- #include "../StartInfo.h"
- #include "GUIBase.h"
- #include "GUIClasses.h"
- #include "FunctionList.h"
- #include "../lib/CMapInfo.h"
- /*
- * CPreGame.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
- *
- */
- class CMusicHandler;
- class CMapHeader;
- class CCampaignHeader;
- class CTextInput;
- class CCampaign;
- class CGStatusBar;
- class CTextBox;
- class CCampaignState;
- class CConnection;
- struct CPackForSelectionScreen;
- struct PlayerInfo;
- struct FileInfo;
- namespace boost{ class thread; class recursive_mutex;}
- enum ESortBy{_playerAm, _size, _format, _name, _viccon, _loscon, _numOfMaps}; //_numOfMaps is for campaigns
- /// Class which handles map sorting by different criteria
- class mapSorter
- {
- public:
- ESortBy sortBy;
- bool operator()(const CMapInfo *aaa, const CMapInfo *bbb);
- mapSorter(ESortBy es):sortBy(es){};
- };
- /// The main menu screens listed in the EState enum
- class CMenuScreen : public CIntObject
- {
- public:
- enum EState { //where are we?
- mainMenu, newGame, loadGame, campaignMain, saveGame, scenarioInfo, campaignList
- };
- enum EMultiMode {
- SINGLE_PLAYER = 0, MULTI_HOT_SEAT, MULTI_NETWORK_HOST, MULTI_NETWORK_GUEST
- };
- CPicture *bgAd;
- AdventureMapButton *buttons[5];
- CMenuScreen(EState which);
- ~CMenuScreen();
- void showAll(SDL_Surface * to);
- void show(SDL_Surface * to);
- void moveTo(CMenuScreen *next);
- };
- /// Implementation of the chat box
- class CChatBox : public CIntObject
- {
- public:
- CTextBox *chatHistory;
- CTextInput *inputBox;
- CChatBox(const Rect &rect);
- void keyPressed(const SDL_KeyboardEvent & key);
- void addNewMessage(const std::string &text);
- };
- class InfoCard : public CIntObject
- {
- CPicture *bg;
- public:
- CMenuScreen::EState type;
- bool network;
- bool chatOn; //if chat is shown, then description is hidden
- CTextBox *mapDescription;
- CChatBox *chat;
- CPicture *playerListBg;
- CHighlightableButtonsGroup *difficulty;
- CDefHandler *sizes, *sFlags;;
- void changeSelection(const CMapInfo *to);
- void showAll(SDL_Surface * to);
- void clickRight(tribool down, bool previousState);
- void showTeamsPopup();
- void toggleChat();
- void setChat(bool activateChat);
- InfoCard(bool Network = false);
- ~InfoCard();
- };
- /// The selection tab which is shown at the map selection screen
- class SelectionTab : public CIntObject
- {
- private:
- CDefHandler *format; //map size
- void parseMaps(std::vector<FileInfo> &files, int start = 0, int threads = 1);
- void parseGames(std::vector<FileInfo> &files, bool multi);
- void parseCampaigns( std::vector<FileInfo> & files );
- void getFiles(std::vector<FileInfo> &out, const std::string &dirname, const std::string &ext);
- CMenuScreen::EState tabType;
- public:
- int positions; //how many entries (games/maps) can be shown
- CPicture *bg; //general bg image
- CSlider *slider;
- std::vector<CMapInfo> allItems;
- std::vector<CMapInfo*> curItems;
- size_t selectionPos;
- boost::function<void(CMapInfo *)> onSelect;
- ESortBy sortingBy;
- bool ascending;
- CTextInput *txt;
-
- void filter(int size, bool selectFirst = false); //0 - all
- void select(int position); //position: <0 - positions> position on the screen
- void selectAbs(int position); //position: absolute position in curItems vector
- int getPosition(int x, int y); //convert mouse coords to entry position; -1 means none
- void sliderMove(int slidPos);
- void sortBy(int criteria);
- void sort();
- void printMaps(SDL_Surface *to);
- int getLine();
- void selectFName(const std::string &fname);
- void showAll(SDL_Surface * to);
- void clickLeft(tribool down, bool previousState);
- void keyPressed(const SDL_KeyboardEvent & key);
- void onDoubleClick();
- SelectionTab(CMenuScreen::EState Type, const boost::function<void(CMapInfo *)> &OnSelect, CMenuScreen::EMultiMode MultiPlayer = CMenuScreen::SINGLE_PLAYER);
- ~SelectionTab();
- };
- /// The options tab which is shown at the map selection phase.
- class OptionsTab : public CIntObject
- {
- CPicture *bg;
- public:
- enum SelType {TOWN, HERO, BONUS};
- struct SelectedBox : public CIntObject //img with current town/hero/bonus
- {
- SelType which;
- ui8 player; //serial nr
- SDL_Surface *getImg() const;
- const std::string *getText() const;
- SelectedBox(SelType Which, ui8 Player);
- void showAll(SDL_Surface * to);
- void clickRight(tribool down, bool previousState);
- };
- struct PlayerOptionsEntry : public CIntObject
- {
- PlayerInfo π
- PlayerSettings &s;
- CPicture *bg;
- AdventureMapButton *btns[6]; //left and right for town, hero, bonus
- AdventureMapButton *flag;
- SelectedBox *town;
- SelectedBox *hero;
- SelectedBox *bonus;
- enum {HUMAN_OR_CPU, HUMAN, CPU} whoCanPlay;
-
- PlayerOptionsEntry(OptionsTab *owner, PlayerSettings &S);
- void selectButtons(); //hides unavailable buttons
- void showAll(SDL_Surface * to);
- };
- CSlider *turnDuration;
- std::set<int> usedHeroes;
- struct PlayerToRestore
- {
- int color, id;
- void reset() { color = id = -1; }
- PlayerToRestore(){ reset(); }
- } playerToRestore;
- std::map<int, PlayerOptionsEntry *> entries; //indexed by color
- void nextCastle(int player, int dir); //dir == -1 or +1
- void nextHero(int player, int dir); //dir == -1 or +1
- void nextBonus(int player, int dir); //dir == -1 or +1
- void setTurnLength(int npos);
- void flagPressed(int player);
- void recreate();
- OptionsTab();
- ~OptionsTab();
- void showAll(SDL_Surface * to);
- int nextAllowedHero( int min, int max, int incl, int dir );
- bool canUseThisHero( int ID );
- };
- /// Interface for selecting a map.
- class ISelectionScreenInfo
- {
- public:
- CMenuScreen::EMultiMode multiPlayer;
- CMenuScreen::EState screenType; //new/save/load#Game
- const CMapInfo *current;
- StartInfo sInfo;
- std::map<ui32, std::string> playerNames; // id of player <-> player name; 0 is reserved as ID of AI "players"
- ISelectionScreenInfo(const std::map<ui32, std::string> *Names = NULL);
- virtual ~ISelectionScreenInfo();
- virtual void update(){};
- virtual void propagateOptions() {};
- virtual void postRequest(ui8 what, ui8 dir) {};
- virtual void postChatMessage(const std::string &txt){};
- void setPlayer(PlayerSettings &pset, unsigned player);
- void updateStartInfo( std::string filename, StartInfo & sInfo, const CMapHeader * mapHeader );
- int getIdOfFirstUnallocatedPlayer(); //returns 0 if none
- bool isGuest() const;
- bool isHost() const;
- };
- /// The actual map selection screen which consists of the options and selection tab
- class CSelectionScreen : public CIntObject, public ISelectionScreenInfo
- {
- public:
- CPicture *bg; //general bg image
- InfoCard *card;
- OptionsTab *opt;
- AdventureMapButton *start, *back;
- SelectionTab *sel;
- CIntObject *curTab;
- boost::thread *serverHandlingThread;
- boost::recursive_mutex *mx;
- std::list<CPackForSelectionScreen *> upcomingPacks; //protected by mx
- CConnection *serv; //connection to server, used in MP mode
- bool ongoingClosing;
- ui8 myNameID; //used when networking - otherwise all player are "mine"
- CSelectionScreen(CMenuScreen::EState Type, CMenuScreen::EMultiMode MultiPlayer = CMenuScreen::SINGLE_PLAYER, const std::map<ui32, std::string> *Names = NULL);
- ~CSelectionScreen();
- void toggleTab(CIntObject *tab);
- void changeSelection(const CMapInfo *to);
- void startCampaign();
- void startGame();
- void difficultyChange(int to);
- void handleConnection();
- void processPacks();
- void setSInfo(const StartInfo &si);
- void update() OVERRIDE;
- void propagateOptions() OVERRIDE;
- void postRequest(ui8 what, ui8 dir) OVERRIDE;
- void postChatMessage(const std::string &txt) OVERRIDE;
- void propagateNames();
- };
- /// Save game screen
- class CSavingScreen : public CSelectionScreen
- {
- public:
- const CMapInfo *ourGame;
- CSavingScreen(bool hotseat = false);
- ~CSavingScreen();
- };
- /// Scenario information screen shown during the game (thus not really a "pre-game" but fits here anyway)
- class CScenarioInfo : public CIntObject, public ISelectionScreenInfo
- {
- public:
- AdventureMapButton *back;
- InfoCard *card;
- OptionsTab *opt;
- CScenarioInfo(const CMapHeader *mapHeader, const StartInfo *startInfo);
- ~CScenarioInfo();
- };
- /// Multiplayer mode
- class CMultiMode : public CIntObject
- {
- public:
- CPicture *bg;
- CTextInput *txt;
- AdventureMapButton *btns[7]; //0 - hotseat, 6 - cancel
- CGStatusBar *bar;
- CMultiMode();
- void openHotseat();
- void hostTCP();
- void joinTCP();
- };
- /// Hot seat player window
- class CHotSeatPlayers : public CIntObject
- {
- public:
- CPicture *bg;
- CTextInput *txt[8];
- AdventureMapButton *ok, *cancel;
- CGStatusBar *bar;
- CHotSeatPlayers(const std::string &firstPlayer);
- void enterSelectionScreen();
- };
- /// Campaign screen where you can choose one out of three starting bonuses
- class CBonusSelection : public CIntObject
- {
- SDL_Surface * background;
- AdventureMapButton * startB, * backB;
- //campaign & map descriptions:
- CTextBox * cmpgDesc, * mapDesc;
- struct SCampPositions
- {
- std::string campPrefix;
- int colorSuffixLength;
- struct SRegionDesc
- {
- std::string infix;
- int xpos, ypos;
- };
- std::vector<SRegionDesc> regions;
- };
- std::vector<SCampPositions> campDescriptions;
- class CRegion : public CIntObject
- {
- CBonusSelection * owner;
- SDL_Surface * graphics[3]; //[0] - not selected, [1] - selected, [2] - striped
- bool accessible; //false if region should be striped
- bool selectable; //true if region should be selectable
- int myNumber; //number of region
- public:
- std::string rclickText;
- CRegion(CBonusSelection * _owner, bool _accessible, bool _selectable, int _myNumber);
- ~CRegion();
- void clickLeft(tribool down, bool previousState);
- void clickRight(tribool down, bool previousState);
- void show(SDL_Surface * to);
- };
- std::vector<CRegion *> regions;
- CRegion * highlightedRegion;
- void loadPositionsOfGraphics();
- CCampaignState * ourCampaign;
- CMapHeader *ourHeader;
- CDefHandler *sizes; //icons of map sizes
- SDL_Surface * diffPics[5]; //pictures of difficulties, user-selectable (or not if campaign locks this)
- AdventureMapButton * diffLb, * diffRb; //buttons for changing difficulty
- void changeDiff(bool increase); //if false, then decrease
- //bonus selection
- void updateBonusSelection();
- CHighlightableButtonsGroup * bonuses;
- public:
- void bonusSelectionChanges(int choosenBonus);
- StartInfo sInfo;
- CDefHandler *sFlags;
- void selectMap(int whichOne);
- void selectBonus(int id);
- CBonusSelection(CCampaignState * _ourCampaign);
- ~CBonusSelection();
- void showAll(SDL_Surface * to);
- void show(SDL_Surface * to);
- void goBack();
- void startMap();
- };
- /// Campaign selection screen
- class CCampaignScreen : public CIntObject
- {
- public:
- enum CampaignStatus {DEFAULT = 0, ENABLED, DISABLED, COMPLETED}; // the status of the campaign
-
- private:
- SDL_Surface *bg; // background image
- SDL_Surface *noCamp; // no campaign placeholder
- AdventureMapButton *back; // back button
- /// A button which plays a video when you move the mouse cursor over it
- class CCampaignButton : public CIntObject
- {
- private:
- std::string image;
- SDL_Surface *bg;
- SDL_Surface *button;
- SDL_Surface *checked;
- CLabel *hoverLabel;
- CampaignStatus status;
- void clickLeft(tribool down, bool previousState);
- void hover(bool on);
- public:
- std::string campFile; // the filename/resourcename of the campaign
- std::string video; // the resource name of the video
- std::string hoverText; // the text which gets shown when you move the mouse cursor over the button
- CCampaignButton(SDL_Surface *bg, const std::string image, const int x, const int y, CampaignStatus status); // c-tor
- ~CCampaignButton(); // d-tor
- void show(SDL_Surface *to);
- };
- std::vector<CCampaignButton*> campButtons; // a container which holds all buttons where you can start a campaign
-
- void drawCampaignPlaceholder(); // draws the no campaign placeholder at the lower right position
- std::string getMapText(int index);
- void createButtons(const int buttonCords[7][2], const std::string campFiles[],
- const std::string campImages[], const std::string campVideos[], const std::string campTexts[], std::map<std::string, CampaignStatus>& camps, const CampaignStatus campDefaults[]);
- public:
- enum CampaignSet {ROE, AB, SOD, WOG};
- CCampaignScreen(CampaignSet campaigns, std::map<std::string, CampaignStatus>& camps);
- ~CCampaignScreen();
- void show(SDL_Surface *to);
- };
- /// Handles background screen, loads graphics for victory/loss condition and random town or hero selection
- class CGPreGame : public CIntObject, public IUpdateable
- {
- public:
- SDL_Surface *mainbg;
- CMenuScreen *scrs[4];
- SDL_Surface *nHero, *rHero, *nTown, *rTown; // none/random hero/town imgs
- CDefHandler *bonuses;
- CDefHandler *victory, *loss;
- CGPreGame();
- ~CGPreGame();
- void update();
- void openSel(CMenuScreen::EState type, CMenuScreen::EMultiMode multi = CMenuScreen::SINGLE_PLAYER);
- void openCampaignScreen(CCampaignScreen::CampaignSet campaigns);
- void loadGraphics();
- void disposeGraphics();
- };
- extern CGPreGame *CGP;
- #endif // __CPREGAME_H__
|