|
@@ -1129,6 +1129,12 @@ CHillFortWindow::CHillFortWindow(const CGHeroInstance * visitor, const CGObjectI
|
|
|
statusbar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
|
|
statusbar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
|
|
|
|
|
|
|
|
garr = std::make_shared<CGarrisonInt>(Point(108, 60), 18, Point(), hero, nullptr);
|
|
garr = std::make_shared<CGarrisonInt>(Point(108, 60), 18, Point(), hero, nullptr);
|
|
|
|
|
+
|
|
|
|
|
+ if(object->typeName == "miniHillFort")
|
|
|
|
|
+ statusbar->write(VLC->generaltexth->translate("vcmi.adventureMap.miniHillFort.statusBar.info"));
|
|
|
|
|
+ else if(object->typeName == "hillFort")
|
|
|
|
|
+ statusbar->write(VLC->generaltexth->translate("vcmi.adventureMap.HillFort.statusBar.info"));
|
|
|
|
|
+
|
|
|
updateGarrisons();
|
|
updateGarrisons();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1146,11 +1152,25 @@ void CHillFortWindow::updateGarrisons()
|
|
|
|
|
|
|
|
TResources totalSum; // totalSum[resource ID] = value
|
|
TResources totalSum; // totalSum[resource ID] = value
|
|
|
|
|
|
|
|
|
|
+ auto getImgIdx = [](CHillFortWindow::State st) -> std::size_t
|
|
|
|
|
+ {
|
|
|
|
|
+ switch (st)
|
|
|
|
|
+ {
|
|
|
|
|
+ case State::EMPTY:
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ case State::UNAVAILABLE:
|
|
|
|
|
+ case State::ALREADY_UPGRADED:
|
|
|
|
|
+ return 1;
|
|
|
|
|
+ default:
|
|
|
|
|
+ return static_cast<std::size_t>(st);
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
for(int i=0; i<slotsCount; i++)
|
|
for(int i=0; i<slotsCount; i++)
|
|
|
{
|
|
{
|
|
|
std::fill(costs[i].begin(), costs[i].end(), 0);
|
|
std::fill(costs[i].begin(), costs[i].end(), 0);
|
|
|
- int newState = getState(SlotID(i));
|
|
|
|
|
- if(newState != -1)
|
|
|
|
|
|
|
+ State newState = getState(SlotID(i));
|
|
|
|
|
+ if(newState != State::EMPTY)
|
|
|
{
|
|
{
|
|
|
UpgradeInfo info;
|
|
UpgradeInfo info;
|
|
|
LOCPLINT->cb->fillUpgradeInfo(hero, SlotID(i), info);
|
|
LOCPLINT->cb->fillUpgradeInfo(hero, SlotID(i), info);
|
|
@@ -1162,29 +1182,29 @@ void CHillFortWindow::updateGarrisons()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
currState[i] = newState;
|
|
currState[i] = newState;
|
|
|
- upgrade[i]->setImage(AnimationPath::builtin(currState[i] == -1 ? slotImages[0] : slotImages[currState[i]]));
|
|
|
|
|
- upgrade[i]->block(currState[i] == -1);
|
|
|
|
|
|
|
+ upgrade[i]->setImage(AnimationPath::builtin(slotImages[getImgIdx(currState[i])]));
|
|
|
|
|
+ upgrade[i]->block(currState[i] == State::EMPTY);
|
|
|
upgrade[i]->addHoverText(EButtonState::NORMAL, getTextForSlot(SlotID(i)));
|
|
upgrade[i]->addHoverText(EButtonState::NORMAL, getTextForSlot(SlotID(i)));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//"Upgrade all" slot
|
|
//"Upgrade all" slot
|
|
|
- int newState = 2;
|
|
|
|
|
|
|
+ State newState = State::MAKE_UPGRADE;
|
|
|
{
|
|
{
|
|
|
TResources myRes = LOCPLINT->cb->getResourceAmount();
|
|
TResources myRes = LOCPLINT->cb->getResourceAmount();
|
|
|
|
|
|
|
|
bool allUpgraded = true;//All creatures are upgraded?
|
|
bool allUpgraded = true;//All creatures are upgraded?
|
|
|
for(int i=0; i<slotsCount; i++)
|
|
for(int i=0; i<slotsCount; i++)
|
|
|
- allUpgraded &= currState[i] == 1 || currState[i] == -1;
|
|
|
|
|
|
|
+ allUpgraded &= currState[i] == State::ALREADY_UPGRADED || currState[i] == State::EMPTY || currState[i] == State::UNAVAILABLE;
|
|
|
|
|
|
|
|
- if(allUpgraded)
|
|
|
|
|
- newState = 1;
|
|
|
|
|
|
|
+ if (allUpgraded)
|
|
|
|
|
+ newState = State::ALREADY_UPGRADED;
|
|
|
|
|
|
|
|
if(!totalSum.canBeAfforded(myRes))
|
|
if(!totalSum.canBeAfforded(myRes))
|
|
|
- newState = 0;
|
|
|
|
|
|
|
+ newState = State::UNAFORDABLE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
currState[slotsCount] = newState;
|
|
currState[slotsCount] = newState;
|
|
|
- upgradeAll->setImage(AnimationPath::builtin(allImages[newState]));
|
|
|
|
|
|
|
+ upgradeAll->setImage(AnimationPath::builtin(allImages[static_cast<std::size_t>(newState)]));
|
|
|
|
|
|
|
|
garr->recreateSlots();
|
|
garr->recreateSlots();
|
|
|
|
|
|
|
@@ -1197,7 +1217,7 @@ void CHillFortWindow::updateGarrisons()
|
|
|
slotLabels[i][j]->setText("");
|
|
slotLabels[i][j]->setText("");
|
|
|
}
|
|
}
|
|
|
//if can upgrade or can not afford, draw cost
|
|
//if can upgrade or can not afford, draw cost
|
|
|
- if(currState[i] == 0 || currState[i] == 2)
|
|
|
|
|
|
|
+ if(currState[i] == State::UNAFORDABLE || currState[i] == State::MAKE_UPGRADE)
|
|
|
{
|
|
{
|
|
|
if(costs[i].nonZero())
|
|
if(costs[i].nonZero())
|
|
|
{
|
|
{
|
|
@@ -1246,16 +1266,20 @@ void CHillFortWindow::makeDeal(SlotID slot)
|
|
|
int offset = (slot.getNum() == slotsCount)?2:0;
|
|
int offset = (slot.getNum() == slotsCount)?2:0;
|
|
|
switch(currState[slot.getNum()])
|
|
switch(currState[slot.getNum()])
|
|
|
{
|
|
{
|
|
|
- case 0:
|
|
|
|
|
|
|
+ case State::ALREADY_UPGRADED:
|
|
|
|
|
+ LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[313 + offset], std::vector<std::shared_ptr<CComponent>>(), soundBase::sound_todo);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case State::UNAFORDABLE:
|
|
|
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[314 + offset], std::vector<std::shared_ptr<CComponent>>(), soundBase::sound_todo);
|
|
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[314 + offset], std::vector<std::shared_ptr<CComponent>>(), soundBase::sound_todo);
|
|
|
break;
|
|
break;
|
|
|
- case 1:
|
|
|
|
|
- LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[313 + offset], std::vector<std::shared_ptr<CComponent>>(), soundBase::sound_todo);
|
|
|
|
|
|
|
+ case State::UNAVAILABLE:
|
|
|
|
|
+ LOCPLINT->showInfoDialog(VLC->generaltexth->translate("vcmi.adventureMap.miniHillFort.notAvailableUpgrade.message"),
|
|
|
|
|
+ std::vector<std::shared_ptr<CComponent>>(), soundBase::sound_todo);
|
|
|
break;
|
|
break;
|
|
|
- case 2:
|
|
|
|
|
- for(int i=0; i<slotsCount; i++)
|
|
|
|
|
|
|
+ case State::MAKE_UPGRADE:
|
|
|
|
|
+ for(int i = 0; i < slotsCount; i++)
|
|
|
{
|
|
{
|
|
|
- if(slot.getNum() ==i || ( slot.getNum() == slotsCount && currState[i] == 2 ))//this is activated slot or "upgrade all"
|
|
|
|
|
|
|
+ if(slot.getNum() == i || ( slot.getNum() == slotsCount && currState[i] == State::MAKE_UPGRADE ))//this is activated slot or "upgrade all"
|
|
|
{
|
|
{
|
|
|
UpgradeInfo info;
|
|
UpgradeInfo info;
|
|
|
LOCPLINT->cb->fillUpgradeInfo(hero, SlotID(i), info);
|
|
LOCPLINT->cb->fillUpgradeInfo(hero, SlotID(i), info);
|
|
@@ -1281,22 +1305,28 @@ std::string CHillFortWindow::getTextForSlot(SlotID slot)
|
|
|
return str;
|
|
return str;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int CHillFortWindow::getState(SlotID slot)
|
|
|
|
|
|
|
+CHillFortWindow::State CHillFortWindow::getState(SlotID slot)
|
|
|
{
|
|
{
|
|
|
TResources myRes = LOCPLINT->cb->getResourceAmount();
|
|
TResources myRes = LOCPLINT->cb->getResourceAmount();
|
|
|
|
|
|
|
|
- if(hero->slotEmpty(slot))//no creature here
|
|
|
|
|
- return -1;
|
|
|
|
|
|
|
+ if(hero->slotEmpty(slot))
|
|
|
|
|
+ return State::EMPTY;
|
|
|
|
|
|
|
|
UpgradeInfo info;
|
|
UpgradeInfo info;
|
|
|
LOCPLINT->cb->fillUpgradeInfo(hero, slot, info);
|
|
LOCPLINT->cb->fillUpgradeInfo(hero, slot, info);
|
|
|
- if(!info.newID.size())//already upgraded
|
|
|
|
|
- return 1;
|
|
|
|
|
|
|
+ if (!info.newID.size())
|
|
|
|
|
+ {
|
|
|
|
|
+ // new Hill Fort allows upgrades level 5 and below
|
|
|
|
|
+ if (hero->getStack(slot).type->getLevel() >= 5 && hero->getCreature(slot)->hasUpgrades())
|
|
|
|
|
+ return State::UNAVAILABLE;
|
|
|
|
|
+
|
|
|
|
|
+ return State::ALREADY_UPGRADED;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
if(!(info.cost[0] * hero->getStackCount(slot)).canBeAfforded(myRes))
|
|
if(!(info.cost[0] * hero->getStackCount(slot)).canBeAfforded(myRes))
|
|
|
- return 0;
|
|
|
|
|
|
|
+ return State::UNAFORDABLE;
|
|
|
|
|
|
|
|
- return 2;//can upgrade
|
|
|
|
|
|
|
+ return State::MAKE_UPGRADE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner):
|
|
CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner):
|