2009-02-09 16:50:32 +02:00
# ifndef __CHEROHANDLER_H__
# define __CHEROHANDLER_H__
# include "../global.h"
# include <string>
# include <vector>
# include <set>
2009-04-15 17:03:31 +03:00
/*
* CHeroHandler . 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
*
*/
2009-02-09 16:50:32 +02:00
class CHeroClass ;
class CDefHandler ;
class CGameInfo ;
class CGHeroInstance ;
class DLL_EXPORT CHero
{
public :
2009-05-07 20:20:41 +03:00
enum EHeroClasses { KNIGHT , CLERIC , RANGER , DRUID , ALCHEMIST , WIZARD ,
DEMONIAC , HERETIC , DEATHKNIGHT , NECROMANCER , WARLOCK , OVERLORD ,
BARBARIAN , BATTLEMAGE , BEASTMASTER , WITCH , PLANESWALKER , ELEMENTALIST } ;
std : : string name ; //name of hero
2009-07-03 21:40:36 +03:00
ui16 ID ;
ui32 lowStack [ 3 ] , highStack [ 3 ] ; //amount of units; described below
2009-02-09 16:50:32 +02:00
std : : string refTypeStack [ 3 ] ; //reference names of units appearing in hero's army if he is recruited in tavern
CHeroClass * heroClass ;
EHeroClasses heroType ; //hero class
std : : vector < std : : pair < ui8 , ui8 > > secSkillsInit ; //initial secondary skills; first - ID of skill, second - level of skill (1 - basic, 2 - adv., 3 - expert)
2009-07-03 21:40:36 +03:00
si32 startingSpell ; //-1 if none
2009-02-09 16:50:32 +02:00
//bool operator<(CHero& drugi){if (ID < drugi.ID) return true; else return false;}
2009-07-03 21:40:36 +03:00
CHero ( ) ;
~ CHero ( ) ;
2009-02-09 16:50:32 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-07-12 17:07:36 +03:00
h & name & ID & lowStack & highStack & refTypeStack & heroType & startingSpell ;
2009-02-09 16:50:32 +02:00
//hero class pointer is restored by herohandler
}
} ;
class DLL_EXPORT CHeroClass
{
public :
ui32 skillLimit ; //how many secondary skills can hero learn
std : : string name ;
float aggression ;
2009-05-07 20:20:41 +03:00
int initialAttack , initialDefence , initialPower , initialKnowledge ; //initial values of primary skills
2009-02-09 16:50:32 +02:00
std : : vector < std : : pair < int , int > > primChance ; //primChance[PRIMARY_SKILL_ID] - first is for levels 2 - 9, second for 10+;;; probability (%) of getting point of primary skill when getting new level
std : : vector < int > proSec ; //probabilities of gaining secondary skills (out of 112), in id order
int selectionProbability [ 9 ] ; //probability of selection in towns
std : : vector < int > terrCosts ; //default costs of going through terrains: dirt, sand, grass, snow, swamp, rough, subterranean, lava, water, rock; -1 means terrain is imapassable
int chooseSecSkill ( const std : : set < int > & possibles ) const ; //picks secondary skill out from given possibilities
2009-05-07 20:20:41 +03:00
CHeroClass ( ) ; //c-tor
~ CHeroClass ( ) ; //d-tor
2009-02-09 16:50:32 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & skillLimit & name & aggression & initialAttack & initialDefence & initialPower & initialKnowledge & primChance
& proSec & selectionProbability & terrCosts ;
}
} ;
struct DLL_EXPORT CObstacleInfo
{
int ID ;
std : : string defName ,
blockmap , //blockmap: X - blocked, N - not blocked, L - description goes to the next line, staring with the left bottom hex
2009-02-07 18:07:29 +02:00
allowedTerrains ; /*terrains[i]: 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
2009-02-09 16:50:32 +02:00
24. ship to ship 25. ship */
2009-08-30 15:58:38 +03:00
std : : pair < si16 , si16 > posShift ; //shift of obstacle's position in the battlefield <x shift, y shift>, eg. if it's <-1, 2> obstacle will be printed one pixel to the left and two to the bottom
2009-02-09 16:50:32 +02:00
int getWidth ( ) ; //returns width of obstacle in hexes
int getHeight ( ) ; //returns height of obstacle in hexes
std : : vector < int > getBlocked ( int hex ) ; //returns vector of hexes blocked by obstacle when it's placed on hex 'hex'
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-08-30 15:58:38 +03:00
h & ID & defName & blockmap & allowedTerrains & posShift ;
2009-02-09 16:50:32 +02:00
}
} ;
2009-08-31 18:57:15 +03:00
struct DLL_EXPORT SPuzzleInfo
{
ui16 number ; //type of puzzle
si16 x , y ; //position
ui16 whenUncovered ; //determines the sequnce of discovering (the lesser it is the sooner puzzle will be discovered)
std : : string filename ; //file with graphic of this puzzle
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & number & x & y & whenUncovered & filename ;
}
} ;
const int PUZZLES_PER_FACTION = 48 ;
2009-02-09 16:50:32 +02:00
class DLL_EXPORT CHeroHandler
{
public :
2009-07-25 19:35:47 +03:00
std : : vector < CHero * > heroes ; //changed from nodrze
2009-02-09 16:50:32 +02:00
std : : vector < CHeroClass * > heroClasses ;
2009-08-17 13:02:29 +03:00
std : : vector < ui64 > expPerLevel ; //expPerLEvel[i] is amount of exp needed to reach level i; if it is not in this vector, multiplicate last value by 1,2 to get next value
2009-02-09 16:50:32 +02:00
struct SBallisticsLevelInfo
{
ui8 keep , tower , gate , wall ; //chance to hit in percent (eg. 87 is 87%)
ui8 shots ; //how many shots we have
ui8 noDmg , oneDmg , twoDmg ; //chances for shot dealing certain dmg in percent (eg. 87 is 87%); must sum to 100
ui8 sum ; //I don't know if it is useful for anything, but it's in config file
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & keep & tower & gate & wall & shots & noDmg & oneDmg & twoDmg & sum ;
}
} ;
std : : vector < SBallisticsLevelInfo > ballistics ; //info about ballistics ability per level; [0] - none; [1] - basic; [2] - adv; [3] - expert
2009-08-27 02:38:17 +03:00
std : : vector < std : : pair < int , int > > wallPositions [ F_NUMBER ] ; //positions of different pieces of wall <x, y>
2009-08-26 17:09:55 +03:00
void loadWallPositions ( ) ;
2009-02-09 16:50:32 +02:00
std : : map < int , CObstacleInfo > obstacles ; //info about obstacles that may be placed on battlefield
2009-06-30 15:28:22 +03:00
std : : vector < int > nativeTerrains ; //info about native terrains of different factions
2009-02-09 16:50:32 +02:00
2009-05-07 20:20:41 +03:00
void loadObstacles ( ) ; //loads info about obstacles
2009-02-09 16:50:32 +02:00
2009-08-31 18:57:15 +03:00
std : : vector < SPuzzleInfo > puzzleInfo [ F_NUMBER ] ; //descriptions of puzzles
void loadPuzzleInfo ( ) ;
2009-08-11 10:50:29 +03:00
unsigned int level ( ui64 experience ) ; //calculates level corresponding to given experience amount
ui64 reqExp ( unsigned int level ) ; //calculates experience resuired for given level
2009-02-09 16:50:32 +02:00
void loadHeroes ( ) ;
void loadHeroClasses ( ) ;
void initHeroClasses ( ) ;
void initTerrainCosts ( ) ;
2009-06-30 15:28:22 +03:00
void loadNativeTerrains ( ) ;
2009-05-07 20:20:41 +03:00
CHeroHandler ( ) ; //c-tor
~ CHeroHandler ( ) ; //d-tor
2009-02-09 16:50:32 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-08-31 18:57:15 +03:00
h & heroClasses & heroes & expPerLevel & ballistics & wallPositions & obstacles & nativeTerrains & puzzleInfo ;
2009-02-09 16:50:32 +02:00
if ( ! h . saving )
{
//restore class pointers
for ( int i = 0 ; i < heroes . size ( ) ; i + + )
{
heroes [ i ] - > heroClass = heroClasses [ heroes [ i ] - > heroType ] ;
}
}
}
} ;
# endif // __CHEROHANDLER_H__