2022-07-26 15:07:42 +02:00
/*
2014-06-05 20:26:50 +03:00
* CGMarket . h , part of VCMI engine
2014-06-05 19:52:14 +03:00
*
* 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
*
*/
2017-07-13 10:26:03 +02:00
# pragma once
# include "CObjectHandler.h"
2014-06-05 19:52:14 +03:00
2022-07-26 15:07:42 +02:00
VCMI_LIB_NAMESPACE_BEGIN
2014-06-05 19:52:14 +03:00
class DLL_LINKAGE IMarket
{
public :
2023-04-26 22:18:43 +02:00
IMarket ( ) ;
2014-06-05 19:52:14 +03:00
virtual ~ IMarket ( ) { }
2023-04-26 22:18:43 +02:00
virtual int getMarketEfficiency ( ) const = 0 ;
2014-06-05 19:52:14 +03:00
virtual bool allowsTrade ( EMarketMode : : EMarketMode mode ) const ;
virtual int availableUnits ( EMarketMode : : EMarketMode mode , int marketItemSerial ) const ; //-1 if unlimited
virtual std : : vector < int > availableItemsIds ( EMarketMode : : EMarketMode mode ) const ;
bool getOffer ( int id1 , int id2 , int & val1 , int & val2 , EMarketMode : : EMarketMode mode ) const ; //val1 - how many units of id1 player has to give to receive val2 units
std : : vector < EMarketMode : : EMarketMode > availableModes ( ) const ;
static const IMarket * castFrom ( const CGObjectInstance * obj , bool verbose = true ) ;
} ;
class DLL_LINKAGE CGMarket : public CGObjectInstance , public IMarket
{
public :
2023-04-28 03:16:10 +02:00
std : : set < EMarketMode : : EMarketMode > marketModes ;
int marketEfficacy = 5 ;
2023-04-29 14:10:30 +02:00
//window variables
std : : string title ;
std : : string speech ; //currently shown only in university
2014-06-05 19:52:14 +03:00
CGMarket ( ) ;
2023-04-28 03:16:10 +02:00
///IObjectInterface
2014-06-05 19:52:14 +03:00
void onHeroVisit ( const CGHeroInstance * h ) const override ; //open trading window
2023-04-28 03:16:10 +02:00
void initObj ( CRandomGenerator & rand ) override ; //set skills for trade
2014-06-05 19:52:14 +03:00
///IMarket
int getMarketEfficiency ( ) const override ;
bool allowsTrade ( EMarketMode : : EMarketMode mode ) const override ;
int availableUnits ( EMarketMode : : EMarketMode mode , int marketItemSerial ) const override ; //-1 if unlimited
std : : vector < int > availableItemsIds ( EMarketMode : : EMarketMode mode ) const override ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & static_cast < CGObjectInstance & > ( * this ) ;
2023-04-28 03:16:10 +02:00
h & marketModes ;
h & marketEfficacy ;
2023-04-29 14:10:30 +02:00
h & title ;
h & speech ;
2014-06-05 19:52:14 +03:00
}
} ;
class DLL_LINKAGE CGBlackMarket : public CGMarket
{
public :
std : : vector < const CArtifact * > artifacts ; //available artifacts
2016-09-09 19:30:36 +02:00
void newTurn ( CRandomGenerator & rand ) const override ; //reset artifacts for black market every month
2014-06-05 19:52:14 +03:00
std : : vector < int > availableItemsIds ( EMarketMode : : EMarketMode mode ) const override ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & static_cast < CGMarket & > ( * this ) ;
h & artifacts ;
}
} ;
class DLL_LINKAGE CGUniversity : public CGMarket
{
public :
std : : vector < int > skills ; //available skills
2015-10-12 15:47:10 +02:00
std : : vector < int > availableItemsIds ( EMarketMode : : EMarketMode mode ) const override ;
2016-09-09 19:30:36 +02:00
void initObj ( CRandomGenerator & rand ) override ; //set skills for trade
2014-06-05 19:52:14 +03:00
void onHeroVisit ( const CGHeroInstance * h ) const override ; //open window
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & static_cast < CGMarket & > ( * this ) ;
h & skills ;
}
} ;
2022-07-26 15:07:42 +02:00
VCMI_LIB_NAMESPACE_END