2011-12-14 00:23:17 +03:00
# pragma once
2009-04-15 17:03:31 +03:00
2011-12-14 00:23:17 +03:00
2011-12-22 16:05:19 +03:00
# include "BattleHex.h"
2010-12-17 20:47:07 +02:00
# include "../lib/ConstTransitivePtr.h"
2011-12-14 00:23:17 +03:00
# include "GameConstants.h"
2010-12-17 20:47:07 +02:00
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 ;
2010-08-17 17:58:13 +03:00
struct SSpecialtyInfo
2010-07-06 10:32:40 +03:00
{ si32 type ;
si32 val ;
si32 subtype ;
si32 additionalinfo ;
2010-12-25 21:23:30 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & type & val & subtype & additionalinfo ;
}
2010-07-06 10:32:40 +03:00
} ;
2010-08-17 17:58:13 +03:00
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CHero
2009-02-09 16:50:32 +02:00
{
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
2010-06-26 19:02:10 +03:00
si32 ID ;
2009-07-03 21:40:36 +03:00
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)
2010-08-17 17:58:13 +03:00
std : : vector < SSpecialtyInfo > spec ;
2009-07-03 21:40:36 +03:00
si32 startingSpell ; //-1 if none
2010-08-25 17:57:58 +03:00
ui8 sex ; // default sex: 0=male, 1=female
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 )
{
2010-12-25 21:23:30 +02:00
h & name & ID & lowStack & highStack & refTypeStack & heroClass & heroType & secSkillsInit & spec & startingSpell & sex ;
2009-02-09 16:50:32 +02:00
}
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CHeroClass
2009-02-09 16:50:32 +02:00
{
public :
2010-07-20 09:05:45 +03:00
ui8 alignment ;
2009-02-09 16:50:32 +02:00
ui32 skillLimit ; //how many secondary skills can hero learn
std : : string name ;
2011-12-14 00:23:17 +03:00
double 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
2010-07-20 09:05:45 +03:00
& proSec & selectionProbability & terrCosts & alignment ;
2009-02-09 16:50:32 +02:00
}
2011-12-14 00:23:17 +03:00
EAlignment : : EAlignment getAlignment ( ) ;
2009-02-09 16:50:32 +02:00
} ;
2011-12-14 00:23:17 +03:00
struct DLL_LINKAGE CObstacleInfo
2009-02-09 16:50:32 +02:00
{
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-09-25 14:38:18 +03:00
int getWidth ( ) const ; //returns width of obstacle in hexes
int getHeight ( ) const ; //returns height of obstacle in hexes
2011-12-22 16:05:19 +03:00
std : : vector < BattleHex > getBlocked ( BattleHex hex ) const ; //returns vector of hexes blocked by obstacle when it's placed on hex 'hex'
BattleHex getMaxBlocked ( BattleHex hex ) const ; //returns maximal hex (max number) covered by this obstacle
2009-02-09 16:50:32 +02:00
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
}
} ;
2011-12-14 00:23:17 +03:00
struct DLL_LINKAGE SPuzzleInfo
2009-08-31 18:57:15 +03:00
{
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 ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CHeroHandler
2009-02-09 16:50:32 +02:00
{
public :
2010-12-17 20:47:07 +02:00
std : : vector < ConstTransitivePtr < 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
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
2011-12-14 00:23:17 +03:00
std : : vector < SPuzzleInfo > puzzleInfo [ GameConstants : : F_NUMBER ] ; //descriptions of puzzles
2009-08-31 18:57:15 +03:00
void loadPuzzleInfo ( ) ;
2011-12-14 00:23:17 +03:00
ui32 level ( ui64 experience ) const ; //calculates level corresponding to given experience amount
ui64 reqExp ( ui32 level ) const ; //calculates experience required for given level
2009-02-09 16:50:32 +02:00
void loadHeroes ( ) ;
void loadHeroClasses ( ) ;
void initHeroClasses ( ) ;
2011-09-02 06:39:49 +03:00
void loadTerrains ( ) ;
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 )
{
2010-08-16 12:54:09 +03:00
h & heroClasses & heroes & expPerLevel & ballistics & 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 ] ;
}
}
}
} ;