mirror of
https://github.com/vcmi/vcmi.git
synced 2025-01-26 03:52:01 +02:00
Changes towards Hill fort support.
This commit is contained in:
parent
d69ae9aa4c
commit
fffef1d740
@ -98,7 +98,7 @@ void CCallback::endTurn()
|
|||||||
UpgradeInfo CCallback::getUpgradeInfo(const CArmedInstance *obj, int stackPos) const
|
UpgradeInfo CCallback::getUpgradeInfo(const CArmedInstance *obj, int stackPos) const
|
||||||
{
|
{
|
||||||
boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
|
||||||
return gs->getUpgradeInfo(const_cast<CArmedInstance*>(obj),stackPos);
|
return gs->getUpgradeInfo(obj->getStack(stackPos));
|
||||||
}
|
}
|
||||||
|
|
||||||
const StartInfo * CCallback::getStartInfo() const
|
const StartInfo * CCallback::getStartInfo() const
|
||||||
|
@ -616,7 +616,6 @@ CInfoWindow::CInfoWindow(std::string Text, int player, int charperline, const st
|
|||||||
{
|
{
|
||||||
OBJ_CONSTRUCTION_CAPTURING_ALL;
|
OBJ_CONSTRUCTION_CAPTURING_ALL;
|
||||||
ID = -1;
|
ID = -1;
|
||||||
this->delComps = delComps;
|
|
||||||
for(int i=0;i<Buttons.size();i++)
|
for(int i=0;i<Buttons.size();i++)
|
||||||
{
|
{
|
||||||
buttons.push_back(new AdventureMapButton("","",boost::bind(&CInfoWindow::close,this),0,0,Buttons[i].first));
|
buttons.push_back(new AdventureMapButton("","",boost::bind(&CInfoWindow::close,this),0,0,Buttons[i].first));
|
||||||
@ -635,13 +634,14 @@ CInfoWindow::CInfoWindow(std::string Text, int player, int charperline, const st
|
|||||||
addChild(comps[i]);
|
addChild(comps[i]);
|
||||||
components.push_back(comps[i]);
|
components.push_back(comps[i]);
|
||||||
}
|
}
|
||||||
|
setDelComps(delComps);
|
||||||
CMessage::drawIWindow(this,Text,player,charperline);
|
CMessage::drawIWindow(this,Text,player,charperline);
|
||||||
}
|
}
|
||||||
|
|
||||||
CInfoWindow::CInfoWindow()
|
CInfoWindow::CInfoWindow()
|
||||||
{
|
{
|
||||||
ID = -1;
|
ID = -1;
|
||||||
delComps = false;
|
setDelComps(false);
|
||||||
text = NULL;
|
text = NULL;
|
||||||
}
|
}
|
||||||
void CInfoWindow::close()
|
void CInfoWindow::close()
|
||||||
@ -657,11 +657,11 @@ void CInfoWindow::show(SDL_Surface * to)
|
|||||||
|
|
||||||
CInfoWindow::~CInfoWindow()
|
CInfoWindow::~CInfoWindow()
|
||||||
{
|
{
|
||||||
// if(delComps)
|
if(!delComps)
|
||||||
// {
|
{
|
||||||
// for (int i=0;i<components.size();i++)
|
for (int i=0;i<components.size();i++)
|
||||||
// delete components[i];
|
removeChild(components[i]);
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInfoWindow::showAll( SDL_Surface * to )
|
void CInfoWindow::showAll( SDL_Surface * to )
|
||||||
@ -677,7 +677,6 @@ void CInfoWindow::showYesNoDialog(const std::string & text, const std::vector<SC
|
|||||||
pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",0));
|
pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",0));
|
||||||
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",0));
|
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",0));
|
||||||
CInfoWindow * temp = new CInfoWindow(text, player, 0, components ? *components : std::vector<SComponent*>(), pom, DelComps);
|
CInfoWindow * temp = new CInfoWindow(text, player, 0, components ? *components : std::vector<SComponent*>(), pom, DelComps);
|
||||||
temp->delComps = DelComps;
|
|
||||||
for(int i=0;i<onYes.funcs.size();i++)
|
for(int i=0;i<onYes.funcs.size();i++)
|
||||||
temp->buttons[0]->callback += onYes.funcs[i];
|
temp->buttons[0]->callback += onYes.funcs[i];
|
||||||
for(int i=0;i<onNo.funcs.size();i++)
|
for(int i=0;i<onNo.funcs.size();i++)
|
||||||
@ -694,6 +693,18 @@ CInfoWindow * CInfoWindow::create(const std::string &text, int playerID /*= 1*/,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CInfoWindow::setDelComps(bool DelComps)
|
||||||
|
{
|
||||||
|
delComps = DelComps;
|
||||||
|
BOOST_FOREACH(SComponent *comp, components)
|
||||||
|
{
|
||||||
|
if(delComps)
|
||||||
|
comp->recActions |= DISPOSE;
|
||||||
|
else
|
||||||
|
comp->recActions &= ~DISPOSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CRClickPopup::clickRight(tribool down, bool previousState)
|
void CRClickPopup::clickRight(tribool down, bool previousState)
|
||||||
{
|
{
|
||||||
if(down)
|
if(down)
|
||||||
@ -2214,6 +2225,7 @@ CCreInfoWindow::CCreInfoWindow(const CStackInstance &st, int Type, boost::functi
|
|||||||
bool enough = true;
|
bool enough = true;
|
||||||
for(std::set<std::pair<int,int> >::iterator i=ui->cost[0].begin(); i!=ui->cost[0].end(); i++) //calculate upgrade cost
|
for(std::set<std::pair<int,int> >::iterator i=ui->cost[0].begin(); i!=ui->cost[0].end(); i++) //calculate upgrade cost
|
||||||
{
|
{
|
||||||
|
BLOCK_CAPTURING;
|
||||||
if(LOCPLINT->cb->getResourceAmount(i->first) < i->second*st.count)
|
if(LOCPLINT->cb->getResourceAmount(i->first) < i->second*st.count)
|
||||||
enough = false;
|
enough = false;
|
||||||
upgResCost.push_back(new SComponent(SComponent::resource,i->first,i->second*st.count));
|
upgResCost.push_back(new SComponent(SComponent::resource,i->first,i->second*st.count));
|
||||||
@ -2362,8 +2374,8 @@ CCreInfoWindow::CCreInfoWindow(int Cid, int Type, int creatureCount)
|
|||||||
CCreInfoWindow::~CCreInfoWindow()
|
CCreInfoWindow::~CCreInfoWindow()
|
||||||
{
|
{
|
||||||
delete anim;
|
delete anim;
|
||||||
// for(int i=0; i<upgResCost.size();i++)
|
for(int i=0; i<upgResCost.size();i++)
|
||||||
// delete upgResCost[i];
|
delete upgResCost[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCreInfoWindow::activate()
|
void CCreInfoWindow::activate()
|
||||||
|
@ -72,15 +72,21 @@ extern SDL_Color tytulowy, tlo, zwykly ;
|
|||||||
|
|
||||||
class CInfoWindow : public CSimpleWindow //text + comp. + ok button
|
class CInfoWindow : public CSimpleWindow //text + comp. + ok button
|
||||||
{ //window able to delete its components when closed
|
{ //window able to delete its components when closed
|
||||||
|
bool delComps; //whether comps will be deleted
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CTextBox *text;
|
CTextBox *text;
|
||||||
std::vector<AdventureMapButton *> buttons;
|
std::vector<AdventureMapButton *> buttons;
|
||||||
bool delComps; //whether comps will be deleted
|
|
||||||
std::vector<SComponent*> components;
|
std::vector<SComponent*> components;
|
||||||
|
CSlider *slider;
|
||||||
|
|
||||||
|
void setDelComps(bool DelComps);
|
||||||
virtual void close();
|
virtual void close();
|
||||||
|
|
||||||
void show(SDL_Surface * to);
|
void show(SDL_Surface * to);
|
||||||
void showAll(SDL_Surface * to);
|
void showAll(SDL_Surface * to);
|
||||||
|
void sliderMoved(int to);
|
||||||
|
|
||||||
CInfoWindow(std::string Text, int player, int charperline, const std::vector<SComponent*> &comps, std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons, bool delComps); //c-tor
|
CInfoWindow(std::string Text, int player, int charperline, const std::vector<SComponent*> &comps, std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons, bool delComps); //c-tor
|
||||||
CInfoWindow(); //c-tor
|
CInfoWindow(); //c-tor
|
||||||
~CInfoWindow(); //d-tor
|
~CInfoWindow(); //d-tor
|
||||||
|
@ -1723,37 +1723,61 @@ const CGHeroInstance * CGameState::battleGetOwner(int stackID)
|
|||||||
return curB->heroes[!curB->getStack(stackID)->attackerOwned];
|
return curB->heroes[!curB->getStack(stackID)->attackerOwned];
|
||||||
}
|
}
|
||||||
|
|
||||||
UpgradeInfo CGameState::getUpgradeInfo(const CArmedInstance *obj, int stackPos)
|
std::set<std::pair<int, int> > costDiff(const std::vector<ui32> &a, const std::vector<ui32> &b, const int modifier = 100) //modifer %
|
||||||
|
{
|
||||||
|
std::set<std::pair<int, int> > ret;
|
||||||
|
for(int j=0;j<RESOURCE_QUANTITY;j++)
|
||||||
|
{
|
||||||
|
assert(a[j] >= b[j]);
|
||||||
|
if(int dif = modifier * (a[j] - b[j]) / 100)
|
||||||
|
ret.insert(std::make_pair(j,dif));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpgradeInfo CGameState::getUpgradeInfo(const CStackInstance &stack)
|
||||||
{
|
{
|
||||||
UpgradeInfo ret;
|
UpgradeInfo ret;
|
||||||
const CCreature *base = obj->getCreature(stackPos);
|
const CCreature *base = stack.type;
|
||||||
if((obj->ID == TOWNI_TYPE) || ((obj->ID == HEROI_TYPE) && static_cast<const CGHeroInstance*>(obj)->visitedTown))
|
|
||||||
|
const CGHeroInstance *h = stack.armyObj->ID == HEROI_TYPE ? static_cast<const CGHeroInstance*>(stack.armyObj) : NULL;
|
||||||
|
const CGTownInstance *t = NULL;
|
||||||
|
|
||||||
|
if(stack.armyObj->ID == TOWNI_TYPE)
|
||||||
|
t = static_cast<const CGTownInstance *>(stack.armyObj);
|
||||||
|
else if(h)
|
||||||
|
t = h->visitedTown;
|
||||||
|
|
||||||
|
if(t)
|
||||||
{
|
{
|
||||||
const CGTownInstance * t;
|
BOOST_FOREACH(si32 bid, t->builtBuildings)
|
||||||
if(obj->ID == TOWNI_TYPE)
|
|
||||||
t = static_cast<const CGTownInstance *>(obj);
|
|
||||||
else
|
|
||||||
t = static_cast<const CGHeroInstance*>(obj)->visitedTown;
|
|
||||||
for(std::set<si32>::const_iterator i=t->builtBuildings.begin(); i!=t->builtBuildings.end(); i++)
|
|
||||||
{
|
{
|
||||||
if( (*i) >= 37 && (*i) < 44 ) //upgraded creature dwelling
|
if( bid >= 37 && bid < 44 ) //upgraded creature dwelling
|
||||||
{
|
{
|
||||||
int nid = t->town->upgradedCreatures[(*i)-37]; //upgrade offered by that building
|
int nid = t->town->upgradedCreatures[bid-37]; //upgrade offered by that building
|
||||||
if(base->upgrades.find(nid) != base->upgrades.end()) //possible upgrade
|
if(vstd::contains(base->upgrades, nid)) //possible upgrade
|
||||||
{
|
{
|
||||||
ret.newID.push_back(nid);
|
ret.newID.push_back(nid);
|
||||||
ret.cost.push_back(std::set<std::pair<int,int> >());
|
ret.cost.push_back(costDiff(VLC->creh->creatures[nid]->cost, base->cost));
|
||||||
for(int j=0;j<RESOURCE_QUANTITY;j++)
|
|
||||||
{
|
|
||||||
int dif = VLC->creh->creatures[nid]->cost[j] - base->cost[j];
|
|
||||||
if(dif)
|
|
||||||
ret.cost[ret.cost.size()-1].insert(std::make_pair(j,dif));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}//end for
|
}
|
||||||
}
|
}
|
||||||
//TODO: check if hero ability makes some upgrades possible
|
|
||||||
|
//hero is visiting Hill Fort
|
||||||
|
if(h && map->getTile(h->visitablePos()).visitableObjects.front()->ID == 35)
|
||||||
|
{
|
||||||
|
static const int costModifiers[] = {0, 25, 50, 75, 100}; //we get cheaper upgrades depending on level
|
||||||
|
const int costModifier = costModifiers[std::min<int>(std::max((int)base->level - 1, 0), ARRAY_COUNT(costModifiers) - 1)];
|
||||||
|
|
||||||
|
BOOST_FOREACH(si32 nid, base->upgrades)
|
||||||
|
{
|
||||||
|
ret.newID.push_back(nid);
|
||||||
|
ret.cost.push_back(costDiff(VLC->creh->creatures[nid]->cost, base->cost, costModifier));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: check if hero specialty makes some upgrades possible
|
||||||
|
|
||||||
if(ret.newID.size())
|
if(ret.newID.size())
|
||||||
ret.oldID = base->idNumber;
|
ret.oldID = base->idNumber;
|
||||||
|
@ -90,7 +90,9 @@ public:
|
|||||||
void initFromHero(const CGHeroInstance *h, bool detailed);
|
void initFromHero(const CGHeroInstance *h, bool detailed);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// typedef si32 TResourceUnit;
|
||||||
|
// typedef std::vector<si32> TResourceVector;
|
||||||
|
// typedef std::set<si32> TResourceSet;
|
||||||
|
|
||||||
struct DLL_EXPORT SThievesGuildInfo
|
struct DLL_EXPORT SThievesGuildInfo
|
||||||
{
|
{
|
||||||
@ -416,7 +418,7 @@ public:
|
|||||||
const CGHeroInstance * battleGetOwner(int stackID); //returns hero that owns given stack; NULL if none
|
const CGHeroInstance * battleGetOwner(int stackID); //returns hero that owns given stack; NULL if none
|
||||||
si8 battleMaxSpellLevel(); //calculates maximum spell level possible to be cast on battlefield - takes into account artifacts of both heroes; if no effects are set, SPELL_LEVELS is returned
|
si8 battleMaxSpellLevel(); //calculates maximum spell level possible to be cast on battlefield - takes into account artifacts of both heroes; if no effects are set, SPELL_LEVELS is returned
|
||||||
bool battleCanShoot(int ID, int dest); //determines if stack with given ID shoot at the selected destination
|
bool battleCanShoot(int ID, int dest); //determines if stack with given ID shoot at the selected destination
|
||||||
UpgradeInfo getUpgradeInfo(const CArmedInstance *obj, int stackPos);
|
UpgradeInfo getUpgradeInfo(const CStackInstance &stack);
|
||||||
//float getMarketEfficiency(int player, int mode=0);
|
//float getMarketEfficiency(int player, int mode=0);
|
||||||
std::set<int> getBuildingRequiments(const CGTownInstance *t, int ID);
|
std::set<int> getBuildingRequiments(const CGTownInstance *t, int ID);
|
||||||
int canBuildStructure(const CGTownInstance *t, int ID);// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements
|
int canBuildStructure(const CGTownInstance *t, int ID);// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements
|
||||||
|
@ -2778,7 +2778,7 @@ bool CGameHandler::recruitCreatures( si32 objid, ui32 crid, ui32 cram, si32 from
|
|||||||
bool CGameHandler::upgradeCreature( ui32 objid, ui8 pos, ui32 upgID )
|
bool CGameHandler::upgradeCreature( ui32 objid, ui8 pos, ui32 upgID )
|
||||||
{
|
{
|
||||||
CArmedInstance *obj = static_cast<CArmedInstance*>(gs->map->objects[objid]);
|
CArmedInstance *obj = static_cast<CArmedInstance*>(gs->map->objects[objid]);
|
||||||
UpgradeInfo ui = gs->getUpgradeInfo(obj,pos);
|
UpgradeInfo ui = gs->getUpgradeInfo(obj->getStack(pos));
|
||||||
int player = obj->tempOwner;
|
int player = obj->tempOwner;
|
||||||
int crQuantity = obj->slots[pos].count;
|
int crQuantity = obj->slots[pos].count;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user