/** ******************************************************************************* @file /gui/model/UnitFormation.h @brief Formace jednotky, razeni vojacku v utvarech, 2d reprezentace @author Vajicek @version 0.1 ******************************************************************************/ #ifndef UNITFORMATION_H #define UNITFORMATION_H #include "common/mm.h" // #include "gui/common/mymath.h" #include "gui/model/TerrainEntity.h" // namespace gui{ #define MAX_UNIT_MEMBERS 20 //FWD class TUnit; class TUnitMember; class TBuilding; struct TGUIUnitInfo; /** typ formace */ enum TFormationType{ ftHorseFormation, ///< formace pro jizdu, obdelnikovy rozestupy ftIndividualFormation, ///< jeden model na jednotku ftFootMenFormation ///< pesaci, stejny rozestupy }; /** objekty na 2D scene */ struct TUnitMemberPosition{ P2F p2fDir; P2F p2fDim; P2F p2fPos; }; /** Pomer protinajicich se pozic. @param a Pozice a @param b Pozice b @return plocha a prunik b / plocha a + b */ extern float intersectionRatio(TUnitMemberPosition* a, TUnitMemberPosition* b); /// pole pozic typedef std::vector vunitmemberpos; /** Predek pro vsechny typy formace. Pocita pozice panacku ve formaci. Udrzuje polohu jednotky a volna mista pro kazdeho panacka. Resi rozmisteni jednotky v terenu s prekazkami. */ class TFormation //## { protected: /// Odkaz na jednotku. gui::TUnit *unit; /// 2D poloha. P2F p2fPosition; /// 2D smer. P2F p2fDirection; public: /// Seznam pozic pro cleny jednotky. TUnitMemberPosition vumpPositions[MAX_UNIT_MEMBERS]; /// Kdo obsadi ktere pozice v jednotce po zformovani. TUnitMember* vumPositionUsed[MAX_UNIT_MEMBERS]; /// Pozcet pouzitych pozic. int vumpPositions_c; ///zakladni formace //@{ /** Nastaveni pozice jednotky jako celku. @param p Pozice jednotky. @param d Smer jednotky. */ virtual void setStandardFormation(P2F* p, P2F* d); /** Nastaveni pozice na konkretni hex. @param hexindex Index hexu pro formaci. @param dir Cislo smeru jednotky 0-5. */ virtual void setStandardFormation(int hexindex, int dir); /** Zjisteni pozice jednotky jako celku. @param[out] p Pozice. @param[out] d Smer. */ void getUnitPos(P2F* p, P2F* d); /** Nastav jednotku do formace. */ virtual void setToFormation(); /** Vrati panacka ve formaci. @return Panacek ve formaci. */ TUnitMember* getUnitMember(int no); /** Vrati rozmer panacka. @param[in] no Cislo panacka @param[out] dim Rozmer panacka. */ virtual void getUnitMemberDim(int no, P2F* dim); /** Zjisteni pozice clena jednotky v odpovidajici formaci. @param no Cislo panacka. @param p Pozice panacka. @param d Smer panacka. */ virtual void getStandardFormationMemberPos(int no, P2F* p, P2F* d) = 0; //@} ///prekazky //@{ /// Ukazatel na tereni prekazku. TTerrainEntity* terrain_obstacle; /** Nastavi jaky teren ma respektovat. @param ter Teren. */ void avoidTerrainObstacles(TTerrainEntity* ter); /** Zjisteni skutecne pozice clena jednotky, respektuje prekazky. @param no Cislo panacka. @param pos Volana pozice. @param dir Volny smer. */ virtual void findFreeMemberPosition(int no, P2F* pos, P2F* dir); //@} /** Konstruktor. @param u Jednotka. */ TFormation(gui::TUnit* u); }; /** Radova formace jednotky. Pocita odstupy panacku serezanych v radach. Pouziva parametr */ class TRowFormation: public TFormation{ public: virtual int getMenInRow(); virtual int getRowCount(); // int getNearestMemberWithHighestNo(int no); TRowFormation(TUnit* u); }; /** Formace koni. Lisi se hlavne rozestupy. */ class THorseFormation: public TRowFormation{ public: virtual void getStandardFormationMemberPos(int no, P2F* p, P2F* d); THorseFormation(TUnit* u); }; /** Formace pesaku. */ class TFootMenFormation: public TRowFormation{ public: virtual void getStandardFormationMemberPos(int no, P2F* p, P2F* d); TFootMenFormation(TUnit* u); }; /** Formace pro jednotlivce. */ class TIndividualFormation: public TFormation{ public: virtual void getStandardFormationMemberPos(int no, P2F* p, P2F* d); TIndividualFormation(TUnit* u); }; }//namespace #endif /*****************************************************************************/