1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Merge pull request #2355 from IvanSavenko/bugfixing

Bugfixing iteration
This commit is contained in:
Ivan Savenko
2023-07-18 16:06:00 +03:00
committed by GitHub
10 changed files with 75 additions and 16 deletions

View File

@@ -394,8 +394,9 @@ void AdventureMapInterface::onPlayerTurnStarted(PlayerColor playerID)
LOCPLINT->localState->setSelection(LOCPLINT->localState->getWanderingHero(0));
}
//show new day animation and sound on infobar
widget->getInfoBar()->showDate();
//show new day animation and sound on infobar, except for 1st day of the game
if (LOCPLINT->cb->getDate(Date::DAY) != 1)
widget->getInfoBar()->showDate();
onHeroChanged(nullptr);
Canvas canvas = Canvas::createFromSurface(screen);

View File

@@ -287,8 +287,28 @@ void CHeroList::updateElement(const CGHeroInstance * hero)
void CHeroList::updateWidget()
{
listBox->resize(LOCPLINT->localState->getWanderingHeroes().size());
listBox->reset();
auto & heroes = LOCPLINT->localState->getWanderingHeroes();
listBox->resize(heroes.size());
for (size_t i = 0; i < heroes.size(); ++i)
{
auto item = std::dynamic_pointer_cast<CHeroItem>(listBox->getItem(i));
if (!item)
continue;
if (item->hero == heroes[i])
{
item->update();
}
else
{
listBox->reset();
break;
}
}
if (LOCPLINT->localState->getCurrentHero())
select(LOCPLINT->localState->getCurrentHero());
@@ -364,8 +384,28 @@ void CTownList::updateElement(const CGTownInstance * town)
void CTownList::updateWidget()
{
listBox->resize(LOCPLINT->localState->getOwnedTowns().size());
listBox->reset();
auto & towns = LOCPLINT->localState->getOwnedTowns();
listBox->resize(towns.size());
for (size_t i = 0; i < towns.size(); ++i)
{
auto item = std::dynamic_pointer_cast<CTownItem>(listBox->getItem(i));
if (!item)
continue;
if (item->town == towns[i])
{
item->update();
}
else
{
listBox->reset();
break;
}
}
if (LOCPLINT->localState->getCurrentTown())
select(LOCPLINT->localState->getCurrentTown());

View File

@@ -172,6 +172,15 @@ void EventDispatcher::dispatchClosePopup(const Point & position)
void EventDispatcher::handleLeftButtonClick(const Point & position, bool isPressed)
{
// WARNING: this approach is NOT SAFE
// 1) We allow (un)registering elements when list itself is being processed/iterated
// 2) To avoid iterator invalidation we create a copy of this list for processing
// HOWEVER it is completely possible (as in, actually happen, no just theory) to:
// 1) element gets unregistered and deleted from lclickable
// 2) element is completely deleted, as in - destructor called, memory freed
// 3) new element is created *with exactly same address(!)
// 4) new element is registered and code will incorrectly assume that this element is still registered
// POSSIBLE SOLUTION: make EventReceivers inherit from create_shared_from this and store weak_ptr's in lists
auto hlp = lclickable;
for(auto & i : hlp)
{

View File

@@ -29,6 +29,14 @@ AboutProjectView::AboutProjectView(QWidget * parent)
ui->lineEditOperatingSystem->setText(QSysInfo::prettyProductName());
}
void AboutProjectView::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange)
ui->retranslateUi(this);
QWidget::changeEvent(event);
}
void AboutProjectView::on_updatesButton_clicked()
{
UpdateDialog::showUpdateDialog(true);

View File

@@ -21,6 +21,7 @@ class AboutProjectView : public QWidget
{
Q_OBJECT
void changeEvent(QEvent *event) override;
public:
explicit AboutProjectView(QWidget * parent = 0);

View File

@@ -127,7 +127,7 @@ QSize CSettingsView::getPreferredRenderingResolution()
return QSize(resX, resY);
}
#endif
return QApplication::primaryScreen()->geometry().size();
return QApplication::primaryScreen()->geometry().size() * QApplication::primaryScreen()->devicePixelRatio();
}
void CSettingsView::fillValidScalingRange()

View File

@@ -136,7 +136,7 @@ MapFormatFeaturesH3M MapFormatFeaturesH3M::getFeaturesHOTA(uint32_t hotaVersion)
{
result.artifactsCount = 163; // + HotA artifacts
result.heroesCount = 178; // + Cove
result.heroesPortraitsCount = 185; // + Cove
result.heroesPortraitsCount = 186; // + Cove
}
if(hotaVersion == 3)
{

View File

@@ -1735,7 +1735,7 @@ CGObjectInstance * CMapLoaderH3M::readHero(const int3 & mapPosition, const Objec
if(!object->spells.empty())
{
object->clear();
logGlobal->warn("Hero %s subID=%d has spells set twice (in map properties and on adventure map instance). Using the latter set...", object->getNameTextID(), object->subID);
logGlobal->debug("Hero %s subID=%d has spells set twice (in map properties and on adventure map instance). Using the latter set...", object->getNameTextID(), object->subID);
}
object->spells.insert(SpellID::PRESET); //placeholder "preset spells"

View File

@@ -29,7 +29,7 @@ void MapIdentifiersH3M::loadMapping(std::map<IdentifierID, IdentifierID> & resul
for (auto entry : mapping.Struct())
{
IdentifierID sourceID (entry.second.Integer());
IdentifierID targetID (*VLC->modh->identifiers.getIdentifier(VLC->modh->scopeGame(), identifierName, entry.first));
IdentifierID targetID (*VLC->modh->identifiers.getIdentifier(entry.second.meta, identifierName, entry.first));
result[sourceID] = targetID;
}
@@ -39,13 +39,13 @@ void MapIdentifiersH3M::loadMapping(const JsonNode & mapping)
{
for (auto entryFaction : mapping["buildings"].Struct())
{
FactionID factionID (*VLC->modh->identifiers.getIdentifier(VLC->modh->scopeGame(), "faction", entryFaction.first));
FactionID factionID (*VLC->modh->identifiers.getIdentifier(entryFaction.second.meta, "faction", entryFaction.first));
auto buildingMap = entryFaction.second;
for (auto entryBuilding : buildingMap.Struct())
{
BuildingID sourceID (entryBuilding.second.Integer());
BuildingID targetID (*VLC->modh->identifiers.getIdentifier(VLC->modh->scopeGame(), "building." + VLC->factions()->getById(factionID)->getJsonKey(), entryBuilding.first));
BuildingID targetID (*VLC->modh->identifiers.getIdentifier(entryBuilding.second.meta, "building." + VLC->factions()->getById(factionID)->getJsonKey(), entryBuilding.first));
mappingFactionBuilding[factionID][sourceID] = targetID;
}
@@ -68,7 +68,7 @@ void MapIdentifiersH3M::loadMapping(const JsonNode & mapping)
{
for (auto entryInner : entryOuter.second.Struct())
{
auto handler = VLC->objtypeh->getHandlerFor( VLC->modh->scopeGame(), entryOuter.first, entryInner.first);
auto handler = VLC->objtypeh->getHandlerFor( entryInner.second.meta, entryOuter.first, entryInner.first);
auto entryValues = entryInner.second.Vector();
ObjectTypeIdentifier h3mID{Obj(entryValues[0].Integer()), int32_t(entryValues[1].Integer())};
@@ -78,7 +78,7 @@ void MapIdentifiersH3M::loadMapping(const JsonNode & mapping)
}
else
{
auto handler = VLC->objtypeh->getHandlerFor( VLC->modh->scopeGame(), entryOuter.first, entryOuter.first);
auto handler = VLC->objtypeh->getHandlerFor( entryOuter.second.meta, entryOuter.first, entryOuter.first);
auto entryValues = entryOuter.second.Vector();
ObjectTypeIdentifier h3mID{Obj(entryValues[0].Integer()), int32_t(entryValues[1].Integer())};
@@ -90,7 +90,7 @@ void MapIdentifiersH3M::loadMapping(const JsonNode & mapping)
for (auto entry : mapping["portraits"].Struct())
{
int32_t sourceID = entry.second.Integer();
int32_t targetID = *VLC->modh->identifiers.getIdentifier(VLC->modh->scopeGame(), "hero", entry.first);
int32_t targetID = *VLC->modh->identifiers.getIdentifier(entry.second.meta, "hero", entry.first);
int32_t iconID = VLC->heroTypes()->getByIndex(targetID)->getIconIndex();
mappingHeroPortrait[sourceID] = iconID;

View File

@@ -299,7 +299,7 @@ void PlayerMessageProcessor::cheatResources(PlayerColor player, std::vector<std:
}
TResources resources;
resources[EGameResID::GOLD] = baseResourceAmount * 100;
resources[EGameResID::GOLD] = baseResourceAmount * 1000;
for (GameResID i = EGameResID::WOOD; i < EGameResID::GOLD; ++i)
resources[i] = baseResourceAmount;