mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-23 22:37:55 +02:00
Implement markets
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include "CGTownInstance.h"
|
||||
#include "../GameSettings.h"
|
||||
#include "../CSkillHandler.h"
|
||||
#include "CObjectClassesHandler.h"
|
||||
|
||||
VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
@@ -158,23 +159,10 @@ std::vector<int> IMarket::availableItemsIds(EMarketMode::EMarketMode mode) const
|
||||
|
||||
const IMarket * IMarket::castFrom(const CGObjectInstance *obj, bool verbose)
|
||||
{
|
||||
switch(obj->ID)
|
||||
{
|
||||
case Obj::TOWN:
|
||||
return dynamic_cast<const CGTownInstance *>(obj);
|
||||
case Obj::ALTAR_OF_SACRIFICE:
|
||||
case Obj::BLACK_MARKET:
|
||||
case Obj::TRADING_POST:
|
||||
case Obj::TRADING_POST_SNOW:
|
||||
case Obj::FREELANCERS_GUILD:
|
||||
return dynamic_cast<const CGMarket *>(obj);
|
||||
case Obj::UNIVERSITY:
|
||||
return dynamic_cast<const CGUniversity *>(obj);
|
||||
default:
|
||||
if(verbose)
|
||||
logGlobal->error("Cannot cast to IMarket object with ID %d", obj->ID);
|
||||
return nullptr;
|
||||
}
|
||||
auto * imarket = dynamic_cast<const IMarket *>(obj);
|
||||
if(verbose && !imarket)
|
||||
logGlobal->error("Cannot cast to IMarket object type %s", obj->typeName);
|
||||
return imarket;
|
||||
}
|
||||
|
||||
IMarket::IMarket()
|
||||
@@ -191,43 +179,24 @@ std::vector<EMarketMode::EMarketMode> IMarket::availableModes() const
|
||||
return ret;
|
||||
}
|
||||
|
||||
void CGMarket::initObj(CRandomGenerator & rand)
|
||||
{
|
||||
VLC->objtypeh->getHandlerFor(ID, subID)->configureObject(this, rand);
|
||||
}
|
||||
|
||||
void CGMarket::onHeroVisit(const CGHeroInstance * h) const
|
||||
{
|
||||
openWindow(EOpenWindowMode::MARKET_WINDOW,id.getNum(),h->id.getNum());
|
||||
openWindow(EOpenWindowMode::MARKET_WINDOW, id.getNum(), h->id.getNum());
|
||||
}
|
||||
|
||||
int CGMarket::getMarketEfficiency() const
|
||||
{
|
||||
return 5;
|
||||
return marketEfficacy;
|
||||
}
|
||||
|
||||
bool CGMarket::allowsTrade(EMarketMode::EMarketMode mode) const
|
||||
{
|
||||
switch(mode)
|
||||
{
|
||||
case EMarketMode::RESOURCE_RESOURCE:
|
||||
case EMarketMode::RESOURCE_PLAYER:
|
||||
switch(ID)
|
||||
{
|
||||
case Obj::TRADING_POST:
|
||||
case Obj::TRADING_POST_SNOW:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
case EMarketMode::CREATURE_RESOURCE:
|
||||
return ID == Obj::FREELANCERS_GUILD;
|
||||
//case ARTIFACT_RESOURCE:
|
||||
case EMarketMode::RESOURCE_ARTIFACT:
|
||||
return ID == Obj::BLACK_MARKET;
|
||||
case EMarketMode::ARTIFACT_EXP:
|
||||
case EMarketMode::CREATURE_EXP:
|
||||
return ID == Obj::ALTAR_OF_SACRIFICE; //TODO? check here for alignment of visiting hero? - would not be coherent with other checks here
|
||||
case EMarketMode::RESOURCE_SKILL:
|
||||
return ID == Obj::UNIVERSITY;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return marketModes.count(mode);
|
||||
}
|
||||
|
||||
int CGMarket::availableUnits(EMarketMode::EMarketMode mode, int marketItemSerial) const
|
||||
@@ -237,14 +206,9 @@ int CGMarket::availableUnits(EMarketMode::EMarketMode mode, int marketItemSerial
|
||||
|
||||
std::vector<int> CGMarket::availableItemsIds(EMarketMode::EMarketMode mode) const
|
||||
{
|
||||
switch(mode)
|
||||
{
|
||||
case EMarketMode::RESOURCE_RESOURCE:
|
||||
case EMarketMode::RESOURCE_PLAYER:
|
||||
if(allowsTrade(mode))
|
||||
return IMarket::availableItemsIds(mode);
|
||||
default:
|
||||
return std::vector<int>();
|
||||
}
|
||||
return std::vector<int>();
|
||||
}
|
||||
|
||||
CGMarket::CGMarket()
|
||||
@@ -290,22 +254,26 @@ void CGBlackMarket::newTurn(CRandomGenerator & rand) const
|
||||
|
||||
void CGUniversity::initObj(CRandomGenerator & rand)
|
||||
{
|
||||
CGMarket::initObj(rand);
|
||||
|
||||
std::vector<int> toChoose;
|
||||
int skillsNeeded = skillsTotal - skills.size();
|
||||
for(int i = 0; i < VLC->skillh->size(); ++i)
|
||||
{
|
||||
if(cb->isAllowed(2, i))
|
||||
if(!vstd::contains(skills, i) && cb->isAllowed(2, i))
|
||||
{
|
||||
toChoose.push_back(i);
|
||||
}
|
||||
}
|
||||
if(toChoose.size() < 4)
|
||||
if(toChoose.size() < skillsNeeded)
|
||||
{
|
||||
logGlobal->warn("Warning: less then 4 available skills was found by University initializer!");
|
||||
logGlobal->warn("Warning: less then %d available skills was found by University initializer!", skillsTotal);
|
||||
return;
|
||||
}
|
||||
|
||||
// get 4 skills
|
||||
for(int i = 0; i < 4; ++i)
|
||||
// get 4 skills, excluding predefined
|
||||
|
||||
for(int i = 0; i < skillsNeeded; ++i)
|
||||
{
|
||||
// move randomly one skill to selected and remove from list
|
||||
auto it = RandomGeneratorUtil::nextItem(toChoose, rand);
|
||||
@@ -322,7 +290,7 @@ std::vector<int> CGUniversity::availableItemsIds(EMarketMode::EMarketMode mode)
|
||||
return skills;
|
||||
|
||||
default:
|
||||
return std::vector <int> ();
|
||||
return std::vector<int>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user