CCallback.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #ifndef __CCALLBACK_H__
  2. #define __CCALLBACK_H__
  3. #include "global.h"
  4. #ifdef _WIN32
  5. #include "tchar.h"
  6. #else
  7. #include "tchar_amigaos4.h" //XXX this is mingw header are we need this for something? for 'true'
  8. //support of unicode we should use ICU or some boost wraper areound it
  9. //(boost using this lib during compilation i dont know what for exactly)
  10. #endif
  11. #include "CGameState.h"
  12. class CGHeroInstance;
  13. class CGameState;
  14. struct CPath;
  15. class CGObjectInstance;
  16. class CArmedInstance;
  17. class SComponent;
  18. class IChosen;
  19. class CSelectableComponent;
  20. struct BattleAction;
  21. class CGTownInstance;
  22. struct StartInfo;
  23. class CStack;
  24. struct lua_State;
  25. class CClient;
  26. struct TerrainTile;
  27. //structure gathering info about upgrade possibilites
  28. class ICallback
  29. {
  30. public:
  31. virtual bool moveHero(const CGHeroInstance *h, int3 dst) const =0; //dst must be free, neighbouring tile (this function can move hero only by one tile)
  32. virtual void selectionMade(int selection, int asker) =0;
  33. virtual int swapCreatures(const CArmedInstance *s1, const CArmedInstance *s2, int p1, int p2)=0;//swaps creatures between two posiibly different garrisons // TODO: AI-unsafe code - fix it!
  34. virtual int mergeStacks(const CArmedInstance *s1, const CArmedInstance *s2, int p1, int p2)=0;//joins first stack tothe second (creatures must be same type)
  35. virtual int splitStack(const CArmedInstance *s1, const CArmedInstance *s2, int p1, int p2, int val)=0;//split creatures from the first stack
  36. virtual bool dismissHero(const CGHeroInstance * hero)=0; //dismisses diven hero; true - successfuly, false - not successfuly
  37. virtual bool swapArtifacts(const CGHeroInstance * hero1, ui16 pos1, const CGHeroInstance * hero2, ui16 pos2)=0; //swaps artifacts between two given heroes
  38. virtual void recruitCreatures(const CGObjectInstance *obj, ui32 ID, ui32 amount)=0;
  39. virtual bool dismissCreature(const CArmedInstance *obj, int stackPos)=0;
  40. virtual bool upgradeCreature(const CArmedInstance *obj, int stackPos, int newID=-1)=0; //if newID==-1 then best possible upgrade will be made
  41. virtual void endTurn()=0;
  42. virtual void swapGarrisonHero(const CGTownInstance *town)=0;
  43. virtual void buyArtifact(const CGHeroInstance *hero, int aid)=0; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith)
  44. virtual void trade(int mode, int id1, int id2, int val1)=0; //mode==0: sell val1 units of id1 resource for id2 resiurce
  45. virtual void setFormation(const CGHeroInstance * hero, bool tight)=0;
  46. virtual void setSelection(const CArmedInstance * obj)=0;
  47. virtual void recruitHero(const CGTownInstance *town, const CGHeroInstance *hero)=0;
  48. virtual void save(const std::string &fname) = 0;
  49. virtual void sendMessage(const std::string &mess) = 0;
  50. //get info
  51. virtual bool verifyPath(CPath * path, bool blockSea)const =0;
  52. virtual int getDate(int mode=0)const =0; //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month
  53. virtual std::vector< std::vector< std::vector<unsigned char> > > & getVisibilityMap()const =0; //returns visibility map (TODO: make it const)
  54. virtual const CGHeroInstance * getHeroInfo(int val, int mode=2)const =0; //mode = 0 -> val = serial; mode = 1 -> val = ID
  55. virtual int getResourceAmount(int type)const =0;
  56. virtual int howManyHeroes(bool includeGarrisoned = true)const =0;
  57. virtual const CGTownInstance * getTownInfo(int val, bool mode)const =0; //mode = 0 -> val = serial; mode = 1 -> val = ID
  58. virtual int howManyTowns()const =0;
  59. virtual std::vector < std::string > getObjDescriptions(int3 pos)const =0; //returns descriptions of objects at pos in order from the lowest to the highest
  60. virtual std::vector < const CGHeroInstance *> getHeroesInfo(bool onlyOur=true)const =0;
  61. virtual bool isVisible(int3 pos)const =0;
  62. virtual int getMyColor()const =0;
  63. virtual int getMySerial()const =0;
  64. virtual int getHeroSerial(const CGHeroInstance * hero)const =0;
  65. virtual const CCreatureSet* getGarrison(const CGObjectInstance *obj)const =0;
  66. virtual UpgradeInfo getUpgradeInfo(const CArmedInstance *obj, int stackPos)const =0;
  67. virtual const StartInfo * getStartInfo()const =0;
  68. virtual std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos)const =0;
  69. virtual std::vector < const CGObjectInstance * > getVisitableObjs(int3 pos)const =0;
  70. virtual void getMarketOffer(int t1, int t2, int &give, int &rec, int mode=0)const =0;
  71. virtual std::vector < const CGObjectInstance * > getFlaggableObjects(int3 pos) const =0;
  72. virtual int3 getMapSize() const =0; //returns size of map - z is 1 for one - level map and 2 for two level map
  73. virtual std::vector<const CGHeroInstance *> getAvailableHeroes(const CGTownInstance * town) const =0; //heroes that can be recruited
  74. virtual const TerrainTile * getTileInfo(int3 tile) const = 0;
  75. virtual int canBuildStructure(const CGTownInstance *t, int ID) =0;//// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements
  76. virtual CPath * getPath(int3 src, int3 dest, const CGHeroInstance * hero)=0;
  77. //battle
  78. virtual int battleGetBattlefieldType()=0; // 1. sand/shore 2. sand/mesas 3. dirt/birches 4. dirt/hills 5. dirt/pines 6. grass/hills 7. grass/pines 8. lava 9. magic plains 10. snow/mountains 11. snow/trees 12. subterranean 13. swamp/trees 14. fiery fields 15. rock lands 16. magic clouds 17. lucid pools 18. holy ground 19. clover field 20. evil fog 21. "favourable winds" text on magic plains background 22. cursed ground 23. rough 24. ship to ship 25. ship
  79. virtual int battleGetObstaclesAtTile(int tile)=0; //returns bitfield
  80. virtual std::vector<CObstacleInstance> battleGetAllObstacles()=0; //returns all obstacles on the battlefield
  81. virtual int battleGetStack(int pos)=0; //returns ID of stack on the tile
  82. virtual CStack * battleGetStackByID(int ID)=0; //returns stack info by given ID
  83. virtual CStack * battleGetStackByPos(int pos)=0; //returns stack info by given pos
  84. virtual int battleGetPos(int stack)=0; //returns position (tile ID) of stack
  85. virtual int battleMakeAction(BattleAction* action)=0;//for casting spells by hero - DO NOT use it for moving active stack
  86. virtual std::map<int, CStack> battleGetStacks()=0; //returns stacks on battlefield
  87. virtual std::vector<CStack> battleGetStackQueue()=0; //returns vector of stack in order of their move sequence
  88. virtual CCreature battleGetCreature(int number)=0; //returns type of creature by given number of stack
  89. //virtual bool battleMoveCreature(int ID, int dest)=0; //moves creature with id ID to dest if possible
  90. virtual std::vector<int> battleGetAvailableHexes(int ID, bool addOccupiable)=0; //reutrns numbers of hexes reachable by creature with id ID
  91. virtual bool battleIsStackMine(int ID)=0; //returns true if stack with id ID belongs to caller
  92. virtual bool battleCanShoot(int ID, int dest)=0; //returns true if unit with id ID can shoot to dest
  93. };
  94. struct HeroMoveDetails
  95. {
  96. HeroMoveDetails(){};
  97. HeroMoveDetails(int3 Src, int3 Dst, CGHeroInstance*Ho);
  98. int3 src, dst; //source and destination points
  99. CGHeroInstance * ho; //object instance of this hero
  100. int owner, style; //style: 0 - normal move, 1 - teleport, 2 - instant jump
  101. bool successful;
  102. };
  103. class CCallback : public ICallback
  104. {
  105. private:
  106. CCallback(CGameState * GS, int Player, CClient *C):gs(GS), cl(C), player(Player){};
  107. CGameState * gs;
  108. CClient *cl;
  109. bool isVisible(int3 pos, int Player) const;
  110. bool isVisible(CGObjectInstance *obj, int Player) const;
  111. protected:
  112. int player;
  113. public:
  114. //commands
  115. bool moveHero(const CGHeroInstance *h, int3 dst) const; //dst must be free, neighbouring tile (this function can move hero only by one tile)
  116. void selectionMade(int selection, int asker);
  117. int swapCreatures(const CArmedInstance *s1, const CArmedInstance *s2, int p1, int p2);
  118. int mergeStacks(const CArmedInstance *s1, const CArmedInstance *s2, int p1, int p2); //first goes to the second
  119. int splitStack(const CArmedInstance *s1, const CArmedInstance *s2, int p1, int p2, int val);
  120. bool dismissHero(const CGHeroInstance * hero);
  121. bool swapArtifacts(const CGHeroInstance * hero1, ui16 pos1, const CGHeroInstance * hero2, ui16 pos2);
  122. bool buildBuilding(const CGTownInstance *town, si32 buildingID);
  123. void recruitCreatures(const CGObjectInstance *obj, ui32 ID, ui32 amount);
  124. bool dismissCreature(const CArmedInstance *obj, int stackPos);
  125. bool upgradeCreature(const CArmedInstance *obj, int stackPos, int newID=-1);
  126. void endTurn();
  127. void swapGarrisonHero(const CGTownInstance *town);
  128. void buyArtifact(const CGHeroInstance *hero, int aid);
  129. void trade(int mode, int id1, int id2, int val1);
  130. void setFormation(const CGHeroInstance * hero, bool tight);
  131. void setSelection(const CArmedInstance * obj);
  132. void recruitHero(const CGTownInstance *town, const CGHeroInstance *hero);
  133. void save(const std::string &fname);
  134. void sendMessage(const std::string &mess);
  135. //get info
  136. bool verifyPath(CPath * path, bool blockSea) const;
  137. int getDate(int mode=0) const; //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month
  138. std::vector< std::vector< std::vector<unsigned char> > > & getVisibilityMap() const; //returns visibility map (TODO: make it const)
  139. const CGHeroInstance * getHeroInfo(int val, int mode=2) const; //mode = 0 -> val = serial; mode = 1 -> val = ID
  140. int getResourceAmount(int type) const;
  141. std::vector<si32> getResourceAmount() const;
  142. int howManyHeroes(bool includeGarrisoned = true) const;
  143. const CGTownInstance * getTownInfo(int val, bool mode) const; //mode = 0 -> val = serial; mode = 1 -> val = ID
  144. std::vector < const CGTownInstance *> getTownsInfo(bool onlyOur=true) const;
  145. int howManyTowns()const;
  146. std::vector < std::string > getObjDescriptions(int3 pos) const; //returns descriptions of objects at pos in order from the lowest to the highest
  147. std::vector < const CGHeroInstance *> getHeroesInfo(bool onlyOur=true) const;
  148. bool isVisible(int3 pos) const;
  149. int getMyColor() const;
  150. int getHeroSerial(const CGHeroInstance * hero) const;
  151. int getMySerial() const;
  152. const CCreatureSet* getGarrison(const CGObjectInstance *obj) const;
  153. UpgradeInfo getUpgradeInfo(const CArmedInstance *obj, int stackPos) const;
  154. const StartInfo * getStartInfo() const;
  155. std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos) const;
  156. std::vector < const CGObjectInstance * > getVisitableObjs(int3 pos) const;
  157. void getMarketOffer(int t1, int t2, int &give, int &rec, int mode=0) const;
  158. std::vector < const CGObjectInstance * > getFlaggableObjects(int3 pos) const;
  159. int3 getMapSize() const; //returns size of map - z is 1 for one - level map and 2 for two level map
  160. std::vector<const CGHeroInstance *> getAvailableHeroes(const CGTownInstance * town) const; //heroes that can be recruited
  161. const TerrainTile * getTileInfo(int3 tile) const;
  162. int canBuildStructure(const CGTownInstance *t, int ID);//// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements
  163. CPath * getPath(int3 src, int3 dest, const CGHeroInstance * hero);
  164. //battle
  165. int battleGetBattlefieldType(); // 1. sand/shore 2. sand/mesas 3. dirt/birches 4. dirt/hills 5. dirt/pines 6. grass/hills 7. grass/pines 8. lava 9. magic plains 10. snow/mountains 11. snow/trees 12. subterranean 13. swamp/trees 14. fiery fields 15. rock lands 16. magic clouds 17. lucid pools 18. holy ground 19. clover field 20. evil fog 21. "favourable winds" text on magic plains background 22. cursed ground 23. rough 24. ship to ship 25. ship
  166. int battleGetObstaclesAtTile(int tile); //returns bitfield
  167. std::vector<CObstacleInstance> battleGetAllObstacles(); //returns all obstacles on the battlefield
  168. int battleGetStack(int pos); //returns ID of stack on the tile
  169. CStack * battleGetStackByID(int ID); //returns stack info by given ID
  170. CStack * battleGetStackByPos(int pos); //returns stack info by given pos
  171. int battleGetPos(int stack); //returns position (tile ID) of stack
  172. int battleMakeAction(BattleAction* action);//for casting spells by hero - DO NOT use it for moving active stack
  173. std::map<int, CStack> battleGetStacks(); //returns stacks on battlefield
  174. std::vector<CStack> battleGetStackQueue(); //returns vector of stack in order of their move sequence
  175. CCreature battleGetCreature(int number); //returns type of creature by given number of stack
  176. std::vector<int> battleGetAvailableHexes(int ID, bool addOccupiable); //reutrns numbers of hexes reachable by creature with id ID
  177. bool battleIsStackMine(int ID); //returns true if stack with id ID belongs to caller
  178. bool battleCanShoot(int ID, int dest); //returns true if unit with id ID can shoot to dest
  179. //XXX hmmm _tmain on _GNUC_ wtf?
  180. //friends
  181. friend class CClient;
  182. #ifndef __GNUC__
  183. friend int _tmain(int argc, _TCHAR* argv[]);
  184. #else
  185. friend int main(int argc, char** argv);
  186. #endif
  187. };
  188. #endif // __CCALLBACK_H__