1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-09 13:14:02 +02:00

Merge remote-tracking branch 'upstream/develop' into develop

This commit is contained in:
Xilmi 2024-11-07 14:35:13 +01:00
commit a70f5de8c6
288 changed files with 1135 additions and 766 deletions

View File

@ -3,7 +3,6 @@ name: VCMI
on:
push:
branches:
- features/*
- beta
- master
- develop
@ -76,6 +75,7 @@ jobs:
os: windows-latest
test: 0
pack: 1
upload: 1
pack_type: RelWithDebInfo
extension: exe
before_install: msvc.sh
@ -92,7 +92,6 @@ jobs:
os: ubuntu-24.04
test: 0
pack: 1
upload: 1
pack_type: Release
extension: exe
cmake_args: -G Ninja
@ -342,7 +341,7 @@ jobs:
${{github.workspace}}/**/*.pdb
- name: Upload build
if: ${{ (matrix.upload == 1) && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/beta' || github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/features/')) }}
if: ${{ (matrix.upload == 1) && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/beta' || github.ref == 'refs/heads/master') }}
continue-on-error: true
run: |
if [ -z '${{ env.ANDROID_APK_PATH }}' ] ; then

View File

@ -1055,7 +1055,7 @@ void AIGateway::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance
//FIXME: why are the above possible to be null?
bool emptySlotFound = false;
for(auto slot : artifact->artType->getPossibleSlots().at(target->bearerType()))
for(auto slot : artifact->getType()->getPossibleSlots().at(target->bearerType()))
{
if(target->isPositionFree(slot) && artifact->canBePutAt(target, slot, true)) //combined artifacts are not always allowed to move
{
@ -1068,7 +1068,7 @@ void AIGateway::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance
}
if(!emptySlotFound) //try to put that atifact in already occupied slot
{
for(auto slot : artifact->artType->getPossibleSlots().at(target->bearerType()))
for(auto slot : artifact->getType()->getPossibleSlots().at(target->bearerType()))
{
auto otherSlot = target->getSlot(slot);
if(otherSlot && otherSlot->artifact) //we need to exchange artifact for better one
@ -1079,8 +1079,8 @@ void AIGateway::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance
{
logAi->trace(
"Exchange artifacts %s <-> %s",
artifact->artType->getNameTranslated(),
otherSlot->artifact->artType->getNameTranslated());
artifact->getType()->getNameTranslated(),
otherSlot->artifact->getType()->getNameTranslated());
if(!otherSlot->artifact->canBePutAt(artHolder, location.slot, true))
{
@ -1129,10 +1129,10 @@ void AIGateway::recruitCreatures(const CGDwelling * d, const CArmedInstance * re
{
for(auto stack : recruiter->Slots())
{
if(!stack.second->type)
if(!stack.second->getType())
continue;
auto duplicatingSlot = recruiter->getSlotFor(stack.second->type);
auto duplicatingSlot = recruiter->getSlotFor(stack.second->getCreature());
if(duplicatingSlot != stack.first)
{

View File

@ -193,7 +193,7 @@ bool canBeEmbarkmentPoint(const TerrainTile * t, bool fromWater)
{
// TODO: Such information should be provided by pathfinder
// Tile must be free or with unoccupied boat
if(!t->blocked)
if(!t->blocked())
{
return true;
}
@ -267,8 +267,8 @@ bool compareArmyStrength(const CArmedInstance * a1, const CArmedInstance * a2)
bool compareArtifacts(const CArtifactInstance * a1, const CArtifactInstance * a2)
{
auto art1 = a1->artType;
auto art2 = a2->artType;
auto art1 = a1->getType();
auto art2 = a2->getType();
if(art1->getPrice() == art2->getPrice())
return art1->valOfBonuses(BonusType::PRIMARY_SKILL) > art2->valOfBonuses(BonusType::PRIMARY_SKILL);
@ -312,7 +312,7 @@ int getDuplicatingSlots(const CArmedInstance * army)
for(auto stack : army->Slots())
{
if(stack.second->type && army->getSlotFor(stack.second->type) != stack.first)
if(stack.second->getCreature() && army->getSlotFor(stack.second->getCreature()) != stack.first)
duplicatingSlots++;
}
@ -387,7 +387,7 @@ bool shouldVisit(const Nullkiller * ai, const CGHeroInstance * h, const CGObject
{
for(auto slot : h->Slots())
{
if(slot.second->type->hasUpgrades())
if(slot.second->getType()->hasUpgrades())
return true; //TODO: check price?
}
return false;

View File

@ -90,7 +90,7 @@ std::vector<SlotInfo> ArmyManager::getSortedSlots(const CCreatureSet * target, c
{
for(auto & i : armyPtr->Slots())
{
auto cre = dynamic_cast<const CCreature*>(i.second->type);
auto cre = dynamic_cast<const CCreature*>(i.second->getType());
auto & slotInfp = creToPower[cre];
slotInfp.creature = cre;

View File

@ -170,10 +170,10 @@ uint64_t getCreatureBankArmyReward(const CGObjectInstance * target, const CGHero
for (auto c : creatures)
{
//Only if hero has slot for this creature in the army
auto ccre = dynamic_cast<const CCreature*>(c.data.type);
auto ccre = dynamic_cast<const CCreature*>(c.data.getType());
if (hero->getSlotFor(ccre).validSlot() || duplicatingSlots > 0)
{
result += (c.data.type->getAIValue() * c.data.count) * c.chance;
result += (c.data.getType()->getAIValue() * c.data.count) * c.chance;
}
/*else
{
@ -309,7 +309,7 @@ uint64_t RewardEvaluator::getArmyReward(
case Obj::SPELL_SCROLL:
//FALL_THROUGH
case Obj::ARTIFACT:
return evaluateArtifactArmyValue(dynamic_cast<const CGArtifact *>(target)->storedArtifact->artType);
return evaluateArtifactArmyValue(dynamic_cast<const CGArtifact *>(target)->storedArtifact->getType());
case Obj::HERO:
return relations == PlayerRelations::ENEMIES
? enemyArmyEliminationRewardRatio * dynamic_cast<const CGHeroInstance *>(target)->getArmyStrength()

View File

@ -130,10 +130,10 @@ void AINodeStorage::initialize(const PathfinderOptions & options, const CGameSta
for(pos.y = 0; pos.y < sizes.y; ++pos.y)
{
const TerrainTile & tile = gs->map->getTile(pos);
if (!tile.terType->isPassable())
if (!tile.getTerrain()->isPassable())
continue;
if (tile.terType->isWater())
if (tile.isWater())
{
resetTile(pos, ELayer::SAIL, PathfinderUtil::evaluateAccessibility<ELayer::SAIL>(pos, tile, fow, player, gs));
if (useFlying)

View File

@ -186,7 +186,7 @@ bool canBeEmbarkmentPoint(const TerrainTile * t, bool fromWater)
{
// TODO: Such information should be provided by pathfinder
// Tile must be free or with unoccupied boat
if(!t->blocked)
if(!t->blocked())
{
return true;
}
@ -247,8 +247,8 @@ bool compareArmyStrength(const CArmedInstance * a1, const CArmedInstance * a2)
bool compareArtifacts(const CArtifactInstance * a1, const CArtifactInstance * a2)
{
auto art1 = a1->artType;
auto art2 = a2->artType;
auto art1 = a1->getType();
auto art2 = a2->getType();
if(art1->getPrice() == art2->getPrice())
return art1->valOfBonuses(BonusType::PRIMARY_SKILL) > art2->valOfBonuses(BonusType::PRIMARY_SKILL);

View File

@ -36,7 +36,7 @@ std::vector<SlotInfo> ArmyManager::getSortedSlots(const CCreatureSet * target, c
{
for(auto & i : armyPtr->Slots())
{
auto cre = dynamic_cast<const CCreature*>(i.second->type);
auto cre = dynamic_cast<const CCreature*>(i.second->getType());
auto & slotInfp = creToPower[cre];
slotInfp.creature = cre;

View File

@ -162,7 +162,7 @@ TGoalVec CompleteQuest::missionArmy() const
for(auto creature : q.quest->mission.creatures)
{
solutions.push_back(sptr(GatherTroops(creature.type->getId(), creature.count)));
solutions.push_back(sptr(GatherTroops(creature.getId(), creature.count)));
}
return solutions;

View File

@ -92,7 +92,7 @@ std::optional<int> MapObjectsEvaluator::getObjectValue(const CGObjectInstance *
else if(obj->ID == Obj::ARTIFACT)
{
auto artifactObject = dynamic_cast<const CGArtifact *>(obj);
switch(artifactObject->storedArtifact->artType->aClass)
switch(artifactObject->storedArtifact->getType()->aClass)
{
case CArtifact::EartClass::ART_TREASURE:
return 2000;

View File

@ -46,10 +46,10 @@ void AINodeStorage::initialize(const PathfinderOptions & options, const CGameSta
for(pos.y=0; pos.y < sizes.y; ++pos.y)
{
const TerrainTile & tile = gs->map->getTile(pos);
if(!tile.terType->isPassable())
if(!tile.getTerrain()->isPassable())
continue;
if(tile.terType->isWater())
if(tile.getTerrain()->isWater())
{
resetTile(pos, ELayer::SAIL, PathfinderUtil::evaluateAccessibility<ELayer::SAIL>(pos, tile, fow, player, gs));
if(useFlying)

View File

@ -1180,7 +1180,7 @@ void VCAI::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance * ot
//FIXME: why are the above possible to be null?
bool emptySlotFound = false;
for(auto slot : artifact->artType->getPossibleSlots().at(target->bearerType()))
for(auto slot : artifact->getType()->getPossibleSlots().at(target->bearerType()))
{
if(target->isPositionFree(slot) && artifact->canBePutAt(target, slot, true)) //combined artifacts are not always allowed to move
{
@ -1193,7 +1193,7 @@ void VCAI::pickBestArtifacts(const CGHeroInstance * h, const CGHeroInstance * ot
}
if(!emptySlotFound) //try to put that atifact in already occupied slot
{
for(auto slot : artifact->artType->getPossibleSlots().at(target->bearerType()))
for(auto slot : artifact->getType()->getPossibleSlots().at(target->bearerType()))
{
auto otherSlot = target->getSlot(slot);
if(otherSlot && otherSlot->artifact) //we need to exchange artifact for better one
@ -2818,7 +2818,7 @@ bool shouldVisit(HeroPtr h, const CGObjectInstance * obj)
{
for(auto slot : h->Slots())
{
if(slot.second->type->hasUpgrades())
if(slot.second->getType()->hasUpgrades())
return true; //TODO: check price?
}
return false;

View File

@ -28,6 +28,13 @@
"vcmi.adventureMap.movementPointsHeroInfo" : "(Body pohybu: %REMAINING / %POINTS)",
"vcmi.adventureMap.replayOpponentTurnNotImplemented" : "Omlouváme se, přehrání tahu soupeře ještě není implementováno!",
"vcmi.bonusSource.artifact" : "Artefakt",
"vcmi.bonusSource.creature" : "Schopnost",
"vcmi.bonusSource.spell" : "Kouzlo",
"vcmi.bonusSource.hero" : "Hrdina",
"vcmi.bonusSource.commander" : "Velitel",
"vcmi.bonusSource.other" : "Ostatní",
"vcmi.capitalColors.0" : "Červený",
"vcmi.capitalColors.1" : "Modrý",
"vcmi.capitalColors.2" : "Hnědý",
@ -36,25 +43,25 @@
"vcmi.capitalColors.5" : "Fialový",
"vcmi.capitalColors.6" : "Tyrkysový",
"vcmi.capitalColors.7" : "Růžový",
"vcmi.heroOverview.startingArmy" : "Počáteční jednotky",
"vcmi.heroOverview.warMachine" : "Bojové stroje",
"vcmi.heroOverview.secondarySkills" : "Druhotné schopnosti",
"vcmi.heroOverview.spells" : "Kouzla",
"vcmi.quickExchange.moveUnit" : "Přesunout jednotku",
"vcmi.quickExchange.moveAllUnits" : "Přesunout všechny jednotky",
"vcmi.quickExchange.swapAllUnits" : "Vyměnit armády",
"vcmi.quickExchange.moveAllArtifacts" : "Přesunout všechny artefakty",
"vcmi.quickExchange.swapAllArtifacts" : "Vyměnit artefakt",
"vcmi.radialWheel.mergeSameUnit" : "Sloučit stejné jednotky",
"vcmi.radialWheel.fillSingleUnit" : "Vyplnit jednou jednotkou",
"vcmi.radialWheel.splitSingleUnit" : "Rozdělit jedinou jednotku",
"vcmi.radialWheel.splitUnitEqually" : "Rozdělit jednotky rovnoměrně",
"vcmi.radialWheel.moveUnit" : "Přesunout jednotky do jiného oddílu",
"vcmi.radialWheel.splitUnit" : "Rozdělit jednotku do jiné pozice",
"vcmi.radialWheel.heroGetArmy" : "Získat armádu jiného hrdiny",
"vcmi.radialWheel.heroSwapArmy" : "Vyměnit armádu s jiným hrdinou",
"vcmi.radialWheel.heroExchange" : "Otevřít výměnu hrdinů",
@ -66,7 +73,7 @@
"vcmi.radialWheel.moveUp" : "Posunout výše",
"vcmi.radialWheel.moveDown" : "Posunout níže",
"vcmi.radialWheel.moveBottom" : "Přesunout dolů",
"vcmi.randomMap.description" : "Mapa vytvořená Generátorem náhodných map.\nŠablona: %s, rozměry: %dx%d, úroveň: %d, hráči: %d, AI hráči: %d, množství vody: %s, síla jednotek: %s, VCMI mapa",
"vcmi.randomMap.description.isHuman" : ", %s je lidský hráč",
"vcmi.randomMap.description.townChoice" : ", volba města pro %s je %s",
@ -106,14 +113,20 @@
"vcmi.lobby.handicap.resource" : "Dává hráčům odpovídající zdroje navíc k běžným startovním zdrojům. Jsou povoleny záporné hodnoty, ale jsou omezeny na celkovou hodnotu 0 (hráč nikdy nezačíná se zápornými zdroji).",
"vcmi.lobby.handicap.income" : "Mění různé příjmy hráče podle procent. Výsledek je zaokrouhlen nahoru.",
"vcmi.lobby.handicap.growth" : "Mění rychlost růstu jednotel v městech vlastněných hráčem. Výsledek je zaokrouhlen nahoru.",
"vcmi.lobby.deleteUnsupportedSave" : "Nalezeny nepodporované uložené hry (např. z předchozích verzí).\n\nChcete je odstranit?",
"vcmi.lobby.deleteSaveGameTitle" : "Vyberte uloženou hru k odstranění",
"vcmi.lobby.deleteMapTitle" : "Vyberte scénář k odstranění",
"vcmi.lobby.deleteFile" : "Chcete smazat následující soubor?",
"vcmi.lobby.deleteFolder" : "Chcete smazat následující složku?",
"vcmi.lobby.deleteMode" : "Přepnout do režimu mazání a zpět",
"vcmi.lobby.login.title" : "Online lobby VCMI",
"vcmi.lobby.login.username" : "Uživatelské jméno:",
"vcmi.lobby.login.connecting" : "Připojování...",
"vcmi.lobby.login.error" : "Chyba při připojování: %s",
"vcmi.lobby.login.create" : "Nový účet",
"vcmi.lobby.login.login" : "Přihlásit se",
"vcmi.lobby.login.as" : "Přilásit se jako %s",
"vcmi.lobby.login.as" : "Přihlásit se jako %s",
"vcmi.lobby.header.rooms" : "Herní místnosti - %d",
"vcmi.lobby.header.channels" : "Kanály konverzace",
"vcmi.lobby.header.chat.global" : "Globální konverzace hry - %s", // %s -> language name
@ -175,9 +188,10 @@
"vcmi.server.errors.modsToEnable" : "{Následující modifikace jsou nutné pro načtení hry}",
"vcmi.server.errors.modsToDisable" : "{Následující modifikace musí být zakázány}",
"vcmi.server.errors.modNoDependency" : "Nelze načíst modifikaci {'%s'}!\n Závisí na modifikaci {'%s'}, která není aktivní!\n",
"vcmi.server.errors.modDependencyLoop" : "Nelze načíst modifikaci {'%s'}!\n Modifikace může být součástí (nepřímé) závislostní smyčky.",
"vcmi.server.errors.modConflict" : "Nelze načíst modifikaci {'%s'}!\n Je v kolizi s aktivní modifikací {'%s'}!\n",
"vcmi.server.errors.unknownEntity" : "Nelze načíst uloženou pozici! Neznámá entita '%s' nalezena v uložené pozici! Uložná pozice nemusí být kompatibilní s aktuálními verzemi modifikací!",
"vcmi.dimensionDoor.seaToLandError" : "Pomocí dimenzní brány není možné se teleportovat z moře na pevninu nebo naopak.",
"vcmi.settingsMainWindow.generalTab.hover" : "Obecné",
@ -323,13 +337,13 @@
"vcmi.battleWindow.damageEstimation.damage.1" : "%d poškození",
"vcmi.battleWindow.damageEstimation.kills" : "%d zahyne",
"vcmi.battleWindow.damageEstimation.kills.1" : "%d zahyne",
"vcmi.battleWindow.damageRetaliation.will" : "Provede odvetu ",
"vcmi.battleWindow.damageRetaliation.may" : "Může provést odvetu",
"vcmi.battleWindow.damageRetaliation.never" : "Neprovede odvetu.",
"vcmi.battleWindow.damageRetaliation.damage" : "(%DAMAGE).",
"vcmi.battleWindow.damageRetaliation.damageKills" : "(%DAMAGE, %KILLS).",
"vcmi.battleWindow.killed" : "Zabito",
"vcmi.battleWindow.accurateShot.resultDescription.0" : "%d %s bylo zabito přesnými zásahy!",
"vcmi.battleWindow.accurateShot.resultDescription.1" : "%d %s byl zabit přesným zásahem!",
@ -444,7 +458,7 @@
"vcmi.optionsTab.simturns.blocked1" : "Souběžně: 1 týden, setkání zablokována",
"vcmi.optionsTab.simturns.blocked2" : "Souběžně: 2 týdny, setkání zablokována",
"vcmi.optionsTab.simturns.blocked4" : "Souběžně: 1 měsíc, setkání zablokována",
// Translation note: translate strings below using form that is correct for "0 days", "1 day" and "2 days" in your language
// Using this information, VCMI will automatically select correct plural form for every possible amount
"vcmi.optionsTab.simturns.days.0" : " %d dní",
@ -488,7 +502,7 @@
"vcmi.stackExperience.rank.8" : "Elitní",
"vcmi.stackExperience.rank.9" : "Mistr",
"vcmi.stackExperience.rank.10" : "Eso",
// Strings for HotA Seer Hut / Quest Guards
"core.seerhut.quest.heroClass.complete.0" : "Ah, vy jste %s. Tady máte dárek. Přijmete ho?",
"core.seerhut.quest.heroClass.complete.1" : "Ah, vy jste %s. Tady máte dárek. Přijmete ho?",
@ -520,7 +534,7 @@
"core.seerhut.quest.heroClass.visit.3" : "Stráže zde povolí průchod pouze %s.",
"core.seerhut.quest.heroClass.visit.4" : "Stráže zde povolí průchod pouze %s.",
"core.seerhut.quest.heroClass.visit.5" : "Stráže zde povolí průchod pouze %s.",
"core.seerhut.quest.reachDate.complete.0" : "Jsem nyní volný. Tady máte, co jsem pro vás měl. Přijmete to?",
"core.seerhut.quest.reachDate.complete.1" : "Jsem nyní volný. Tady máte, co jsem pro vás měl. Přijmete to?",
"core.seerhut.quest.reachDate.complete.2" : "Jsem nyní volný. Tady máte, co jsem pro vás měl. Přijmete to?",
@ -552,6 +566,8 @@
"core.seerhut.quest.reachDate.visit.4" : "Zavřeno do %s.",
"core.seerhut.quest.reachDate.visit.5" : "Zavřeno do %s.",
"mapObject.core.hillFort.object.description" : "Zde můžeš vylepšit jednotky. Vylepšení jednotek úrovně 1 až 4 je zde levnější než v jejich domovském městě.",
"core.bonus.ADDITIONAL_ATTACK.name": "Dvojitý útok",
"core.bonus.ADDITIONAL_ATTACK.description": "Útočí dvakrát",
"core.bonus.ADDITIONAL_RETALIATION.name": "Další odvetné útoky",

View File

@ -707,6 +707,8 @@
"core.bonus.DISINTEGRATE.description": "No corpse remains after death",
"core.bonus.INVINCIBLE.name": "Invincible",
"core.bonus.INVINCIBLE.description": "Cannot be affected by anything",
"core.bonus.MECHANICAL.name": "Mechanical",
"core.bonus.MECHANICAL.description": "Immunity to many effects, repairable",
"core.bonus.PRISM_HEX_ATTACK_BREATH.name": "Prism Breath",
"core.bonus.PRISM_HEX_ATTACK_BREATH.description": "Prism Breath Attack (three directions)"
}

View File

@ -706,7 +706,10 @@
"core.bonus.DISINTEGRATE.description": "Nenhum corpo permanece após a morte",
"core.bonus.INVINCIBLE.name": "Invencível",
"core.bonus.INVINCIBLE.description": "Não pode ser afetado por nada",
"core.bonus.PRISM_HEX_ATTACK_BREATH.name" : "Sopro Prismático",
"core.bonus.PRISM_HEX_ATTACK_BREATH.description" : "Ataque de Sopro Prismático (três direções)",
"vcmi.server.errors.modDependencyLoop" : "Falha ao carregar o mod {'%s'}!\n Ele pode estar em um ciclo de dependência.",
"spell.core.castleMoat.name": "Fosso",
"spell.core.castleMoatTrigger.name": "Fosso",
"spell.core.catapultShot.name": "Disparo de Catapulta",

Some files were not shown because too many files have changed in this diff Show More