2011-12-14 00:23:17 +03:00
# pragma once
2012-09-02 13:33:41 +03:00
# include "ConstTransitivePtr.h"
# include "ResourceSet.h"
2011-12-14 00:23:17 +03:00
# include "int3.h"
2012-09-26 16:13:39 +03:00
# include "GameConstants.h"
2009-04-16 14:14:13 +03:00
2009-04-15 17:03:31 +03:00
/*
* CTownHandler . 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-04-16 14:14:13 +03:00
*/
2012-09-02 13:33:41 +03:00
class CLegacyConfigParser ;
class JsonNode ;
2009-04-16 14:14:13 +03:00
2012-09-02 13:33:41 +03:00
/// a typical building encountered in every castle ;]
/// this is structure available to both client and server
/// contains all mechanics-related data about town structures
class DLL_LINKAGE CBuilding
{
2012-09-05 15:49:23 +03:00
typedef si32 BuildingType ; //TODO: replace int with pointer?
2012-09-02 13:33:41 +03:00
std : : string name ;
std : : string description ;
2009-04-16 14:14:13 +03:00
2012-09-02 13:33:41 +03:00
public :
2012-09-26 16:13:39 +03:00
TFaction tid ;
si32 bid ; //town ID and structure ID
2012-09-02 13:33:41 +03:00
TResources resources ;
2012-09-05 15:49:23 +03:00
std : : set < BuildingType > requirements ; /// set of required buildings, includes upgradeOf;
BuildingType upgrade ; /// indicates that building "upgrade" can be improved by this, -1 = empty
enum EBuildMode
{
BUILD_NORMAL , // 0 - normal, default
BUILD_AUTO , // 1 - auto - building appears when all requirements are built
BUILD_SPECIAL , // 2 - special - building can not be built normally
BUILD_GRAIL // 3 - grail - building reqires grail to be built
} ;
ui32 mode ;
2009-04-16 14:14:13 +03:00
2012-09-02 13:33:41 +03:00
const std : : string & Name ( ) const ;
const std : : string & Description ( ) const ;
2009-04-16 14:14:13 +03:00
2012-09-05 15:49:23 +03:00
//return base of upgrade(s) or this
BuildingType getBase ( ) const ;
// returns how many times build has to be upgraded to become build
si32 getDistance ( BuildingType build ) const ;
2009-04-16 14:14:13 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2012-09-05 15:49:23 +03:00
h & tid & bid & resources & name & description & requirements & upgrade & mode ;
2009-04-16 14:14:13 +03:00
}
2012-09-02 13:33:41 +03:00
friend class CTownHandler ;
2009-04-16 14:14:13 +03:00
} ;
2012-09-02 13:33:41 +03:00
/// This is structure used only by client
/// Consists of all gui-related data about town structures
2012-09-05 15:49:23 +03:00
/// Should be moved from lib to client
2012-09-02 13:33:41 +03:00
struct DLL_LINKAGE CStructure
2009-04-16 14:14:13 +03:00
{
2012-09-05 15:49:23 +03:00
CBuilding * building ; // base building. If null - this structure will be always present on screen
CBuilding * buildable ; // building that will be used to determine built building and visible cost. Usually same as "building"
bool hiddenUpgrade ; // used only if "building" is upgrade, if true - structure on town screen will behave exactly like parent (mouse clicks, hover texts, etc)
2009-04-16 14:14:13 +03:00
int3 pos ;
2012-09-02 13:33:41 +03:00
std : : string defName , borderName , areaName ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2012-09-05 15:49:23 +03:00
h & pos & defName & borderName & areaName & building & buildable ;
2012-09-02 13:33:41 +03:00
}
} ;
class DLL_LINKAGE CTown
{
2012-09-05 15:49:23 +03:00
std : : string name ;
std : : string description ;
2012-09-02 13:33:41 +03:00
std : : vector < std : : string > names ; //names of the town instances
public :
2012-09-26 16:13:39 +03:00
TFaction typeID ; //also works as factionID
2012-09-02 13:33:41 +03:00
/// level -> list of creatures on this tier
2012-09-05 15:49:23 +03:00
// TODO: replace with pointers to CCreature
2012-09-26 16:13:39 +03:00
std : : vector < std : : vector < TCreature > > creatures ;
2012-09-02 13:33:41 +03:00
bmap < int , ConstTransitivePtr < CBuilding > > buildings ;
// should be removed at least from configs in favour of auto-detection
std : : map < int , int > hordeLvl ; //[0] - first horde building creature level; [1] - second horde building (-1 if not present)
ui32 mageLevel ; //max available mage guild level
int bonus ; //pic number
ui16 primaryRes , warMachine ;
// Client-only data. Should be moved away from lib
struct ClientInfo
{
2012-09-22 18:10:15 +03:00
//icons [fort is present?][build limit reached?] -> index of icon in def files
int icons [ 2 ] [ 2 ] ;
2012-09-05 15:49:23 +03:00
std : : string musicTheme ;
std : : string townBackground ;
std : : string guildWindow ;
std : : string buildingsIcons ;
2012-09-02 13:33:41 +03:00
std : : string hallBackground ;
2012-09-05 15:49:23 +03:00
/// vector[row][column] = list of buildings in this slot
std : : vector < std : : vector < std : : vector < int > > > hallSlots ;
/// list of town screen structures.
/// NOTE: index in vector is meaningless. Vector used instead of list for a bit faster access
std : : vector < ConstTransitivePtr < CStructure > > structures ;
2012-09-02 13:33:41 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2012-09-22 18:10:15 +03:00
h & icons & musicTheme & townBackground & guildWindow & buildingsIcons & hallBackground & hallSlots & structures ;
2012-09-02 13:33:41 +03:00
}
} clientInfo ;
const std : : vector < std : : string > & Names ( ) const ;
const std : : string & Name ( ) const ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & name & names & typeID & creatures & buildings & hordeLvl & mageLevel & bonus
& primaryRes & warMachine & clientInfo ;
}
friend class CTownHandler ;
2009-04-16 14:14:13 +03:00
} ;
2012-09-21 00:28:18 +03:00
struct DLL_LINKAGE 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 ;
}
} ;
2012-09-05 15:49:23 +03:00
class CFaction
{
public :
std : : string name ; //reference name, usually lower case
2012-09-26 16:13:39 +03:00
TFaction factionID ;
2012-09-05 15:49:23 +03:00
ui32 nativeTerrain ;
std : : string creatureBg120 ;
std : : string creatureBg130 ;
2012-09-21 00:28:18 +03:00
std : : vector < SPuzzleInfo > puzzleMap ;
2012-09-05 15:49:23 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2012-09-21 00:28:18 +03:00
h & name & factionID & nativeTerrain & creatureBg120 & creatureBg130 & puzzleMap ;
2012-09-05 15:49:23 +03:00
}
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CTownHandler
2009-04-16 14:14:13 +03:00
{
2012-09-02 13:33:41 +03:00
/// loads CBuilding's into town
void loadBuilding ( CTown & town , const JsonNode & source ) ;
void loadBuildings ( CTown & town , const JsonNode & source ) ;
/// loads CStructure's into town
void loadStructure ( CTown & town , const JsonNode & source ) ;
void loadStructures ( CTown & town , const JsonNode & source ) ;
/// loads town hall vector (hallSlots)
void loadTownHall ( CTown & town , const JsonNode & source ) ;
2012-09-05 15:49:23 +03:00
void loadClientData ( CTown & town , const JsonNode & source ) ;
void loadTown ( CTown & town , const JsonNode & source ) ;
2012-09-02 13:33:41 +03:00
2012-09-21 00:28:18 +03:00
void loadPuzzle ( CFaction & faction , const JsonNode & source ) ;
2012-09-02 13:33:41 +03:00
/// load all available data from h3 txt(s) into json structure using format similar to vcmi configs
/// returns 2d array [townID] [buildID] of buildings
void loadLegacyData ( JsonNode & dest ) ;
2012-09-05 15:49:23 +03:00
2009-04-16 14:14:13 +03:00
public :
2012-09-26 16:13:39 +03:00
std : : map < TFaction , CTown > towns ;
std : : map < TFaction , CFaction > factions ;
2009-04-16 14:14:13 +03:00
2012-09-02 13:33:41 +03:00
CTownHandler ( ) ; //c-tor, set pointer in VLC to this
2012-09-23 17:32:49 +03:00
/// main loading function for mods, accepts merged JSON source and add all entries from it into game
/// all entries in JSON should be checked for validness before using this function
void loadFactions ( const JsonNode & source ) ;
/// "entry point" for loading of OH3 town.
2012-09-02 13:33:41 +03:00
/// reads legacy txt's from H3 + vcmi json, merges them
/// and loads resulting structure to game using loadTowns method
2012-09-05 15:49:23 +03:00
/// in future may require loaded Creature Handler
2012-09-02 13:33:41 +03:00
void load ( ) ;
2009-04-16 14:14:13 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2012-09-05 15:49:23 +03:00
h & towns & factions ;
2009-04-16 14:14:13 +03:00
}
} ;