From ff1a635e9e9fa72896d236f63b20a8c8435e0c50 Mon Sep 17 00:00:00 2001 From: Dydzio Date: Wed, 26 Jul 2023 21:20:11 +0200 Subject: [PATCH 01/14] Unblock basic adventure map actions (scrolling / right-click) in multiplayer --- client/adventureMap/AdventureMapInterface.cpp | 2 +- client/adventureMap/AdventureMapShortcuts.cpp | 16 +++++++++++++++- client/adventureMap/AdventureMapShortcuts.h | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/client/adventureMap/AdventureMapInterface.cpp b/client/adventureMap/AdventureMapInterface.cpp index 5d9c0a276..fba871751 100644 --- a/client/adventureMap/AdventureMapInterface.cpp +++ b/client/adventureMap/AdventureMapInterface.cpp @@ -192,7 +192,7 @@ void AdventureMapInterface::handleMapScrollingUpdate(uint32_t timePassed) Point scrollDelta = scrollDirection * scrollDistance; bool cursorInScrollArea = scrollDelta != Point(0,0); - bool scrollingActive = cursorInScrollArea && isActive() && shortcuts->optionSidePanelActive() && !scrollingWasBlocked; + bool scrollingActive = cursorInScrollArea && shortcuts->optionMapScrollingActive() && !scrollingWasBlocked; bool scrollingBlocked = GH.isKeyboardCtrlDown() || !settings["adventure"]["borderScroll"].Bool(); if (!scrollingWasActive && scrollingBlocked) diff --git a/client/adventureMap/AdventureMapShortcuts.cpp b/client/adventureMap/AdventureMapShortcuts.cpp index 722814d08..1892ef448 100644 --- a/client/adventureMap/AdventureMapShortcuts.cpp +++ b/client/adventureMap/AdventureMapShortcuts.cpp @@ -36,6 +36,14 @@ #include "../../lib/mapping/CMap.h" #include "../../lib/pathfinder/CGPathNode.h" +bool isCurrentPlayerHuman() +{ + PlayerColor currentPlayer = LOCPLINT->cb->getCurrentPlayer(); + bool isHuman = LOCPLINT->cb->getStartInfo()->playerInfos.count(currentPlayer) + && LOCPLINT->cb->getStartInfo()->playerInfos.at(currentPlayer).isControlledByHuman(); + return isHuman; +} + AdventureMapShortcuts::AdventureMapShortcuts(AdventureMapInterface & owner) : owner(owner) , state(EAdventureState::NOT_INITIALIZED) @@ -461,7 +469,13 @@ bool AdventureMapShortcuts::optionSidePanelActive() return state == EAdventureState::MAKING_TURN || state == EAdventureState::WORLD_VIEW; } +bool AdventureMapShortcuts::optionMapScrollingActive() +{ + return state == EAdventureState::MAKING_TURN || state == EAdventureState::WORLD_VIEW || (state == EAdventureState::ENEMY_TURN && isCurrentPlayerHuman()); +} + bool AdventureMapShortcuts::optionMapViewActive() { - return state == EAdventureState::MAKING_TURN || state == EAdventureState::WORLD_VIEW || state == EAdventureState::CASTING_SPELL; + return state == EAdventureState::MAKING_TURN || state == EAdventureState::WORLD_VIEW || state == EAdventureState::CASTING_SPELL + || (state == EAdventureState::ENEMY_TURN && isCurrentPlayerHuman()); } diff --git a/client/adventureMap/AdventureMapShortcuts.h b/client/adventureMap/AdventureMapShortcuts.h index 770e40fa2..8e86779a7 100644 --- a/client/adventureMap/AdventureMapShortcuts.h +++ b/client/adventureMap/AdventureMapShortcuts.h @@ -81,6 +81,7 @@ public: bool optionInMapView(); bool optionInWorldView(); bool optionSidePanelActive(); + bool optionMapScrollingActive(); bool optionMapViewActive(); void setState(EAdventureState newState); From 72210afc926a386639a115063d0ebe8a64d45400 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Thu, 27 Jul 2023 15:51:38 +0300 Subject: [PATCH 02/14] Do not attempt to reset movement for inactive heroes in pool --- lib/gameState/TavernHeroesPool.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/gameState/TavernHeroesPool.cpp b/lib/gameState/TavernHeroesPool.cpp index 895c052e2..f5e5a6138 100644 --- a/lib/gameState/TavernHeroesPool.cpp +++ b/lib/gameState/TavernHeroesPool.cpp @@ -109,12 +109,18 @@ CGHeroInstance * TavernHeroesPool::takeHeroFromPool(HeroTypeID hero) void TavernHeroesPool::onNewDay() { + auto unusedHeroes = unusedHeroesFromPool(); + for(auto & hero : heroesPool) { assert(hero.second); if(!hero.second) continue; + // do not access heroes who are not present in tavern of any players + if (vstd::contains(unusedHeroes, hero.first)) + continue; + hero.second->setMovementPoints(hero.second->movementPointsLimit(true)); hero.second->mana = hero.second->manaLimit(); } From 0b5cea032028caad42fb85e00cdc4e42a61b7669 Mon Sep 17 00:00:00 2001 From: Dydzio Date: Thu, 27 Jul 2023 17:26:52 +0200 Subject: [PATCH 03/14] Use new adventure map state to detect opponent human turn --- client/adventureMap/AdventureMapInterface.cpp | 2 +- client/adventureMap/AdventureMapShortcuts.cpp | 12 ++---------- client/adventureMap/AdventureState.h | 3 ++- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/client/adventureMap/AdventureMapInterface.cpp b/client/adventureMap/AdventureMapInterface.cpp index fba871751..0f7ef98e2 100644 --- a/client/adventureMap/AdventureMapInterface.cpp +++ b/client/adventureMap/AdventureMapInterface.cpp @@ -323,7 +323,7 @@ void AdventureMapInterface::onEnemyTurnStarted(PlayerColor playerID, bool isHuma mapAudio->onEnemyTurnStarted(); widget->getMinimap()->setAIRadar(!isHuman); widget->getInfoBar()->startEnemyTurn(LOCPLINT->cb->getCurrentPlayer()); - setState(EAdventureState::ENEMY_TURN); + setState(isHuman ? EAdventureState::OTHER_HUMAN_PLAYER_TURN : EAdventureState::AI_PLAYER_TURN); } void AdventureMapInterface::setState(EAdventureState state) diff --git a/client/adventureMap/AdventureMapShortcuts.cpp b/client/adventureMap/AdventureMapShortcuts.cpp index 1892ef448..3fb44f0dc 100644 --- a/client/adventureMap/AdventureMapShortcuts.cpp +++ b/client/adventureMap/AdventureMapShortcuts.cpp @@ -36,14 +36,6 @@ #include "../../lib/mapping/CMap.h" #include "../../lib/pathfinder/CGPathNode.h" -bool isCurrentPlayerHuman() -{ - PlayerColor currentPlayer = LOCPLINT->cb->getCurrentPlayer(); - bool isHuman = LOCPLINT->cb->getStartInfo()->playerInfos.count(currentPlayer) - && LOCPLINT->cb->getStartInfo()->playerInfos.at(currentPlayer).isControlledByHuman(); - return isHuman; -} - AdventureMapShortcuts::AdventureMapShortcuts(AdventureMapInterface & owner) : owner(owner) , state(EAdventureState::NOT_INITIALIZED) @@ -471,11 +463,11 @@ bool AdventureMapShortcuts::optionSidePanelActive() bool AdventureMapShortcuts::optionMapScrollingActive() { - return state == EAdventureState::MAKING_TURN || state == EAdventureState::WORLD_VIEW || (state == EAdventureState::ENEMY_TURN && isCurrentPlayerHuman()); + return state == EAdventureState::MAKING_TURN || state == EAdventureState::WORLD_VIEW || (state == EAdventureState::OTHER_HUMAN_PLAYER_TURN); } bool AdventureMapShortcuts::optionMapViewActive() { return state == EAdventureState::MAKING_TURN || state == EAdventureState::WORLD_VIEW || state == EAdventureState::CASTING_SPELL - || (state == EAdventureState::ENEMY_TURN && isCurrentPlayerHuman()); + || (state == EAdventureState::OTHER_HUMAN_PLAYER_TURN); } diff --git a/client/adventureMap/AdventureState.h b/client/adventureMap/AdventureState.h index 628e8f976..32bfc2e2d 100644 --- a/client/adventureMap/AdventureState.h +++ b/client/adventureMap/AdventureState.h @@ -14,7 +14,8 @@ enum class EAdventureState NOT_INITIALIZED, HOTSEAT_WAIT, MAKING_TURN, - ENEMY_TURN, + AI_PLAYER_TURN, + OTHER_HUMAN_PLAYER_TURN, CASTING_SPELL, WORLD_VIEW }; From b8110218c07acfb97380ee142ab632c27a7d961c Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Thu, 27 Jul 2023 18:39:05 +0300 Subject: [PATCH 04/14] Silence unnecessary warning on flagging guarded garrison --- server/CQuery.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/CQuery.cpp b/server/CQuery.cpp index dfa0c8848..1d0a7d7b3 100644 --- a/server/CQuery.cpp +++ b/server/CQuery.cpp @@ -176,7 +176,7 @@ void CObjectVisitQuery::onExposure(QueryPtr topQuery) if(gh->isValidObject(visitedObject)) topQuery->notifyObjectAboutRemoval(*this); - owner->popQuery(*this); + owner->popIfTop(*this); } void Queries::popQuery(PlayerColor player, QueryPtr query) From aed8c411fc38f153ba5caf02abb4585283a4ee95 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Thu, 27 Jul 2023 18:40:47 +0300 Subject: [PATCH 05/14] Minor rework & cleanup of combat replays --- AI/BattleAI/BattleAI.cpp | 2 +- AI/BattleAI/BattleAI.h | 2 +- AI/Nullkiller/AIGateway.cpp | 22 ++++++++++-------- AI/Nullkiller/AIGateway.h | 2 +- AI/StupidAI/StupidAI.cpp | 2 +- AI/StupidAI/StupidAI.h | 2 +- AI/VCAI/VCAI.cpp | 20 ++++++++++------- AI/VCAI/VCAI.h | 2 +- client/CPlayerInterface.cpp | 34 +++++++++++++--------------- client/CPlayerInterface.h | 4 +--- client/Client.cpp | 2 +- client/battle/BattleWindow.cpp | 2 +- config/schemas/settings.json | 4 ++-- lib/CGameInterface.cpp | 4 ++-- lib/CGameInterface.h | 2 +- lib/IGameEventsReceiver.h | 2 +- lib/battle/BattleInfo.cpp | 1 + lib/battle/BattleInfo.h | 5 +++++ lib/serializer/CSerializer.h | 2 +- server/CGameHandler.cpp | 41 ++++++++++++++++++++++------------ 20 files changed, 90 insertions(+), 67 deletions(-) diff --git a/AI/BattleAI/BattleAI.cpp b/AI/BattleAI/BattleAI.cpp index 8c4fb4178..d3c4ba13c 100644 --- a/AI/BattleAI/BattleAI.cpp +++ b/AI/BattleAI/BattleAI.cpp @@ -826,7 +826,7 @@ void CBattleAI::evaluateCreatureSpellcast(const CStack * stack, PossibleSpellcas ps.value = totalGain; } -void CBattleAI::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool Side) +void CBattleAI::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool Side, bool replayAllowed) { LOG_TRACE(logAi); side = Side; diff --git a/AI/BattleAI/BattleAI.h b/AI/BattleAI/BattleAI.h index d9c932f1e..37338d299 100644 --- a/AI/BattleAI/BattleAI.h +++ b/AI/BattleAI/BattleAI.h @@ -83,7 +83,7 @@ public: BattleAction selectStackAction(const CStack * stack); std::optional findBestCreatureSpell(const CStack *stack); - void battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool Side) override; + void battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool Side, bool replayAllowed) override; //void actionFinished(const BattleAction &action) override;//occurs AFTER every action taken by any stack or by the hero //void actionStarted(const BattleAction &action) override;//occurs BEFORE every action taken by any stack or by the hero //void battleAttack(const BattleAttack *ba) override; //called when stack is performing attack diff --git a/AI/Nullkiller/AIGateway.cpp b/AI/Nullkiller/AIGateway.cpp index 091dbe407..16cd34849 100644 --- a/AI/Nullkiller/AIGateway.cpp +++ b/AI/Nullkiller/AIGateway.cpp @@ -809,7 +809,7 @@ void AIGateway::makeTurn() for (auto h : cb->getHeroesInfo()) { if (h->movementPointsRemaining()) - logAi->warn("Hero %s has %d MP left", h->getNameTranslated(), h->movementPointsRemaining()); + logAi->info("Hero %s has %d MP left", h->getNameTranslated(), h->movementPointsRemaining()); } #if NKAI_TRACE_LEVEL == 0 } @@ -1065,14 +1065,14 @@ void AIGateway::recruitCreatures(const CGDwelling * d, const CArmedInstance * re } } -void AIGateway::battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side) +void AIGateway::battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side, bool replayAllowed) { NET_EVENT_HANDLER; assert(playerID > PlayerColor::PLAYER_LIMIT || status.getBattle() == UPCOMING_BATTLE); status.setBattle(ONGOING_BATTLE); const CGObjectInstance * presumedEnemy = vstd::backOrNull(cb->getVisitableObjs(tile)); //may be nullptr in some very are cases -> eg. visited monolith and fighting with an enemy at the FoW covered exit battlename = boost::str(boost::format("Starting battle of %s attacking %s at %s") % (hero1 ? hero1->getNameTranslated() : "a army") % (presumedEnemy ? presumedEnemy->getObjectName() : "unknown enemy") % tile.toString()); - CAdventureAI::battleStart(army1, army2, tile, hero1, hero2, side); + CAdventureAI::battleStart(army1, army2, tile, hero1, hero2, side, replayAllowed); } void AIGateway::battleEnd(const BattleResult * br, QueryID queryID) @@ -1083,12 +1083,16 @@ void AIGateway::battleEnd(const BattleResult * br, QueryID queryID) bool won = br->winner == myCb->battleGetMySide(); logAi->debug("Player %d (%s): I %s the %s!", playerID, playerID.getStr(), (won ? "won" : "lost"), battlename); battlename.clear(); - status.addQuery(queryID, "Combat result dialog"); - const int confirmAction = 0; - requestActionASAP([=]() + + if (queryID != -1) { - answerQuery(queryID, confirmAction); - }); + status.addQuery(queryID, "Combat result dialog"); + const int confirmAction = 0; + requestActionASAP([=]() + { + answerQuery(queryID, confirmAction); + }); + } CAdventureAI::battleEnd(br, queryID); } @@ -1175,7 +1179,7 @@ bool AIGateway::moveHeroToTile(int3 dst, HeroPtr h) if(startHpos == dst) { //FIXME: this assertion fails also if AI moves onto defeated guarded object - assert(cb->getVisitableObjs(dst).size() > 1); //there's no point in revisiting tile where there is no visitable object + //assert(cb->getVisitableObjs(dst).size() > 1); //there's no point in revisiting tile where there is no visitable object cb->moveHero(*h, h->convertFromVisitablePos(dst)); afterMovementCheck(); // TODO: is it feasible to hero get killed there if game work properly? // If revisiting, teleport probing is never done, and so the entries into the list would remain unused and uncleared diff --git a/AI/Nullkiller/AIGateway.h b/AI/Nullkiller/AIGateway.h index a29197b9e..cab6ce797 100644 --- a/AI/Nullkiller/AIGateway.h +++ b/AI/Nullkiller/AIGateway.h @@ -169,7 +169,7 @@ public: void showWorldViewEx(const std::vector & objectPositions, bool showTerrain) override; std::optional makeSurrenderRetreatDecision(const BattleStateInfoForRetreat & battleState) override; - void battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side) override; + void battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side, bool replayAllowed) override; void battleEnd(const BattleResult * br, QueryID queryID) override; void makeTurn(); diff --git a/AI/StupidAI/StupidAI.cpp b/AI/StupidAI/StupidAI.cpp index 415ce5a2c..85a9fe571 100644 --- a/AI/StupidAI/StupidAI.cpp +++ b/AI/StupidAI/StupidAI.cpp @@ -242,7 +242,7 @@ void CStupidAI::battleStacksEffectsSet(const SetStackEffect & sse) print("battleStacksEffectsSet called"); } -void CStupidAI::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool Side) +void CStupidAI::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool Side, bool replayAllowed) { print("battleStart called"); side = Side; diff --git a/AI/StupidAI/StupidAI.h b/AI/StupidAI/StupidAI.h index afb0f56a6..3b074d643 100644 --- a/AI/StupidAI/StupidAI.h +++ b/AI/StupidAI/StupidAI.h @@ -44,7 +44,7 @@ public: void battleSpellCast(const BattleSpellCast *sc) override; void battleStacksEffectsSet(const SetStackEffect & sse) override;//called when a specific effect is set to stacks //void battleTriggerEffect(const BattleTriggerEffect & bte) override; - void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side) override; //called by engine when battle starts; side=0 - left, side=1 - right + void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side, bool replayAllowed) override; //called by engine when battle starts; side=0 - left, side=1 - right void battleCatapultAttacked(const CatapultAttack & ca) override; //called when catapult makes an attack private: diff --git a/AI/VCAI/VCAI.cpp b/AI/VCAI/VCAI.cpp index cdaa021ab..c3bd49b6d 100644 --- a/AI/VCAI/VCAI.cpp +++ b/AI/VCAI/VCAI.cpp @@ -819,7 +819,7 @@ void VCAI::makeTurn() for (auto h : cb->getHeroesInfo()) { if (h->movementPointsRemaining()) - logAi->warn("Hero %s has %d MP left", h->getNameTranslated(), h->movementPointsRemaining()); + logAi->info("Hero %s has %d MP left", h->getNameTranslated(), h->movementPointsRemaining()); } } catch (boost::thread_interrupted & e) @@ -1575,14 +1575,14 @@ void VCAI::completeGoal(Goals::TSubgoal goal) } -void VCAI::battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side) +void VCAI::battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side, bool replayAllowed) { NET_EVENT_HANDLER; assert(playerID > PlayerColor::PLAYER_LIMIT || status.getBattle() == UPCOMING_BATTLE); status.setBattle(ONGOING_BATTLE); const CGObjectInstance * presumedEnemy = vstd::backOrNull(cb->getVisitableObjs(tile)); //may be nullptr in some very are cases -> eg. visited monolith and fighting with an enemy at the FoW covered exit battlename = boost::str(boost::format("Starting battle of %s attacking %s at %s") % (hero1 ? hero1->getNameTranslated() : "a army") % (presumedEnemy ? presumedEnemy->getObjectName() : "unknown enemy") % tile.toString()); - CAdventureAI::battleStart(army1, army2, tile, hero1, hero2, side); + CAdventureAI::battleStart(army1, army2, tile, hero1, hero2, side, replayAllowed); } void VCAI::battleEnd(const BattleResult * br, QueryID queryID) @@ -1593,12 +1593,16 @@ void VCAI::battleEnd(const BattleResult * br, QueryID queryID) bool won = br->winner == myCb->battleGetMySide(); logAi->debug("Player %d (%s): I %s the %s!", playerID, playerID.getStr(), (won ? "won" : "lost"), battlename); battlename.clear(); - status.addQuery(queryID, "Combat result dialog"); - const int confirmAction = 0; - requestActionASAP([=]() + + if (queryID != -1) { - answerQuery(queryID, confirmAction); - }); + status.addQuery(queryID, "Combat result dialog"); + const int confirmAction = 0; + requestActionASAP([=]() + { + answerQuery(queryID, confirmAction); + }); + } CAdventureAI::battleEnd(br, queryID); } diff --git a/AI/VCAI/VCAI.h b/AI/VCAI/VCAI.h index a932d8702..7d57ad681 100644 --- a/AI/VCAI/VCAI.h +++ b/AI/VCAI/VCAI.h @@ -201,7 +201,7 @@ public: void showMarketWindow(const IMarket * market, const CGHeroInstance * visitor) override; void showWorldViewEx(const std::vector & objectPositions, bool showTerrain) override; - void battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side) override; + void battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side, bool replayAllowed) override; void battleEnd(const BattleResult * br, QueryID queryID) override; void makeTurn(); diff --git a/client/CPlayerInterface.cpp b/client/CPlayerInterface.cpp index 12d4021ca..69fde8c7b 100644 --- a/client/CPlayerInterface.cpp +++ b/client/CPlayerInterface.cpp @@ -652,26 +652,20 @@ void CPlayerInterface::battleStartBefore(const CCreatureSet *army1, const CCreat waitForAllDialogs(); } -void CPlayerInterface::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side) +void CPlayerInterface::battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side, bool replayAllowed) { EVENT_HANDLER_CALLED_BY_CLIENT; - bool autoBattleResultRefused = (lastBattleArmies.first == army1 && lastBattleArmies.second == army2); - lastBattleArmies.first = army1; - lastBattleArmies.second = army2; - //quick combat with neutral creatures only - auto * army2_object = dynamic_cast(army2); - if((!autoBattleResultRefused && !allowBattleReplay && army2_object - && (army2_object->getOwner() == PlayerColor::UNFLAGGABLE || army2_object->getOwner() == PlayerColor::NEUTRAL) - && settings["adventure"]["quickCombat"].Bool()) - || settings["adventure"]["alwaysSkipCombat"].Bool()) + + bool useQuickCombat = settings["adventure"]["quickCombat"].Bool(); + bool forceQuickCombat = settings["adventure"]["forceQuickCombat"].Bool(); + + if ((replayAllowed && useQuickCombat) || forceQuickCombat) { autofightingAI = CDynLibHandler::getNewBattleAI(settings["server"]["friendlyAI"].String()); autofightingAI->initBattleInterface(env, cb); - autofightingAI->battleStart(army1, army2, int3(0,0,0), hero1, hero2, side); + autofightingAI->battleStart(army1, army2, tile, hero1, hero2, side, false); isAutoFightOn = true; cb->registerBattleInterface(autofightingAI); - // Player shouldn't be able to move on adventure map if quick combat is going - allowBattleReplay = true; } //Don't wait for dialogs when we are non-active hot-seat player @@ -843,13 +837,17 @@ void CPlayerInterface::battleEnd(const BattleResult *br, QueryID queryID) if(!battleInt) { - bool allowManualReplay = allowBattleReplay && !settings["adventure"]["alwaysSkipCombat"].Bool(); - allowBattleReplay = false; + bool allowManualReplay = queryID != -1; + auto wnd = std::make_shared(*br, *this, allowManualReplay); - wnd->resultCallback = [=](ui32 selection) + + if (allowManualReplay) { - cb->selectionMade(selection, queryID); - }; + wnd->resultCallback = [=](ui32 selection) + { + cb->selectionMade(selection, queryID); + }; + } GH.windows().pushWindow(wnd); // #1490 - during AI turn when quick combat is on, we need to display the message and wait for user to close it. // Otherwise NewTurn causes freeze. diff --git a/client/CPlayerInterface.h b/client/CPlayerInterface.h index 39a23c798..d4372ec5f 100644 --- a/client/CPlayerInterface.h +++ b/client/CPlayerInterface.h @@ -65,8 +65,6 @@ class CPlayerInterface : public CGameInterface, public IUpdateable int firstCall; int autosaveCount; - std::pair lastBattleArmies; - bool allowBattleReplay = false; std::list> dialogs; //queue of dialogs awaiting to be shown (not currently shown!) const BattleAction *curAction; //during the battle - action currently performed by active stack (or nullptr) @@ -169,7 +167,7 @@ protected: // Call-ins from server, should not be called directly, but only via void battleTriggerEffect(const BattleTriggerEffect & bte) override; //various one-shot effect void battleStacksAttacked(const std::vector & bsa, bool ranged) override; void battleStartBefore(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2) override; //called by engine just before battle starts; side=0 - left, side=1 - right - void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side) override; //called by engine when battle starts; side=0 - left, side=1 - right + void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side, bool replayAllowed) override; //called by engine when battle starts; side=0 - left, side=1 - right void battleUnitsChanged(const std::vector & units) override; void battleObstaclesChanged(const std::vector & obstacles) override; void battleCatapultAttacked(const CatapultAttack & ca) override; //called when catapult makes an attack diff --git a/client/Client.cpp b/client/Client.cpp index 5cee41b88..35e7c1649 100644 --- a/client/Client.cpp +++ b/client/Client.cpp @@ -580,7 +580,7 @@ void CClient::battleStarted(const BattleInfo * info) auto callBattleStart = [&](PlayerColor color, ui8 side) { if(vstd::contains(battleints, color)) - battleints[color]->battleStart(leftSide.armyObject, rightSide.armyObject, info->tile, leftSide.hero, rightSide.hero, side); + battleints[color]->battleStart(leftSide.armyObject, rightSide.armyObject, info->tile, leftSide.hero, rightSide.hero, side, info->replayAllowed); }; callBattleStart(leftSide.color, 0); diff --git a/client/battle/BattleWindow.cpp b/client/battle/BattleWindow.cpp index 240106a31..ac99ee935 100644 --- a/client/battle/BattleWindow.cpp +++ b/client/battle/BattleWindow.cpp @@ -501,7 +501,7 @@ void BattleWindow::bAutofightf() auto ai = CDynLibHandler::getNewBattleAI(settings["server"]["friendlyAI"].String()); ai->initBattleInterface(owner.curInt->env, owner.curInt->cb); - ai->battleStart(owner.army1, owner.army2, int3(0,0,0), owner.attackingHeroInstance, owner.defendingHeroInstance, owner.curInt->cb->battleGetMySide()); + ai->battleStart(owner.army1, owner.army2, int3(0,0,0), owner.attackingHeroInstance, owner.defendingHeroInstance, owner.curInt->cb->battleGetMySide(), false); owner.curInt->autofightingAI = ai; owner.curInt->cb->registerBattleInterface(ai); diff --git a/config/schemas/settings.json b/config/schemas/settings.json index ef234a135..41d41644a 100644 --- a/config/schemas/settings.json +++ b/config/schemas/settings.json @@ -223,7 +223,7 @@ "type" : "object", "additionalProperties" : false, "default" : {}, - "required" : [ "heroMoveTime", "enemyMoveTime", "scrollSpeedPixels", "heroReminder", "quickCombat", "objectAnimation", "terrainAnimation", "alwaysSkipCombat", "borderScroll", "leftButtonDrag" ], + "required" : [ "heroMoveTime", "enemyMoveTime", "scrollSpeedPixels", "heroReminder", "quickCombat", "objectAnimation", "terrainAnimation", "forceQuickCombat", "borderScroll", "leftButtonDrag" ], "properties" : { "heroMoveTime" : { "type" : "number", @@ -253,7 +253,7 @@ "type" : "boolean", "default" : true }, - "alwaysSkipCombat" : { + "forceQuickCombat" : { "type" : "boolean", "default" : false }, diff --git a/lib/CGameInterface.cpp b/lib/CGameInterface.cpp index c499207e0..5b052d3c8 100644 --- a/lib/CGameInterface.cpp +++ b/lib/CGameInterface.cpp @@ -168,13 +168,13 @@ void CAdventureAI::battleCatapultAttacked(const CatapultAttack & ca) } void CAdventureAI::battleStart(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, - const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side) + const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool side, bool replayAllowed) { assert(!battleAI); assert(cbc); battleAI = CDynLibHandler::getNewBattleAI(getBattleAIName()); battleAI->initBattleInterface(env, cbc); - battleAI->battleStart(army1, army2, tile, hero1, hero2, side); + battleAI->battleStart(army1, army2, tile, hero1, hero2, side, replayAllowed); } void CAdventureAI::battleStacksAttacked(const std::vector & bsa, bool ranged) diff --git a/lib/CGameInterface.h b/lib/CGameInterface.h index 3b59b69b0..3ee27c21a 100644 --- a/lib/CGameInterface.h +++ b/lib/CGameInterface.h @@ -149,7 +149,7 @@ public: virtual void yourTacticPhase(int distance) override; virtual void battleNewRound(int round) override; virtual void battleCatapultAttacked(const CatapultAttack & ca) override; - virtual void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side) override; + virtual void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side, bool replayAllowed) override; virtual void battleStacksAttacked(const std::vector & bsa, bool ranged) override; virtual void actionStarted(const BattleAction &action) override; virtual void battleNewRoundFirst(int round) override; diff --git a/lib/IGameEventsReceiver.h b/lib/IGameEventsReceiver.h index af2132060..8d85df35e 100644 --- a/lib/IGameEventsReceiver.h +++ b/lib/IGameEventsReceiver.h @@ -69,7 +69,7 @@ public: virtual void battleStacksEffectsSet(const SetStackEffect & sse){};//called when a specific effect is set to stacks virtual void battleTriggerEffect(const BattleTriggerEffect & bte){}; //called for various one-shot effects virtual void battleStartBefore(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2) {}; //called just before battle start - virtual void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side){}; //called by engine when battle starts; side=0 - left, side=1 - right + virtual void battleStart(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool side, bool replayAllowed){}; //called by engine when battle starts; side=0 - left, side=1 - right virtual void battleUnitsChanged(const std::vector & units){}; virtual void battleObstaclesChanged(const std::vector & obstacles){}; virtual void battleCatapultAttacked(const CatapultAttack & ca){}; //called when catapult makes an attack diff --git a/lib/battle/BattleInfo.cpp b/lib/battle/BattleInfo.cpp index 861e45c52..b2d5cd3a8 100644 --- a/lib/battle/BattleInfo.cpp +++ b/lib/battle/BattleInfo.cpp @@ -207,6 +207,7 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const curB->round = -2; curB->activeStack = -1; curB->creatureBank = creatureBank; + curB->replayAllowed = false; if(town) { diff --git a/lib/battle/BattleInfo.h b/lib/battle/BattleInfo.h index 7d1361fee..e875cadfa 100644 --- a/lib/battle/BattleInfo.h +++ b/lib/battle/BattleInfo.h @@ -36,6 +36,7 @@ public: const CGTownInstance * town; //used during town siege, nullptr if this is not a siege (note that fortless town IS also a siege) int3 tile; //for background and bonuses bool creatureBank; //auxilary field, do not serialize + bool replayAllowed; std::vector stacks; std::vector > obstacles; SiegeInfo si; @@ -61,6 +62,10 @@ public: h & tacticsSide; h & tacticDistance; h & static_cast(*this); + if (version > 824) + h & replayAllowed; + else + replayAllowed = false; } ////////////////////////////////////////////////////////////////////////// diff --git a/lib/serializer/CSerializer.h b/lib/serializer/CSerializer.h index 62e76c9a2..926d73b6c 100644 --- a/lib/serializer/CSerializer.h +++ b/lib/serializer/CSerializer.h @@ -14,7 +14,7 @@ VCMI_LIB_NAMESPACE_BEGIN -const ui32 SERIALIZATION_VERSION = 824; +const ui32 SERIALIZATION_VERSION = 825; const ui32 MINIMAL_SERIALIZATION_VERSION = 824; const std::string SAVEGAME_MAGIC = "VCMISVG"; diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 9df39108a..12d8d6716 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -607,9 +607,15 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance * heroAttacker, con const int queriedPlayers = battleQuery ? (int)boost::count(queries.allQueries(), battleQuery) : 0; finishingBattle = std::make_unique(battleQuery, queriedPlayers); - auto battleDialogQuery = std::make_shared(this, gs->curB); - battleResult.data->queryID = battleDialogQuery->queryID; - queries.addQuery(battleDialogQuery); + // in battles against neutrals, 1st player can ask to replay battle manually + if (!gs->curB->sides[1].color.isValidPlayer()) + { + auto battleDialogQuery = std::make_shared(this, gs->curB); + battleResult.data->queryID = battleDialogQuery->queryID; + queries.addQuery(battleDialogQuery); + } + else + battleResult.data->queryID = -1; //set same battle result for all queries for(auto q : queries.allQueries()) @@ -620,6 +626,9 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance * heroAttacker, con } sendAndApply(battleResult.data); //after this point casualties objects are destroyed + + if (battleResult.data->queryID == -1) + endBattleConfirm(gs->curB); } void CGameHandler::endBattleConfirm(const BattleInfo * battleInfo) @@ -2118,6 +2127,10 @@ void CGameHandler::setupBattle(int3 tile, const CArmedInstance *armies[2], const //send info about battles BattleStart bs; bs.info = BattleInfo::setupBattle(tile, terrain, terType, armies, heroes, creatureBank, town); + + auto lastBattleQuery = std::dynamic_pointer_cast(queries.topQuery(bs.info->sides[0].color)); + bs.info->replayAllowed = lastBattleQuery == nullptr && !bs.info->sides[1].color.isValidPlayer(); + sendAndApply(&bs); } @@ -2587,39 +2600,39 @@ void CGameHandler::startBattlePrimary(const CArmedInstance *army1, const CArmedI heroes[0] = hero1; heroes[1] = hero2; - setupBattle(tile, armies, heroes, creatureBank, town); //initializes stacks, places creatures on battlefield, blocks and informs player interfaces + auto lastBattleQuery = std::dynamic_pointer_cast(queries.topQuery(gs->curB->sides[0].color)); + //existing battle query for retying auto-combat - auto battleQuery = std::dynamic_pointer_cast(queries.topQuery(gs->curB->sides[0].color)); - if(battleQuery) + if(lastBattleQuery) { for(int i : {0, 1}) { if(heroes[i]) { SetMana restoreInitialMana; - restoreInitialMana.val = battleQuery->initialHeroMana[i]; + restoreInitialMana.val = lastBattleQuery->initialHeroMana[i]; restoreInitialMana.hid = heroes[i]->id; sendAndApply(&restoreInitialMana); } } - battleQuery->bi = gs->curB; - battleQuery->result = std::nullopt; - battleQuery->belligerents[0] = gs->curB->sides[0].armyObject; - battleQuery->belligerents[1] = gs->curB->sides[1].armyObject; + lastBattleQuery->bi = gs->curB; + lastBattleQuery->result = std::nullopt; + lastBattleQuery->belligerents[0] = gs->curB->sides[0].armyObject; + lastBattleQuery->belligerents[1] = gs->curB->sides[1].armyObject; } - battleQuery = std::make_shared(this, gs->curB); + auto nextBattleQuery = std::make_shared(this, gs->curB); for(int i : {0, 1}) { if(heroes[i]) { - battleQuery->initialHeroMana[i] = heroes[i]->mana; + nextBattleQuery->initialHeroMana[i] = heroes[i]->mana; } } - queries.addQuery(battleQuery); + queries.addQuery(nextBattleQuery); this->battleThread = std::make_unique(boost::thread(&CGameHandler::runBattle, this)); } From 917229b9881a1e58959a6c027bd986c10ffd2300 Mon Sep 17 00:00:00 2001 From: heroesiiifan <77574150+heroesiiifan@users.noreply.github.com> Date: Fri, 28 Jul 2023 00:29:57 +0000 Subject: [PATCH 06/14] Update Languages.h --- lib/Languages.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Languages.h b/lib/Languages.h index 245430857..6bcd7c618 100644 --- a/lib/Languages.h +++ b/lib/Languages.h @@ -30,6 +30,7 @@ enum class ELanguages SWEDISH, TURKISH, UKRAINIAN, + VIETNAMESE, // Pseudo-languages, that have no translations but can define H3 encoding to use OTHER_CP1250, @@ -80,6 +81,7 @@ inline const auto & getLanguageList() { "swedish", "Swedish", "Svenska", "CP1252", "sv", true }, { "turkish", "Turkish", "Türkçe", "CP1254", "tr", true }, { "ukrainian", "Ukrainian", "Українська", "CP1251", "uk", true }, + { "vietnamese", "Vietnamese", "Tiếng Việt", "UTF-8", "vi", true }, // Fan translation uses special encoding { "other_cp1250", "Other (East European)", "", "CP1250", "", false }, { "other_cp1251", "Other (Cyrillic Script)", "", "CP1251", "", false }, From 840d5afe179b8dd6b6b32be28607f117bb27f77f Mon Sep 17 00:00:00 2001 From: heroesiiifan <77574150+heroesiiifan@users.noreply.github.com> Date: Fri, 28 Jul 2023 00:31:07 +0000 Subject: [PATCH 07/14] Update languages.cpp --- launcher/languages.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/languages.cpp b/launcher/languages.cpp index 8c7174df3..670faa345 100644 --- a/launcher/languages.cpp +++ b/launcher/languages.cpp @@ -18,7 +18,7 @@ #include // list of language names, for generation of translations. Do not use directly, use Languages namespace instead -static const std::array languageTranslatedNamesGenerator = { +static const std::array languageTranslatedNamesGenerator = { { QT_TRANSLATE_NOOP("Language", "Czech"), QT_TRANSLATE_NOOP("Language", "Chinese"), @@ -36,6 +36,7 @@ static const std::array languageTranslatedNamesGenerator = { QT_TRANSLATE_NOOP("Language", "Swedish"), QT_TRANSLATE_NOOP("Language", "Turkish"), QT_TRANSLATE_NOOP("Language", "Ukrainian"), + QT_TRANSLATE_NOOP("Language", "Vietnamese"), QT_TRANSLATE_NOOP("Language", "Other (East European)"), QT_TRANSLATE_NOOP("Language", "Other (Cyrillic Script)"), QT_TRANSLATE_NOOP("Language", "Other (West European)"), From da7f1f4620d8fdb23c46c1823638712d985e1a2c Mon Sep 17 00:00:00 2001 From: heroesiiifan <77574150+heroesiiifan@users.noreply.github.com> Date: Fri, 28 Jul 2023 00:31:59 +0000 Subject: [PATCH 08/14] Update LanguageSettingDialog.java --- .../main/java/eu/vcmi/vcmi/settings/LanguageSettingDialog.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/vcmi-app/src/main/java/eu/vcmi/vcmi/settings/LanguageSettingDialog.java b/android/vcmi-app/src/main/java/eu/vcmi/vcmi/settings/LanguageSettingDialog.java index 98bbcd9b2..aed0a60d3 100644 --- a/android/vcmi-app/src/main/java/eu/vcmi/vcmi/settings/LanguageSettingDialog.java +++ b/android/vcmi-app/src/main/java/eu/vcmi/vcmi/settings/LanguageSettingDialog.java @@ -30,6 +30,7 @@ public class LanguageSettingDialog extends LauncherSettingDialog AVAILABLE_LANGUAGES.add("swedish"); AVAILABLE_LANGUAGES.add("turkish"); AVAILABLE_LANGUAGES.add("ukrainian"); + AVAILABLE_LANGUAGES.add("vietnamese"); AVAILABLE_LANGUAGES.add("other_cp1250"); AVAILABLE_LANGUAGES.add("other_cp1251"); AVAILABLE_LANGUAGES.add("other_cp1252"); From ddfeeb152d5d7833e9cf8e961b0cd42abde5de10 Mon Sep 17 00:00:00 2001 From: heroesiiifan <77574150+heroesiiifan@users.noreply.github.com> Date: Fri, 28 Jul 2023 00:33:42 +0000 Subject: [PATCH 09/14] Update settings.json --- config/schemas/settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/schemas/settings.json b/config/schemas/settings.json index ef234a135..ca30b8c02 100644 --- a/config/schemas/settings.json +++ b/config/schemas/settings.json @@ -63,12 +63,12 @@ }, "language" : { "type" : "string", - "enum" : [ "english", "czech", "chinese", "finnish", "french", "german", "hungarian", "italian", "korean", "polish", "portuguese", "russian", "spanish", "swedish", "turkish", "ukrainian" ], + "enum" : [ "english", "czech", "chinese", "finnish", "french", "german", "hungarian", "italian", "korean", "polish", "portuguese", "russian", "spanish", "swedish", "turkish", "ukrainian", "vietnamese" ], "default" : "english" }, "gameDataLanguage" : { "type" : "string", - "enum" : [ "auto", "english", "czech", "chinese", "finnish", "french", "german", "hungarian", "italian", "korean", "polish", "portuguese", "russian", "spanish", "swedish", "turkish", "ukrainian", "other_cp1250", "other_cp1251", "other_cp1252" ], + "enum" : [ "auto", "english", "czech", "chinese", "finnish", "french", "german", "hungarian", "italian", "korean", "polish", "portuguese", "russian", "spanish", "swedish", "turkish", "ukrainian", "vietnamese", "other_cp1250", "other_cp1251", "other_cp1252" ], "default" : "auto" }, "lastSave" : { From 648f7344c792eddd0d2865c493bb6cd121b89287 Mon Sep 17 00:00:00 2001 From: heroesiiifan <77574150+heroesiiifan@users.noreply.github.com> Date: Fri, 28 Jul 2023 00:34:28 +0000 Subject: [PATCH 10/14] Update mod.json --- config/schemas/mod.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/schemas/mod.json b/config/schemas/mod.json index 9c0d5b4e3..2c1fc8501 100644 --- a/config/schemas/mod.json +++ b/config/schemas/mod.json @@ -153,7 +153,7 @@ "language" : { "type" : "string", "description" : "Base language of the mod, before applying localizations. By default vcmi assumes English", - "enum" : [ "czech", "chinese", "english", "finnish", "french", "german", "hungarian", "italian", "korean", "polish", "portuguese", "russian", "spanish", "swedish", "turkish", "ukrainian" ] + "enum" : [ "czech", "chinese", "english", "finnish", "french", "german", "hungarian", "italian", "korean", "polish", "portuguese", "russian", "spanish", "swedish", "turkish", "ukrainian", "vietnamese" ] }, "czech" : { "$ref" : "#/definitions/localizable" @@ -203,6 +203,9 @@ "ukrainian" : { "$ref" : "#/definitions/localizable" }, + "vietnamese" : { + "$ref" : "#/definitions/localizable" + }, "translations" : { "type" : "array", "description" : "List of files with translations for this language", From bee59b3c1c9ccf3ad57cc080330163c7d771a24d Mon Sep 17 00:00:00 2001 From: heroesiiifan <77574150+heroesiiifan@users.noreply.github.com> Date: Fri, 28 Jul 2023 00:48:06 +0000 Subject: [PATCH 11/14] Update Languages.h --- lib/Languages.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Languages.h b/lib/Languages.h index 6bcd7c618..d00ce6ff7 100644 --- a/lib/Languages.h +++ b/lib/Languages.h @@ -63,7 +63,7 @@ struct Options inline const auto & getLanguageList() { - static const std::array languages + static const std::array languages { { { "czech", "Czech", "Čeština", "CP1250", "cs", true }, { "chinese", "Chinese", "简体中文", "GBK", "zh", true }, // Note: actually Simplified Chinese From 8c4e23f2d6ac32dbcc949d75072ba0a1e4493d18 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Thu, 27 Jul 2023 20:00:59 +0300 Subject: [PATCH 12/14] Updated Launcher localization --- launcher/translation/chinese.ts | 150 +++++----- launcher/translation/english.ts | 118 ++++---- launcher/translation/french.ts | 457 +++++------------------------- launcher/translation/german.ts | 150 +++++----- launcher/translation/polish.ts | 150 +++++----- launcher/translation/russian.ts | 150 +++++----- launcher/translation/spanish.ts | 150 +++++----- launcher/translation/ukrainian.ts | 154 +++++----- 8 files changed, 554 insertions(+), 925 deletions(-) diff --git a/launcher/translation/chinese.ts b/launcher/translation/chinese.ts index 048c534c2..8ac241e96 100644 --- a/launcher/translation/chinese.ts +++ b/launcher/translation/chinese.ts @@ -407,120 +407,123 @@ CSettingsView - Open - 打开 - - - User data directory - 用户数据目录 - - - - - + + + Off 关闭 - - + + Artificial Intelligence 人工智能 - - + + Mod Repositories 模组仓库 - + Interface Scaling - + Neutral AI in battles - + Enemy AI in battles - + Additional repository - + Adventure Map Allies - + Adventure Map Enemies - + Windowed - + Borderless fullscreen - + Exclusive fullscreen - + + Autosave limit (0 = off) + + + + Friendly AI in battles - + Framerate Limit - + + Autosave prefix + + + + + empty = map name prefix + + + + Refresh now - + Default repository - Update now - 立即更新 - - - - - + + + On 开启 - + Cursor 鼠标指针 - + Heroes III Data Language 英雄无敌3数据语言 - + Select display mode for game Windowed - game will run inside a window that covers part of your screen @@ -531,107 +534,95 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use - + Hardware 硬件 - + Software 软件 - + Heroes III Translation 发布版本里找不到这个项,不太清楚意义 英雄无敌3翻译 - + Check on startup 启动时检查更新 - + Fullscreen 全屏 - - + + General 通用设置 - + VCMI Language VCMI语言 - + Resolution 分辨率 - + Autosave 自动存档 - + Display index 显示器序号 - + Network port 网络端口 - Data Directories - 数据目录 - - - - + + Video 视频设置 - Log files directory - 日志文件目录 - - - + Show intro 显示开场动画 - Build version - 版本号 - - - + Active 激活 - + Disabled 禁用 - + Enable 启用 - + Not Installed 未安装 - + Install 安装 @@ -730,10 +721,6 @@ Heroes® of Might and Magic® III HD is currently not supported! Install mod that provides various interface improvements, such as better interface for random maps and selectable actions in battles - - Install support for playing Heroes III in resolutions higher than 800x600 - 安装英雄无敌3的800x600以上分辨率支持 - Install compatible version of "Horn of the Abyss", a fan-made Heroes III expansion ported by the VCMI team @@ -821,10 +808,6 @@ Heroes® of Might and Magic® III HD is currently not supported! Heroes III Translation 英雄无敌3翻译 - - High Definition Support - 高分辨率支持 - In The Wake of Gods @@ -923,21 +906,26 @@ Heroes® of Might and Magic® III HD is currently not supported! + Vietnamese + + + + Other (East European) - + Other (Cyrillic Script) - + Other (West European) - + Auto (%1) 自动 (%1) diff --git a/launcher/translation/english.ts b/launcher/translation/english.ts index aa772876c..9270e252a 100644 --- a/launcher/translation/english.ts +++ b/launcher/translation/english.ts @@ -406,108 +406,123 @@ CSettingsView - - - + + + Off - - + + Artificial Intelligence - - + + Mod Repositories - + Interface Scaling - + Neutral AI in battles - + Enemy AI in battles - + Additional repository - + Adventure Map Allies - + Adventure Map Enemies - + Windowed - + Borderless fullscreen - + Exclusive fullscreen - + + Autosave limit (0 = off) + + + + Friendly AI in battles - + Framerate Limit - + + Autosave prefix + + + + + empty = map name prefix + + + + Refresh now - + Default repository - - - + + + On - + Cursor - + Heroes III Data Language - + Select display mode for game Windowed - game will run inside a window that covers part of your screen @@ -518,94 +533,94 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use - + Hardware - + Software - + Heroes III Translation - + Check on startup - + Fullscreen - - + + General - + VCMI Language - + Resolution - + Autosave - + Display index - + Network port - - + + Video - + Show intro - + Active - + Disabled - + Enable - + Not Installed - + Install @@ -883,21 +898,26 @@ Heroes® of Might and Magic® III HD is currently not supported! - Other (East European) + Vietnamese - Other (Cyrillic Script) + Other (East European) + Other (Cyrillic Script) + + + + Other (West European) - + Auto (%1) diff --git a/launcher/translation/french.ts b/launcher/translation/french.ts index c38c637ad..110fbcbbd 100644 --- a/launcher/translation/french.ts +++ b/launcher/translation/french.ts @@ -198,118 +198,6 @@ Version - - CModListModel - - - Translation - Traduction - - - - Town - Ville - - - - Test - Test - - - - Templates - Modèles - - - - Spells - Sorts - - - - Music - Musique - - - - Sounds - Sons - - - - Skills - Compétences - - - - - Other - Autre - - - - Objects - Objets - - - - - Mechanics - Mécanique - - - - - Interface - Interface - - - - Heroes - Héros - - - - - Graphical - Graphique - - - - Expansion - Extension - - - - Creatures - Créatures - - - - Artifacts - Artefacts - - - - AI - IA - - - - Name - Nom - - - - Type - Type - - - - Version - Version - - CModListView @@ -398,10 +286,6 @@ Install Installer - - %p% (%v KB out of %m KB) - %p% (%v Ko sur %m Ko) - Abort @@ -527,63 +411,43 @@ CSettingsView - Change - Changer - - - Open - Ouvrir - - - Adventure Map AI - IA de Carte d'Aventure - - - User data directory - Dossier de donnée utilisateur - - - - - + + + Off Désactivé - - + + Artificial Intelligence Intelligence Artificielle - - + + Mod Repositories Dépôts de Mod - Update now - Mettre à jour maintenant - - - - - + + + On Activé - + Enemy AI in battles IA ennemie dans les batailles - + Default repository Dépôt par défaut - + Select display mode for game Windowed - game will run inside a window that covers part of your screen @@ -600,191 +464,174 @@ Mode fenêtré sans bord - le jeu s"exécutera dans une fenêtre qui couvre Mode exclusif plein écran - le jeu couvrira l"intégralité de votre écran et utilisera la résolution sélectionnée. - + Windowed Fenêtré - + Borderless fullscreen Fenêtré sans bord - + Exclusive fullscreen Plein écran exclusif - + Neutral AI in battles IA neutre dans les batailles - + + Autosave limit (0 = off) + + + + Adventure Map Enemies Ennemis de la carte d"aventure - + + Autosave prefix + + + + + empty = map name prefix + + + + Interface Scaling Mise à l"échelle de l"interface - + Cursor Curseur - + Heroes III Data Language Langue des Données de Heroes III - + Framerate Limit Limite de fréquence d"images - + Hardware Matériel - + Software Logiciel - + Heroes III Translation Traduction de Heroes III - + Adventure Map Allies Alliés de la carte d"aventure - + Additional repository Dépôt supplémentaire - + Check on startup Vérifier au démarrage - + Refresh now Actualiser maintenant - + Friendly AI in battles IA amicale dans les batailles - + Fullscreen Plein écran - Neutral AI - IA neutre - - - Real - Réel - - - - + + General Général - + VCMI Language Langue de VCMI - Friendly AI - IA amicale - - - + Resolution Résolution - + Autosave Sauvegarde automatique - + Display index Index d'affichage - + Network port Port de réseau - Data Directories - Dossier de Données - - - - + + Video Vidéo - Extra data directory - Dossier de données supplémentaires - - - Log files directory - Dossier de journalisation - - - + Show intro Montrer l'intro - Build version - Version de la construction - - - Enemy AI - IA ennemi - - - + Active Actif - + Disabled Désactivé - + Enable Activé - + Not Installed Pas Installé - + Install Installer @@ -816,110 +663,26 @@ Mode exclusif plein écran - le jeu couvrira l"intégralité de votre écra Have a question? Found a bug? Want to help? Join us! Avez-vous une question ? Avez-vous trouvé un bogue ? Besoin d'aide ? Rejoignez-nous ! - - Thank you for installing VCMI! - - Before you can start playing, there are a few more steps that need to be completed. - - Please keep in mind that in order to use VCMI you must own the original data files for Heroes® of Might - and Magic® III: Complete or The Shadow of Death. - - Heroes® of Might and Magic® III HD is currently not supported! - - Merci d'avoir installé VCMI ! - - Avant que vous ne commenciez à jouer, il y a encore quelques étapes qui ont besoin d'être complétées. - - Veuillez garder à l'esprit que pour utiliser VCMI, vous devez posséder les fichiers de données originaux de Heroes® of Might - and Magic® III: Complete ou The Shadow of Death. - - Heroes® of Might and Magic® III HD n'est pas supporté actuellement ! - - Locate Heroes III data files Localiser les fichiers de données de Heroes III - - If you don't have a copy of Heroes III installed, you can use our automatic installation tool - 'vcmibuilder', which only requires the GoG.com Heroes III installer. Please visit our wiki for - detailed instructions. - - Si vous n'avez pas de copie de Heroes III d'installé, vous pouvez utiliser notre - outil d'installation automatique 'vcmibuilder', qui ne nécessite que l'installeur Heroes III de GoG.com. - Veuillez visiter notre wiki pour plus d'informations. - - - - To run VCMI, Heroes III data files need to be present in one of the specified locations. Please copy - the Heroes III data to one of these directories. - - Pour lancer VCMI, les fichiers de données de Heroes III ont besoin d'être présent dans un des emplacements spécifiés. - Veuillez copier les données de Heroes III vers un de ces dossiers. - - - - Alternatively, you can provide the directory where Heroes III data is installed and VCMI will copy - the existing data automatically. - - Ou sinon, vous pouvez indiquer le dossier où les données de Heroes III sont installées et VCMI va copier les données existantes automatiquement. - - Your Heroes III data files have been successfully found. Vos fichiers de données de Heroes III ont été trouvés. - - The automatic detection of the Heroes III language has failed. Please select the language of your - Heroes III manually - - La détection automatique de la langue de Heroes III a échoué. Veuillez sélectionner - la langue de votre Heroes III manuellement - - Install a translation of Heroes III in your preferred language Installer une traduction de Heroes III dans la langue de votre choix - - Optionally, you can install additional mods either now, or at any point later, using the VCMI - Launcher - - Éventuellement, vous pouvez installer des mods supplémentaires soit maintenant, soit plus tard, en utilisant le lanceur VCMI - - - - Install support for playing Heroes III in resolutions higher than 800x600 - Installer un support pour jouer à Heroes III avec des résolutions supérieures à 800x600 - - - - Install compatible version of "Horn of the Abyss", a fan-made Heroes III expansion ported - by the VCMI team - - Installer une version compatible de "Horn of the Abyss", une extension de - Heroes III fait par des fans porté par l'équipe VCMI - - - - Install compatible version of "In The Wake of Gods", a fan-made Heroes III expansion - - Installer une version compatible de "In The Wake of Gods", une extension de - Heroes III fait par des fans - - Finish Terminer - - Step %v out of %m - Étape %v sur %m - VCMI on Github @@ -1032,11 +795,7 @@ Heroes® of Might and Magic® III HD n"est actuellement pas pris en charge Interface Improvements - Améliorations de l'interface - - - High Definition Support - Support de Haute Définition + Améliorations de l'interface @@ -1051,7 +810,7 @@ Heroes® of Might and Magic® III HD n"est actuellement pas pris en charge Install mod that provides various interface improvements, such as better interface for random maps and selectable actions in battles - Installer le mod qui fournit diverses améliorations d'interface, telles qu'une meilleure interface pour les cartes aléatoires et des actions sélectionnables dans les batailles + Installer le mod qui fournit diverses améliorations d'interface, telles qu'une meilleure interface pour les cartes aléatoires et des actions sélectionnables dans les batailles @@ -1156,21 +915,26 @@ Heroes® of Might and Magic® III HD n"est actuellement pas pris en charge + Vietnamese + + + + Other (East European) Autre (Europe de l'Est) - + Other (Cyrillic Script) Autre (Alphabet Cyrillique) - + Other (West European) Autre (Europe de l'Ouest) - + Auto (%1) Auto (%1) @@ -1335,85 +1099,6 @@ Heroes® of Might and Magic® III HD n"est actuellement pas pris en charge Démarrer une partie - - Salon - - Connect - Connecter - - - Username - Nom d'utilisateur - - - Server - Serveur - - - Lobby chat - Discussion de salle d'attente - - - Session - Session - - - Players - Joueurs - - - Resolve - Résoudre - - - New game - Nouvelle partie - - - Load game - Charger une partie - - - New room - Nouveau salon - - - Players in lobby - Joueurs à la salle d'attente - - - Join room - Rejoindre le salon - - - Ready - Prêt - - - Mods mismatch - Incohérence de mods - - - Leave - Quitter - - - Kick player - Jeter le joueur - - - Players in the room - Joueurs dans le salon - - - Disconnect - Déconnecter - - - No issues detected - Pas de problème détecté - - UpdateDialog diff --git a/launcher/translation/german.ts b/launcher/translation/german.ts index 6dd2341cb..b28163a84 100644 --- a/launcher/translation/german.ts +++ b/launcher/translation/german.ts @@ -406,120 +406,123 @@ CSettingsView - Open - Öffnen - - - User data directory - Verzeichnis der Benutzerdaten - - - - - + + + Off Aus - - + + Artificial Intelligence Künstliche Intelligenz - - + + Mod Repositories Mod-Repositorien - + Interface Scaling Skalierung der Benutzeroberfläche - + Neutral AI in battles Neutrale KI in Kämpfen - + Enemy AI in battles Gegnerische KI in Kämpfen - + Additional repository Zusätzliches Repository - + Adventure Map Allies Abenteuerkarte Verbündete - + Adventure Map Enemies Abenteuerkarte Feinde - + Windowed Fenstermodus - + Borderless fullscreen Randloser Vollbildmodus - + Exclusive fullscreen Exklusiver Vollbildmodus - + + Autosave limit (0 = off) + + + + Friendly AI in battles Freundliche KI in Kämpfen - + Framerate Limit Limit der Bildrate - + + Autosave prefix + + + + + empty = map name prefix + + + + Refresh now Jetzt aktualisieren - + Default repository Standard Repository - Update now - Jetzt aktualisieren - - - - - + + + On An - + Cursor Zeiger - + Heroes III Data Language Sprache der Heroes III Daten - + Select display mode for game Windowed - game will run inside a window that covers part of your screen @@ -536,106 +539,94 @@ Randloser Fenstermodus - das Spiel läuft in einem Fenster, das den gesamten Bil Exklusiver Vollbildmodus - das Spiel bedeckt den gesamten Bildschirm und verwendet die gewählte Auflösung. - + Hardware Hardware - + Software Software - + Heroes III Translation Heroes III Übersetzung - + Check on startup Beim Start prüfen - + Fullscreen Vollbild - - + + General Allgemein - + VCMI Language VCMI-Sprache - + Resolution Auflösung - + Autosave Autospeichern - + Display index Anzeige-Index - + Network port Netzwerk-Port - Data Directories - Daten-Verzeichnisse - - - - + + Video Video - Log files directory - Verzeichnis der Log-Dateien - - - + Show intro Intro anzeigen - Build version - Version des Builds - - - + Active Aktiv - + Disabled Deaktiviert - + Enable Aktivieren - + Not Installed Nicht installiert - + Install Installieren @@ -734,10 +725,6 @@ Heroes III: HD Edition wird derzeit nicht unterstützt! Install mod that provides various interface improvements, such as better interface for random maps and selectable actions in battles Installiere Mod, die verschiedene Interface-Verbesserungen bietet, wie z.B. ein besseres Interface für zufällige Karten und wählbare Aktionen in Kämpfen - - Install support for playing Heroes III in resolutions higher than 800x600 - Installieren Sie Unterstützung für das Spielen von Heroes III in anderen Auflösungen als 800x600 - Install compatible version of "Horn of the Abyss", a fan-made Heroes III expansion ported by the VCMI team @@ -825,10 +812,6 @@ Heroes III: HD Edition wird derzeit nicht unterstützt! Heroes III Translation Heroes III Übersetzung - - High Definition Support - Unterstützung für hohe Auflösungen - In The Wake of Gods @@ -927,21 +910,26 @@ Heroes III: HD Edition wird derzeit nicht unterstützt! + Vietnamese + + + + Other (East European) Sonstige (osteuropäisch) - + Other (Cyrillic Script) Sonstige (kyrillische Schrift) - + Other (West European) Sonstige (westeuropäisch) - + Auto (%1) Auto (%1) diff --git a/launcher/translation/polish.ts b/launcher/translation/polish.ts index 62ad8bb1c..72bfa264a 100644 --- a/launcher/translation/polish.ts +++ b/launcher/translation/polish.ts @@ -406,120 +406,123 @@ CSettingsView - Open - Otwórz - - - User data directory - Katalog danych użytkownika - - - - - + + + Off Wyłączony - - + + Artificial Intelligence Sztuczna Inteligencja - - + + Mod Repositories Repozytoria modów - + Interface Scaling Skala interfejsu - + Neutral AI in battles AI bitewne jednostek neutralnych - + Enemy AI in battles AI bitewne wrogów - + Additional repository Dodatkowe repozytorium - + Adventure Map Allies AI sojuszników mapy przygody - + Adventure Map Enemies AI wrogów mapy przygody - + Windowed Okno - + Borderless fullscreen Pełny ekran (tryb okna) - + Exclusive fullscreen Pełny ekran klasyczny - + + Autosave limit (0 = off) + + + + Friendly AI in battles AI bitewne sojuszników - + Framerate Limit Limit FPS - + + Autosave prefix + + + + + empty = map name prefix + + + + Refresh now Odśwież - + Default repository Domyślne repozytorium - Update now - Zaktualizuj teraz - - - - - + + + On Włączony - + Cursor Kursor - + Heroes III Data Language Język plików Heroes III - + Select display mode for game Windowed - game will run inside a window that covers part of your screen @@ -536,106 +539,94 @@ Pełny ekran w trybie okna - gra uruchomi się w oknie przysłaniającym cały e Pełny ekran klasyczny - gra przysłoni cały ekran uruchamiając się w wybranej przez ciebie rozdzielczości ekranu. - + Hardware Sprzętowy - + Software Programowy - + Heroes III Translation Tłumaczenie Heroes III - + Check on startup Sprawdzaj przy uruchomieniu - + Fullscreen Pełny ekran - - + + General Ogólne - + VCMI Language Język VCMI - + Resolution Rozdzielczość - + Autosave Autozapis - + Display index Numer wyświetlacza - + Network port Port sieciowy - Data Directories - Katalogi z danymi - - - - + + Video Obraz - Log files directory - Katalog logów - - - + Show intro Pokaż intro - Build version - Wersja programu - - - + Active Aktywny - + Disabled Wyłączone - + Enable Włącz - + Not Installed Nie zainstalowano - + Install Zainstaluj @@ -734,10 +725,6 @@ Heroes III: HD Edition nie jest obecnie wspierane! Install mod that provides various interface improvements, such as better interface for random maps and selectable actions in battles - - Install support for playing Heroes III in resolutions higher than 800x600 - Zainstaluj wsparcie dla grania w Heroes III w rozdzielczości innej niż 800x600 - Install compatible version of "Horn of the Abyss", a fan-made Heroes III expansion ported by the VCMI team @@ -825,10 +812,6 @@ Heroes III: HD Edition nie jest obecnie wspierane! Heroes III Translation Tłumaczenie Heroes III - - High Definition Support - Wsparcie High Definition - In The Wake of Gods @@ -927,21 +910,26 @@ Heroes III: HD Edition nie jest obecnie wspierane! - Other (East European) + Vietnamese - Other (Cyrillic Script) + Other (East European) + Other (Cyrillic Script) + + + + Other (West European) - + Auto (%1) diff --git a/launcher/translation/russian.ts b/launcher/translation/russian.ts index cfb060df8..7e0953a29 100644 --- a/launcher/translation/russian.ts +++ b/launcher/translation/russian.ts @@ -406,141 +406,144 @@ CSettingsView - Open - Открыть - - - User data directory - Данные пользователя - - - + Interface Scaling - - - + + + Off Отключено - - - + + + On Включено - + Neutral AI in battles - + Enemy AI in battles - + Additional repository - + Check on startup Проверять при запуске - + Fullscreen Полноэкранный режим - - + + General Общее - + VCMI Language Язык VCMI - + Cursor Курсор - - + + Artificial Intelligence Искусственный интеллект - - + + Mod Repositories Репозитории модов - + Adventure Map Allies - + Refresh now - + Adventure Map Enemies - + Windowed - + Borderless fullscreen - + Exclusive fullscreen - + + Autosave limit (0 = off) + + + + Friendly AI in battles - + Framerate Limit - + + Autosave prefix + + + + + empty = map name prefix + + + + Default repository - Update now - Обновить сейчас - - - + Heroes III Data Language Язык данных Героев III - + Select display mode for game Windowed - game will run inside a window that covers part of your screen @@ -551,85 +554,73 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use - + Hardware Аппаратный - + Software Программный - + Heroes III Translation Перевод Героев III - + Resolution Разрешение экрана - + Autosave Автосохранение - + Display index Дисплей - + Network port Сетевой порт - Data Directories - Директории данных - - - - + + Video Графика - Log files directory - Журналы - - - + Show intro Вступление - Build version - Версия сборки - - - + Active Активен - + Disabled Отключен - + Enable Включить - + Not Installed Не установлен - + Install Установить @@ -728,10 +719,6 @@ Heroes® of Might and Magic® III HD is currently not supported! Install mod that provides various interface improvements, such as better interface for random maps and selectable actions in battles - - Install support for playing Heroes III in resolutions higher than 800x600 - Установить поддержку запуска Героев III в разрешениях, отличных от 800x600 - Install compatible version of "Horn of the Abyss", a fan-made Heroes III expansion ported by the VCMI team @@ -819,10 +806,6 @@ Heroes® of Might and Magic® III HD is currently not supported! Heroes III Translation Перевод Героев III - - High Definition Support - Поддержка высоких разрешений - In The Wake of Gods @@ -921,21 +904,26 @@ Heroes® of Might and Magic® III HD is currently not supported! + Vietnamese + + + + Other (East European) Другой (восточноевропейский) - + Other (Cyrillic Script) Другой (кириллический) - + Other (West European) Другой (западноевропейский) - + Auto (%1) Авто (%1) diff --git a/launcher/translation/spanish.ts b/launcher/translation/spanish.ts index eca998ccc..6401189bc 100644 --- a/launcher/translation/spanish.ts +++ b/launcher/translation/spanish.ts @@ -406,166 +406,165 @@ CSettingsView - Open - Abrir - - - User data directory - Directorio de datos del usuario - - - - - + + + Off Desactivado - - + + Artificial Intelligence Inteligencia Artificial - - + + Mod Repositories Repositorios de Mods - + Interface Scaling - + Neutral AI in battles - + Enemy AI in battles - + Additional repository - + Adventure Map Allies - + Adventure Map Enemies - + Windowed - + Borderless fullscreen - + Exclusive fullscreen - + + Autosave limit (0 = off) + + + + Friendly AI in battles - + Framerate Limit - + + Autosave prefix + + + + + empty = map name prefix + + + + Refresh now - + Default repository - Update now - Actualizar ahora - - - - - + + + On Encendido - + Cursor Cursor - + Heroes III Translation Traducción de Heroes III - + Fullscreen Pantalla completa - - + + General General - + VCMI Language Idioma de VCMI - + Resolution Resolución - + Autosave Autoguardado - + Display index Mostrar índice - + Network port Puerto de red - Data Directories - Directorios de datos - - - - + + Video Vídeo - + Select display mode for game Windowed - game will run inside a window that covers part of your screen @@ -576,60 +575,52 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use - + Hardware Hardware - + Software Software - Log files directory - Directorio de archivos de registro - - - + Show intro Mostrar introducción - Build version - Versión - - - + Check on startup Comprovar al inicio - + Heroes III Data Language Idioma de los datos de Heroes III. - + Active Activado - + Disabled Desactivado - + Enable Activar - + Not Installed No Instalado - + Install Instalar @@ -790,10 +781,6 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi Heroes III Translation Traducción de Heroes III. - - High Definition Support - Soporte para resoluciones en Alta Definición - In The Wake of Gods @@ -809,10 +796,6 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi Optionally, you can install additional mods either now, or at any point later, using the VCMI Launcher Opcionalmente, puedes instalar mods adicionales ya sea ahora o en cualquier momento posterior, utilizando el lanzador de VCMI. - - Install support for playing Heroes III in resolutions higher than 800x600 - Instalar soporte para jugar Heroes III en resoluciones superiores a 800x600 - Install compatible version of "Horn of the Abyss", a fan-made Heroes III expansion ported by the VCMI team @@ -921,21 +904,26 @@ Ten en cuenta que para usar VCMI debes ser dueño de los archivos de datos origi + Vietnamese + + + + Other (East European) Otro (Europa del Este) - + Other (Cyrillic Script) - + Other (West European) - + Auto (%1) Automático (%1) diff --git a/launcher/translation/ukrainian.ts b/launcher/translation/ukrainian.ts index 69f1f51c9..b4362d867 100644 --- a/launcher/translation/ukrainian.ts +++ b/launcher/translation/ukrainian.ts @@ -406,124 +406,123 @@ CSettingsView - Open - Відкрити - - - User data directory - Тека даних користувача - - - - - + + + Off Вимкнено - - + + Artificial Intelligence Штучний інтелект - - + + Mod Repositories Репозиторії модифікацій - + Interface Scaling Масштабування інтерфейсу - + Neutral AI in battles Нейтральний ШІ в боях - + Enemy AI in battles Ворожий ШІ в боях - + Additional repository Додатковий репозиторій - Game data directory - Тека даних гри - - - + Adventure Map Allies Союзники на мапі пригод - + Adventure Map Enemies Вороги на мапі пригод - + Windowed У вікні - + Borderless fullscreen Повноекранне вікно - + Exclusive fullscreen Повноекранний (ексклюзивно) - + + Autosave limit (0 = off) + Кількість автозбережень + + + Friendly AI in battles Дружній ШІ в боях - + Framerate Limit Обмеження частоти кадрів - + + Autosave prefix + Префікс назв автозбережень + + + + empty = map name prefix + (використовувати назву карти) + + + Refresh now Оновити зараз - + Default repository Стандартний репозиторій - Update now - Оновити зараз - - - - - + + + On Увімкнено - + Cursor Курсор - + Heroes III Data Language Мова Heroes III - + Select display mode for game Windowed - game will run inside a window that covers part of your screen @@ -540,106 +539,94 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use Повноекранний ексклюзивний режим - гра займатиме весь екран і використовуватиме вибрану роздільну здатність. - + Hardware Апаратний - + Software Програмний - + Heroes III Translation Переклад Heroes III - + Check on startup Перевіряти на старті - + Fullscreen Повноекранний режим - - + + General Загальні налаштування - + VCMI Language Мова VCMI - + Resolution Роздільна здатність - + Autosave Автозбереження - + Display index Дісплей - + Network port Мережевий порт - Data Directories - Теки даних гри - - - - + + Video Графіка - Log files directory - Тека файлів журналу - - - + Show intro Вступні відео - Build version - Версія збірки - - - + Active Активні - + Disabled Деактивований - + Enable Активувати - + Not Installed Не встановлено - + Install Встановити @@ -738,10 +725,6 @@ Heroes® of Might and Magic® III HD наразі не підтримуєтьс Install mod that provides various interface improvements, such as better interface for random maps and selectable actions in battles Встановити різноманітні покращення інтерфейсу, такі як покращений інтерфейс випадкових карт та вибір варіантів дій у боях - - Install support for playing Heroes III in resolutions higher than 800x600 - Встановити підтримку для гри в Heroes III у роздільних здатностях, більших за 800x600 - Install compatible version of "Horn of the Abyss", a fan-made Heroes III expansion ported by the VCMI team @@ -829,10 +812,6 @@ Heroes® of Might and Magic® III HD наразі не підтримуєтьс Heroes III Translation Переклад Heroes III - - High Definition Support - Підтримка високих роздільних здатностей - In The Wake of Gods @@ -931,21 +910,26 @@ Heroes® of Might and Magic® III HD наразі не підтримуєтьс + Vietnamese + В'єтнамська + + + Other (East European) Інша (східноєвропейська) - + Other (Cyrillic Script) Інша (кирилиця) - + Other (West European) Інша (західноєвропейська) - + Auto (%1) Авто (%1) From 4ba6806a690c1766460e0ba4b9d7be4f80728448 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Thu, 27 Jul 2023 20:01:20 +0300 Subject: [PATCH 13/14] Added missing string to Editor translation --- mapeditor/mainwindow.cpp | 12 +++++------ mapeditor/mapview.cpp | 2 +- mapeditor/validator.cpp | 42 +++++++++++++++++++------------------- mapeditor/windownewmap.cpp | 4 ++-- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/mapeditor/mainwindow.cpp b/mapeditor/mainwindow.cpp index f1c4f9f5b..156bcdeb4 100644 --- a/mapeditor/mainwindow.cpp +++ b/mapeditor/mainwindow.cpp @@ -249,7 +249,7 @@ bool MainWindow::getAnswerAboutUnsavedChanges() { if(unsaved) { - auto sure = QMessageBox::question(this, "Confirmation", "Unsaved changes will be lost, are you sure?"); + auto sure = QMessageBox::question(this, tr("Confirmation"), tr("Unsaved changes will be lost, are you sure?")); if(sure == QMessageBox::No) { return false; @@ -326,7 +326,7 @@ bool MainWindow::openMap(const QString & filenameSelect) if(!CResourceHandler::get("mapEditor")->existsResource(resId)) { - QMessageBox::warning(this, "Failed to open map", "Cannot open map from this folder"); + QMessageBox::warning(this, tr("Failed to open map"), tr("Cannot open map from this folder")); return false; } @@ -1125,11 +1125,11 @@ void MainWindow::on_actionUpdate_appearance_triggered() if(controller.scene(mapLevel)->selectionObjectsView.getSelection().empty()) { - QMessageBox::information(this, "Update appearance", "No objects selected"); + QMessageBox::information(this, tr("Update appearance"), tr("No objects selected")); return; } - if(QMessageBox::Yes != QMessageBox::question(this, "Update appearance", "This operation is irreversible. Do you want to continue?")) + if(QMessageBox::Yes != QMessageBox::question(this, tr("Update appearance"), tr("This operation is irreversible. Do you want to continue?"))) return; controller.scene(mapLevel)->selectionTerrainView.clear(); @@ -1188,7 +1188,7 @@ void MainWindow::on_actionUpdate_appearance_triggered() if(errors) - QMessageBox::warning(this, "Update appearance", QString("Errors occured. %1 objects were not updated").arg(errors)); + QMessageBox::warning(this, tr("Update appearance"), QString(tr("Errors occured. %1 objects were not updated")).arg(errors)); } @@ -1228,7 +1228,7 @@ void MainWindow::on_actionPaste_triggered() void MainWindow::on_actionExport_triggered() { - QString fileName = QFileDialog::getSaveFileName(this, "Save to image", QCoreApplication::applicationDirPath(), "BMP (*.bmp);;JPEG (*.jpeg);;PNG (*.png)"); + QString fileName = QFileDialog::getSaveFileName(this, tr("Save to image"), QCoreApplication::applicationDirPath(), "BMP (*.bmp);;JPEG (*.jpeg);;PNG (*.png)"); if(!fileName.isNull()) { QImage image(ui->mapView->scene()->sceneRect().size().toSize(), QImage::Format_RGB888); diff --git a/mapeditor/mapview.cpp b/mapeditor/mapview.cpp index af7bffe35..87775258a 100644 --- a/mapeditor/mapview.cpp +++ b/mapeditor/mapview.cpp @@ -468,7 +468,7 @@ void MapView::dropEvent(QDropEvent * event) else { controller->discardObject(sc->level); - QMessageBox::information(this, "Can't place object", errorMsg); + QMessageBox::information(this, tr("Can't place object"), errorMsg); } } diff --git a/mapeditor/validator.cpp b/mapeditor/validator.cpp index 9091da7ef..d1ded12b0 100644 --- a/mapeditor/validator.cpp +++ b/mapeditor/validator.cpp @@ -47,7 +47,7 @@ std::list Validator::validate(const CMap * map) if(!map) { - issues.emplace_back("Map is not loaded", true); + issues.emplace_back(tr("Map is not loaded"), true); return issues; } @@ -67,14 +67,14 @@ std::list Validator::validate(const CMap * map) if(p.canHumanPlay) ++hplayers; if(p.allowedFactions.empty()) - issues.emplace_back(QString("No factions allowed for player %1").arg(i), true); + issues.emplace_back(QString(tr("No factions allowed for player %1")).arg(i), true); } if(hplayers + cplayers == 0) - issues.emplace_back("No players allowed to play this map", true); + issues.emplace_back(tr("No players allowed to play this map"), true); if(hplayers + cplayers == 1) - issues.emplace_back("Map is allowed for one player and cannot be started", true); + issues.emplace_back(tr("Map is allowed for one player and cannot be started"), true); if(!hplayers) - issues.emplace_back("No human players allowed to play this map", true); + issues.emplace_back(tr("No human players allowed to play this map"), true); std::set allHeroesOnMap; //used to find hero duplicated @@ -90,13 +90,13 @@ std::list Validator::validate(const CMap * map) dynamic_cast(o.get()) || dynamic_cast(o.get())) { - issues.emplace_back(QString("Armored instance %1 is UNFLAGGABLE but must have NEUTRAL or player owner").arg(o->instanceName.c_str()), true); + issues.emplace_back(QString(tr("Armored instance %1 is UNFLAGGABLE but must have NEUTRAL or player owner")).arg(o->instanceName.c_str()), true); } } if(o->getOwner() != PlayerColor::NEUTRAL && o->getOwner().getNum() < map->players.size()) { if(!map->players[o->getOwner().getNum()].canAnyonePlay()) - issues.emplace_back(QString("Object %1 is assigned to non-playable player %2").arg(o->instanceName.c_str(), o->getOwner().getStr().c_str()), true); + issues.emplace_back(QString(tr("Object %1 is assigned to non-playable player %2")).arg(o->instanceName.c_str(), o->getOwner().getStr().c_str()), true); } //checking towns if(auto * ins = dynamic_cast(o.get())) @@ -113,24 +113,24 @@ std::list Validator::validate(const CMap * map) if(ins->ID == Obj::PRISON) { if(ins->getOwner() != PlayerColor::NEUTRAL) - issues.emplace_back(QString("Prison %1 must be a NEUTRAL").arg(ins->instanceName.c_str()), true); + issues.emplace_back(QString(tr("Prison %1 must be a NEUTRAL")).arg(ins->instanceName.c_str()), true); } else { bool has = amountOfCastles.count(ins->getOwner().getNum()); if(!has) - issues.emplace_back(QString("Hero %1 must have an owner").arg(ins->instanceName.c_str()), true); + issues.emplace_back(QString(tr("Hero %1 must have an owner")).arg(ins->instanceName.c_str()), true); } if(ins->type) { if(!map->allowedHeroes[ins->type->getId().getNum()]) - issues.emplace_back(QString("Hero %1 is prohibited by map settings").arg(ins->type->getNameTranslated().c_str()), false); + issues.emplace_back(QString(tr("Hero %1 is prohibited by map settings")).arg(ins->type->getNameTranslated().c_str()), false); if(!allHeroesOnMap.insert(ins->type).second) - issues.emplace_back(QString("Hero %1 has duplicate on map").arg(ins->type->getNameTranslated().c_str()), false); + issues.emplace_back(QString(tr("Hero %1 has duplicate on map")).arg(ins->type->getNameTranslated().c_str()), false); } else - issues.emplace_back(QString("Hero %1 has an empty type and must be removed").arg(ins->instanceName.c_str()), true); + issues.emplace_back(QString(tr("Hero %1 has an empty type and must be removed")).arg(ins->instanceName.c_str()), true); } //checking for arts @@ -141,16 +141,16 @@ std::list Validator::validate(const CMap * map) if(ins->storedArtifact) { if(!map->allowedSpells[ins->storedArtifact->getId().getNum()]) - issues.emplace_back(QString("Spell scroll %1 is prohibited by map settings").arg(ins->getObjectName().c_str()), false); + issues.emplace_back(QString(tr("Spell scroll %1 is prohibited by map settings")).arg(ins->getObjectName().c_str()), false); } else - issues.emplace_back(QString("Spell scroll %1 doesn't have instance assigned and must be removed").arg(ins->instanceName.c_str()), true); + issues.emplace_back(QString(tr("Spell scroll %1 doesn't have instance assigned and must be removed")).arg(ins->instanceName.c_str()), true); } else { if(ins->ID == Obj::ARTIFACT && !map->allowedArtifact[ins->subID]) { - issues.emplace_back(QString("Artifact %1 is prohibited by map settings").arg(ins->getObjectName().c_str()), false); + issues.emplace_back(QString(tr("Artifact %1 is prohibited by map settings")).arg(ins->getObjectName().c_str()), false); } } } @@ -159,30 +159,30 @@ std::list Validator::validate(const CMap * map) //verification of starting towns for(auto & mp : amountOfCastles) if(mp.second == 0) - issues.emplace_back(QString("Player %1 doesn't have any starting town").arg(mp.first), false); + issues.emplace_back(QString(tr("Player %1 doesn't have any starting town")).arg(mp.first), false); //verification of map name and description if(map->name.empty()) - issues.emplace_back("Map name is not specified", false); + issues.emplace_back(tr("Map name is not specified"), false); if(map->description.empty()) - issues.emplace_back("Map description is not specified", false); + issues.emplace_back(tr("Map description is not specified"), false); //verificationfor mods for(auto & mod : MapController::modAssessmentMap(*map)) { if(!map->mods.count(mod.first)) { - issues.emplace_back(QString("Map contains object from mod \"%1\", but doesn't require it").arg(QString::fromStdString(VLC->modh->getModInfo(mod.first).name)), true); + issues.emplace_back(QString(tr("Map contains object from mod \"%1\", but doesn't require it")).arg(QString::fromStdString(VLC->modh->getModInfo(mod.first).name)), true); } } } catch(const std::exception & e) { - issues.emplace_back(QString("Exception occurs during validation: %1").arg(e.what()), true); + issues.emplace_back(QString(tr("Exception occurs during validation: %1")).arg(e.what()), true); } catch(...) { - issues.emplace_back("Unknown exception occurs during validation", true); + issues.emplace_back(tr("Unknown exception occurs during validation"), true); } return issues; diff --git a/mapeditor/windownewmap.cpp b/mapeditor/windownewmap.cpp index 0ebe8d806..6fdd404b8 100644 --- a/mapeditor/windownewmap.cpp +++ b/mapeditor/windownewmap.cpp @@ -268,7 +268,7 @@ void WindowNewMap::on_okButton_clicked() //verify map template if(mapGenOptions.getPossibleTemplates().empty()) { - QMessageBox::warning(this, "No template", "No template for parameters scecified. Random map cannot be generated."); + QMessageBox::warning(this, tr("No template"), tr("No template for parameters scecified. Random map cannot be generated.")); return; } @@ -288,7 +288,7 @@ void WindowNewMap::on_okButton_clicked() } catch(const std::exception & e) { - QMessageBox::critical(this, "RMG failure", e.what()); + QMessageBox::critical(this, tr("RMG failure"), e.what()); } } else From b52a21f8eedb70a105067d5ec3e1325743847e13 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Thu, 27 Jul 2023 20:12:59 +0300 Subject: [PATCH 14/14] Regenerated map editor translations to include missing strings --- mapeditor/translation/english.ts | 423 +++++++++++++++++++---------- mapeditor/translation/french.ts | 395 ++++++++++++++++++--------- mapeditor/translation/german.ts | 399 ++++++++++++++++++--------- mapeditor/translation/polish.ts | 399 ++++++++++++++++++--------- mapeditor/translation/russian.ts | 399 ++++++++++++++++++--------- mapeditor/translation/spanish.ts | 401 ++++++++++++++++++--------- mapeditor/translation/ukrainian.ts | 403 ++++++++++++++++++--------- 7 files changed, 1906 insertions(+), 913 deletions(-) diff --git a/mapeditor/translation/english.ts b/mapeditor/translation/english.ts index 0fe684d69..1c026f635 100644 --- a/mapeditor/translation/english.ts +++ b/mapeditor/translation/english.ts @@ -40,284 +40,327 @@ - + Map - + Edit - + View - + Player - + Toolbar - + Minimap - + Map Objects View - + Browser - + Inspector - + Property - + Value - + Terrains View - + Brush - + Terrains - + Roads - + Rivers - + Open - + Save - + New - + Save as... - + Ctrl+Shift+S - + U/G - - + + View underground - + Pass - + Cut - + Copy - + Paste - + Fill - + Fills the selection with obstacles - + Grid - + General - + Map title and description - + Players settings - - + + Undo - + Redo - + Erase - + Neutral - + Validate - + + + + Update appearance - + Recreate obstacles - + Player 1 - + Player 2 - + Player 3 - + Player 4 - + Player 5 - + Player 6 - + Player 7 - + Player 8 - + Export as... - + + Confirmation + + + + + Unsaved changes will be lost, are you sure? + + + + + Failed to open map + + + + + Cannot open map from this folder + + + + Open map - + All supported maps (*.vmap *.h3m);;VCMI maps(*.vmap);;HoMM3 maps(*.h3m) - - + + Save map - - + + VCMI maps (*.vmap) - + Type - + View surface + + + No objects selected + + + + + This operation is irreversible. Do you want to continue? + + + + + Errors occured. %1 objects were not updated + + + + + Save to image + + MapSettings @@ -327,162 +370,220 @@ - + General - + Map name - + Map description - + + Limit maximum heroes level + + + + Difficulty - - Events + + Mods - - Victory - - - - - Victory message - - - - - Only for human players + + Mandatory mods for playing this map - Allow standard victory + Mod name - - - Parameters + + Version - - Loss + + Automatic assignment + + + + + Set required mods based on objects placed on the map. This method may cause problems if you have customized rewards, garrisons, etc from mods + + + + + Map objects mods + + + + + Set all mods having a game content as mandatory + Full content mods + + + + + Events + + + + + Victory + + + + + Victory message + + + + + Only for human players + + + + + Allow standard victory + + + + + + Parameters + + + + + Loss + + + + 7 days without town - + Defeat message - + Abilities - + Spells - + Artifacts - + Heroes - + Ok - + No special victory - + Capture artifact - + Hire creatures - + Accumulate resources - + Construct building - + Capture town - + Defeat hero - + Transport artifact - + No special loss - + Lose castle - + Lose hero - + Time expired - + Days without town + + MapView + + + Can't place object + + + MessageWidget @@ -494,47 +595,47 @@ PlayerParams - - No team - - - - + Human/CPU - + CPU only - + Team - + Main town - + + Color + + + + Random faction - + Generate hero at main - + (default) - + Player ID: %1 @@ -552,7 +653,12 @@ - + + 1 + + + + Ok @@ -608,6 +714,11 @@ Map is not loaded + + + No factions allowed for player %1 + + No players allowed to play this map @@ -693,6 +804,11 @@ Map description is not specified + + + Map contains object from mod "%1", but doesn't require it + + Exception occurs during validation: %1 @@ -762,114 +878,139 @@ - + 0 - + Human/Computer - - - - + + + + Random - + Computer only - + + Human teams + + + + + Computer teams + + + + Monster strength - + Weak - - + + Normal - + Strong - + Water content - + None - + Islands - + Template - + Custom seed - + Generate random map - + Ok - + Cancel + + + No template + + + + + No template for parameters scecified. Random map cannot be generated. + + + + + RMG failure + + main - + Filepath of the map to open. - + Extract original H3 archives into a separate folder. - + From an extracted archive, it Splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's. - + From an extracted archive, Converts single Images (found in Images folder) from .pcx to png. - + Delete original files, for the ones splitted / converted. diff --git a/mapeditor/translation/french.ts b/mapeditor/translation/french.ts index 4f67ba0b7..65c77b0fa 100644 --- a/mapeditor/translation/french.ts +++ b/mapeditor/translation/french.ts @@ -27,8 +27,6 @@ Générer une carte - - MainWindow @@ -42,284 +40,327 @@ Fichier - + Map Carte - + Edit Édition - + View Affichage - + Player Joueur - + Toolbar Barre d'outils - + Minimap Mini-carte - + Map Objects View Vue des objets cartographiques - + Browser Navigateur - + Inspector Inspecteur - + Property Propriété - + Value Valeur - + Terrains View Vue des terrains - + Brush Pinceau - + Terrains Terrains - + Roads Routes - + Rivers Rivières - + Open Ouvrir - + Save Enregistrer - + New Nouveau - + Save as... Enregistrer sous... - + Ctrl+Shift+S Ctrl+Maj+S - + U/G Sous-sol/Surface - - + + View underground Voir le sous-sol - + Pass Passage - + Cut Couper - + Copy Copier - + Paste Coller - + Fill Remplir - + Fills the selection with obstacles Remplir la sélection d'obstacles - + Grid Grille - + General Général - + Map title and description Titre et description de la carte - + Players settings Paramètres des joueurs - - + + Undo Annuler - + Redo Rétablir - + Erase Effacer - + Neutral Neutre - + Validate Valider - + + + + Update appearance Mettre à jour l'apparence - + Recreate obstacles Recréer des obstacles - + Player 1 Joueur 1 - + Player 2 Joueur 2 - + Player 3 Joueur 3 - + Player 4 Joueur 4 - + Player 5 Joueur 5 - + Player 6 Joueur 6 - + Player 7 Joueur 7 - + Player 8 Joueur 8 - + Export as... Exporter sous... - + + Confirmation + + + + + Unsaved changes will be lost, are you sure? + + + + + Failed to open map + + + + + Cannot open map from this folder + + + + Open map Ouvrir la carte - + All supported maps (*.vmap *.h3m);;VCMI maps(*.vmap);;HoMM3 maps(*.h3m) Toutes les cartes prises en charge (*.vmap *.h3m);;Cartes VCMI (*.vmap);;Cartes HoMM3 (*.h3m) - - + + Save map Enregistrer la carte - - + + VCMI maps (*.vmap) Cartes VCMI (*.vmap) - + Type Type - + View surface Afficher la surface + + + No objects selected + + + + + This operation is irreversible. Do you want to continue? + + + + + Errors occured. %1 objects were not updated + + + + + Save to image + + MapSettings @@ -329,162 +370,220 @@ Paramètres de la carte - + General Général - + Map name Nom de la carte - + Map description Description de la carte - + + Limit maximum heroes level + + + + Difficulty Difficulté - + + Mods + + + + + Mandatory mods for playing this map + + + + + Mod name + + + + + Version + + + + + Automatic assignment + + + + + Set required mods based on objects placed on the map. This method may cause problems if you have customized rewards, garrisons, etc from mods + + + + + Map objects mods + + + + + Set all mods having a game content as mandatory + + + + + Full content mods + + + + Events Événements - + Victory Victoire - + Victory message Message de victoire - + Only for human players Uniquement pour les joueurs humains - + Allow standard victory Autoriser la victoire standard - - + + Parameters Paramètres - + Loss Perte - + 7 days without town 7 jours sans ville - + Defeat message Message de défaite - + Abilities Capacités - + Spells Sorts - + Artifacts Artefacts - + Heroes Héros - + Ok OK - + No special victory Pas de victoire spéciale - + Capture artifact Récupérer l'artefact - + Hire creatures Engagez des créatures - + Accumulate resources Accumuler des ressources - + Construct building Construire un bâtiment - + Capture town Conquérir une ville - + Defeat hero Battre un héros - + Transport artifact Transporter un artefact - + No special loss Aucune perte spéciale - + Lose castle Perdre un château - + Lose hero Perdre un héros - + Time expired Délai expiré - + Days without town Jours sans ville + + MapView + + + Can't place object + + + MessageWidget @@ -496,47 +595,51 @@ PlayerParams - No team - Aucune équipe + Aucune équipe - + Human/CPU Human/Ordinateur - + CPU only Ordinateur uniquement - + Team Équipe - + Main town Ville principale - + + Color + + + + Random faction Faction aléatoire - + Generate hero at main Générer un héros dans le principal - + (default) (par défaut) - + Player ID: %1 Identifiant du joueur : %1 @@ -554,7 +657,12 @@ Joueurs - + + 1 + 1 + + + Ok OK @@ -610,6 +718,11 @@ Map is not loaded Aucune carte n'est chargée + + + No factions allowed for player %1 + + No players allowed to play this map @@ -695,6 +808,11 @@ Map description is not specified La description de la carte n'est pas spécifiée + + + Map contains object from mod "%1", but doesn't require it + + Exception occurs during validation: %1 @@ -764,124 +882,139 @@ Joueurs - + 0 0 - + Human/Computer Humain/Ordinateur - - - - + + + + Random Aléatoire - + Computer only Ordinateur uniquement - + Human teams Équipes humaines - + Computer teams Équipes d'ordinateur - + Monster strength Force des monstres - + Weak Faible - - + + Normal Normale - + Strong Forte - + Water content Proportion en eau - + None Aucune - + Islands Îles - + Template Modèle - + Custom seed Graine personnalisée - + Generate random map Générer une carte aléatoire - + Ok OK - + Cancel Annuler + + + No template + + + + + No template for parameters scecified. Random map cannot be generated. + + + + + RMG failure + + main - + Filepath of the map to open. Chemin du fichier de la carte à ouvrir. - + Extract original H3 archives into a separate folder. Extraire les archives H3 d'origine dans un dossier séparé. - + From an extracted archive, it Splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's. À partir d'une archive extraite, il divise TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 et Un44 en fichiers PNG individuels. - + From an extracted archive, Converts single Images (found in Images folder) from .pcx to png. À partir d'une archive extraite, convertit des images uniques (trouvées dans le dossier Images) de .pcx en png. - + Delete original files, for the ones splitted / converted. Supprimer les fichiers d'origine, pour ceux fractionnés/convertis. diff --git a/mapeditor/translation/german.ts b/mapeditor/translation/german.ts index bcc5cf31b..61ca61ce6 100644 --- a/mapeditor/translation/german.ts +++ b/mapeditor/translation/german.ts @@ -40,284 +40,327 @@ Datei - + Map Karte - + Edit Bearbeiten - + View Ansicht - + Player Spieler - + Toolbar Werkzeugleiste - + Minimap Minikarte - + Map Objects View Kartenobjekte-Ansicht - + Browser Browser - + Inspector Inspektor - + Property Eigenschaft - + Value Wert - + Terrains View Terrain-Ansicht - + Brush Pinsel - + Terrains Terrains - + Roads Straßen - + Rivers Flüsse - + Open Öffnen - + Save Speichern - + New Neu - + Save as... Speichern unter... - + Ctrl+Shift+S Strg+Shift+S - + U/G U/G - - + + View underground Ansicht Untergrund - + Pass Passierbar - + Cut Ausschneiden - + Copy Kopieren - + Paste Einfügen - + Fill Füllen - + Fills the selection with obstacles Füllt die Auswahl mit Hindernissen - + Grid Raster - + General Allgemein - + Map title and description Titel und Beschreibung der Karte - + Players settings Spieler-Einstellungen - - + + Undo Rückgängig - + Redo Wiederholen - + Erase Löschen - + Neutral Neutral - + Validate Validieren - + + + + Update appearance Aussehen aktualisieren - + Recreate obstacles Hindernisse neu erschaffen - + Player 1 Spieler 1 - + Player 2 Spieler 2 - + Player 3 Spieler 3 - + Player 4 Spieler 4 - + Player 5 Spieler 5 - + Player 6 Spieler 6 - + Player 7 Spieler 7 - + Player 8 Spieler 8 - + Export as... Exportieren als... - + + Confirmation + + + + + Unsaved changes will be lost, are you sure? + + + + + Failed to open map + + + + + Cannot open map from this folder + + + + Open map Karte öffnen - + All supported maps (*.vmap *.h3m);;VCMI maps(*.vmap);;HoMM3 maps(*.h3m) Alle unterstützten Karten (*.vmap *.h3m);;VCMI-Karten (*.vmap);;HoMM3-Karten (*.h3m) - - + + Save map Karte speichern - - + + VCMI maps (*.vmap) VCMI-Karten (*.vmap) - + Type Typ - + View surface Oberfläche anzeigen + + + No objects selected + + + + + This operation is irreversible. Do you want to continue? + + + + + Errors occured. %1 objects were not updated + + + + + Save to image + + MapSettings @@ -327,162 +370,220 @@ Karteneinstellungen - + General Allgemein - + Map name Kartenname - + Map description Kartenbeschreibung - + + Limit maximum heroes level + + + + Difficulty Schwierigkeit - + + Mods + + + + + Mandatory mods for playing this map + + + + + Mod name + + + + + Version + + + + + Automatic assignment + + + + + Set required mods based on objects placed on the map. This method may cause problems if you have customized rewards, garrisons, etc from mods + + + + + Map objects mods + + + + + Set all mods having a game content as mandatory + + + + + Full content mods + + + + Events Ereignisse - + Victory Sieg - + Victory message Sieg-Nachricht - + Only for human players Nur für menschliche Spieler - + Allow standard victory Standardsieg zulassen - - + + Parameters Parameter - + Loss Niederlage - + 7 days without town 7 Tage ohne Stadt - + Defeat message Niederlage-Nachricht - + Abilities Fähigkeiten - + Spells Zaubersprüche - + Artifacts Artefakte - + Heroes Helden - + Ok Ok - + No special victory Kein besonderer Sieg - + Capture artifact Artefakt sammeln - + Hire creatures Kreaturen anheuern - + Accumulate resources Ressourcen ansammeln - + Construct building Gebäude errichten - + Capture town Stadt einnehmen - + Defeat hero Held besiegen - + Transport artifact Artefakt transportieren - + No special loss Keine besondere Niederlage - + Lose castle Schloss verlieren - + Lose hero Held verlieren - + Time expired Zeit abgelaufen - + Days without town Tage ohne Stadt + + MapView + + + Can't place object + + + MessageWidget @@ -494,47 +595,51 @@ PlayerParams - No team - Kein Team + Kein Team - + Human/CPU Mensch/CPU - + CPU only Nur CPU - + Team Team - + Main town Hauptstadt - + + Color + + + + Random faction Zufällige Fraktion - + Generate hero at main Held am Hauptplatz generieren - + (default) (Standard) - + Player ID: %1 Spieler-ID: %1 @@ -552,7 +657,12 @@ Spieler - + + 1 + 1 + + + Ok Ok @@ -608,6 +718,11 @@ Map is not loaded Karte ist nicht geladen + + + No factions allowed for player %1 + + No players allowed to play this map @@ -693,6 +808,11 @@ Map description is not specified Kartenbeschreibung ist nicht angegeben + + + Map contains object from mod "%1", but doesn't require it + + Exception occurs during validation: %1 @@ -762,114 +882,139 @@ Spieler - + 0 0 - + Human/Computer Mensch/Computer - - - - + + + + Random Zufall - + Computer only Nur Computer - + + Human teams + + + + + Computer teams + + + + Monster strength Monster-Stärke - + Weak Schwach - - + + Normal Normal - + Strong Stark - + Water content Wasseranteil - + None Keine - + Islands Inseln - + Template Vorlage - + Custom seed Benutzerdefiniertes Seed - + Generate random map Zufällige Karte generieren - + Ok Ok - + Cancel Abbrechen + + + No template + + + + + No template for parameters scecified. Random map cannot be generated. + + + + + RMG failure + + main - + Filepath of the map to open. Dateipfad der zu öffnenden Karte. - + Extract original H3 archives into a separate folder. Extrahieren Sie die Original-H3-Archive in einen separaten Ordner. - + From an extracted archive, it Splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's. Aus einem extrahierten Archiv zerlegt es TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 und Un44 in einzelne PNGs. - + From an extracted archive, Converts single Images (found in Images folder) from .pcx to png. Aus einem extrahierten Archiv werden einzelne Bilder (aus dem Ordner "Images") von .pcx in png konvertiert. - + Delete original files, for the ones splitted / converted. Löschen Sie die Originaldateien für die gesplitteten/konvertierten Dateien. diff --git a/mapeditor/translation/polish.ts b/mapeditor/translation/polish.ts index dcf038c89..c47231394 100644 --- a/mapeditor/translation/polish.ts +++ b/mapeditor/translation/polish.ts @@ -40,284 +40,327 @@ Plik - + Map Mapa - + Edit Edycja - + View Widok - + Player Gracz - + Toolbar Przybornik - + Minimap Minimapa - + Map Objects View Widok obiektów - + Browser Przeglądarka - + Inspector Inspektor - + Property Właściwość - + Value Wartość - + Terrains View Widok terenów - + Brush Pędzel - + Terrains Tereny - + Roads Drogi - + Rivers Rzeki - + Open Otwórz - + Save Zapisz - + New Nowy - + Save as... Zapisz jako - + Ctrl+Shift+S Ctrl+Shift+S - + U/G Podziemia - - + + View underground Pokaż podziemia - + Pass Przejścia - + Cut Wytnij - + Copy Kopiuj - + Paste Wklej - + Fill Wypełnij - + Fills the selection with obstacles Wypełnia zaznaczony obszar przeszkodami - + Grid Siatka - + General Ogólne - + Map title and description Nazwa i opis mapy - + Players settings Ustawienia graczy - - + + Undo Cofnij - + Redo Przywróć - + Erase Wymaż - + Neutral Neutralny - + Validate Sprawdź - + + + + Update appearance Aktualizuj wygląd - + Recreate obstacles Powtórnie stwórz przeszkody - + Player 1 Gracz 1 - + Player 2 Gracz 2 - + Player 3 Gracz 3 - + Player 4 Gracz 4 - + Player 5 Gracz 5 - + Player 6 Gracz 6 - + Player 7 Gracz 7 - + Player 8 Gracz 8 - + Export as... - + + Confirmation + + + + + Unsaved changes will be lost, are you sure? + + + + + Failed to open map + + + + + Cannot open map from this folder + + + + Open map Otwórz mapę - + All supported maps (*.vmap *.h3m);;VCMI maps(*.vmap);;HoMM3 maps(*.h3m) Wszystkie wspierane mapy (*.vmap *.h3m);;Mapy VCMI(*.vmap);;Mapy HoMM3(*.h3m) - - + + Save map Zapisz mapę - - + + VCMI maps (*.vmap) Mapy VCMI (*.vmap) - + Type Typ - + View surface Pokaż powierzchnię + + + No objects selected + + + + + This operation is irreversible. Do you want to continue? + + + + + Errors occured. %1 objects were not updated + + + + + Save to image + + MapSettings @@ -327,162 +370,220 @@ Ustawienia mapy - + General Ogólne - + Map name Nazwa mapy - + Map description Opis mapy - + + Limit maximum heroes level + + + + Difficulty Poziom trudności - + + Mods + + + + + Mandatory mods for playing this map + + + + + Mod name + + + + + Version + + + + + Automatic assignment + + + + + Set required mods based on objects placed on the map. This method may cause problems if you have customized rewards, garrisons, etc from mods + + + + + Map objects mods + + + + + Set all mods having a game content as mandatory + + + + + Full content mods + + + + Events Zdarzenia - + Victory Zwycięstwo - + Victory message Komunikat zwycięstwa - + Only for human players Dotyczy tylko graczy ludzkich - + Allow standard victory Także standardowy warunek zwycięstwa - - + + Parameters Parametry - + Loss Porażka - + 7 days without town 7 dni bez miasta - + Defeat message Komunikat o porażce - + Abilities Umiejętności - + Spells Zaklęcia - + Artifacts Artefakty - + Heroes Bohaterowie - + Ok Ok - + No special victory Bez specjalnych warunków zwycięstwa - + Capture artifact Zdobądź artefakt - + Hire creatures Zdobądź stworzenia - + Accumulate resources Zbierz zasoby - + Construct building Zbuduj budynek - + Capture town Zdobądź miasto - + Defeat hero Pokonaj bohatera - + Transport artifact Przenieś artefakt - + No special loss Bez specjalnych warunków porażki - + Lose castle Utrata miasta - + Lose hero Utrata bohatera - + Time expired Upłynięcie czasu - + Days without town Dni bez miasta + + MapView + + + Can't place object + + + MessageWidget @@ -494,47 +595,51 @@ PlayerParams - No team - Brak drużyny + Brak drużyny - + Human/CPU Człowiek/Komputer - + CPU only Tylko komputer - + Team Drużyna - + Main town Główne miasto - + + Color + + + + Random faction Losowe miasto - + Generate hero at main Generuj bohatera w głównym - + (default) (domyślny) - + Player ID: %1 ID gracza: %1 @@ -552,7 +657,12 @@ Gracze - + + 1 + 1 + + + Ok Ok @@ -608,6 +718,11 @@ Map is not loaded + + + No factions allowed for player %1 + + No players allowed to play this map @@ -693,6 +808,11 @@ Map description is not specified + + + Map contains object from mod "%1", but doesn't require it + + Exception occurs during validation: %1 @@ -762,114 +882,139 @@ Gracze - + 0 0 - + Human/Computer Człowiek/Komputer - - - - + + + + Random Losowo - + Computer only Tylko komputer - + + Human teams + + + + + Computer teams + + + + Monster strength Siła potworów - + Weak Słaba - - + + Normal Normalna - + Strong Silna - + Water content Powierzchnia wody - + None Brak - + Islands Wyspy - + Template Szablon - + Custom seed Własny seed - + Generate random map Generuj mapę losową - + Ok Ok - + Cancel Anuluj + + + No template + + + + + No template for parameters scecified. Random map cannot be generated. + + + + + RMG failure + + main - + Filepath of the map to open. Lokalizacja pliku mapy do otworzenia. - + Extract original H3 archives into a separate folder. Wyodrębnij oryginalne archiwa H3 do osobnego folderu. - + From an extracted archive, it Splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's. Z wyodrębnionego archiwum, rozdzielenie TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 i Un44 do poszczególnych plików PNG. - + From an extracted archive, Converts single Images (found in Images folder) from .pcx to png. Z wyodrębnionego archiwum, konwersja pojedynczych obrazków (znalezionych w folderze Images) z .pcx do .png. - + Delete original files, for the ones splitted / converted. Usuń oryginalne pliki, dla już rozdzielonych / skonwertowanych. diff --git a/mapeditor/translation/russian.ts b/mapeditor/translation/russian.ts index 718573e2e..6c5641347 100644 --- a/mapeditor/translation/russian.ts +++ b/mapeditor/translation/russian.ts @@ -40,284 +40,327 @@ Файл - + Map Карта - + Edit Правка - + View Вид - + Player Игрок - + Toolbar Панель инструментов - + Minimap Мини-карта - + Map Objects View Объекты карты - + Browser Навигатор - + Inspector Инспектор - + Property Свойство - + Value Значение - + Terrains View Кисти земель - + Brush Кисть - + Terrains Земли - + Roads Дороги - + Rivers Реки - + Open Открыть - + Save Сохранить - + New Создать - + Save as... Сохранить как - + Ctrl+Shift+S Ctrl+Shift+S - + U/G П/Н - - + + View underground Вид на подземелье - + Pass Проходимость - + Cut Вырезать - + Copy Копировать - + Paste Вставить - + Fill Заливка - + Fills the selection with obstacles Заливает выбранное препятствиями - + Grid Сетка - + General Общее - + Map title and description Название и описание карты - + Players settings Настройки игроков - - + + Undo Отменить - + Redo Повторить - + Erase Удалить - + Neutral Нейтральный - + Validate Проверить - + + + + Update appearance Обновить вид - + Recreate obstacles Обновить препятствия - + Player 1 Игрок 1 - + Player 2 Игрок 2 - + Player 3 Игрок 3 - + Player 4 Игрок 4 - + Player 5 Игрок 5 - + Player 6 Игрок 6 - + Player 7 Игрок 7 - + Player 8 Игрок 8 - + Export as... - + + Confirmation + + + + + Unsaved changes will be lost, are you sure? + + + + + Failed to open map + + + + + Cannot open map from this folder + + + + Open map Открыть карту - + All supported maps (*.vmap *.h3m);;VCMI maps(*.vmap);;HoMM3 maps(*.h3m) Все поддерживаемые карты (*.vmap *.h3m);;Карты VCMI (*.vmap);;Карты Героев III (*.h3m) - - + + Save map Сохранить карту - - + + VCMI maps (*.vmap) Карты VCMI (*.vmap) - + Type Тип - + View surface Вид на поверхность + + + No objects selected + + + + + This operation is irreversible. Do you want to continue? + + + + + Errors occured. %1 objects were not updated + + + + + Save to image + + MapSettings @@ -327,162 +370,220 @@ Настройки карты - + General Общее - + Map name Название карты - + Map description Описание карты - + + Limit maximum heroes level + + + + Difficulty Сложность - + + Mods + + + + + Mandatory mods for playing this map + + + + + Mod name + + + + + Version + + + + + Automatic assignment + + + + + Set required mods based on objects placed on the map. This method may cause problems if you have customized rewards, garrisons, etc from mods + + + + + Map objects mods + + + + + Set all mods having a game content as mandatory + + + + + Full content mods + + + + Events События - + Victory Победа - + Victory message Сообщение о победе - + Only for human players Только для игроков-людей - + Allow standard victory Разрешить стандартную победу - - + + Parameters Параметры - + Loss Поражение - + 7 days without town 7 дней без городов - + Defeat message Сообщение о поражении - + Abilities Способности - + Spells Заклинания - + Artifacts Артефакты - + Heroes Герои - + Ok ОК - + No special victory Нет специальной победы - + Capture artifact Взять артефакт - + Hire creatures Нанять существ - + Accumulate resources Собрать ресурсы - + Construct building Построить - + Capture town Захватить город - + Defeat hero Победить героя - + Transport artifact Переместить артефакт - + No special loss Нет специального поражения - + Lose castle Потерять город - + Lose hero Потерять героя - + Time expired Не успеть ко времени - + Days without town Провести без городов + + MapView + + + Can't place object + + + MessageWidget @@ -494,47 +595,51 @@ PlayerParams - No team - Без команды + Без команды - + Human/CPU Человек/ИИ - + CPU only Только ИИ - + Team Команда - + Main town Главный город - + + Color + + + + Random faction Случайная фракция - + Generate hero at main Создать героя - + (default) (по умолчанию) - + Player ID: %1 Игрок: %1 @@ -552,7 +657,12 @@ Игрок - + + 1 + 1 + + + Ok ОК @@ -608,6 +718,11 @@ Map is not loaded + + + No factions allowed for player %1 + + No players allowed to play this map @@ -693,6 +808,11 @@ Map description is not specified + + + Map contains object from mod "%1", but doesn't require it + + Exception occurs during validation: %1 @@ -762,114 +882,139 @@ Игроки - + 0 0 - + Human/Computer Человек/ИИ - - - - + + + + Random Случайно - + Computer only Только ИИ - + + Human teams + + + + + Computer teams + + + + Monster strength Сила монстров - + Weak Слабо - - + + Normal Нормально - + Strong Сильно - + Water content Вода - + None Нет - + Islands Острова - + Template Шаблон - + Custom seed Пользовательское зерно - + Generate random map Сгенерировать случайную карту - + Ok ОК - + Cancel Отмена + + + No template + + + + + No template for parameters scecified. Random map cannot be generated. + + + + + RMG failure + + main - + Filepath of the map to open. Путь к файлу карты для открытия. - + Extract original H3 archives into a separate folder. Распаковать архивы оригинальных Героев III в отдельную папку. - + From an extracted archive, it Splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's. Разделение в распакованном архиве TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 и Un44 на отдельные PNG. - + From an extracted archive, Converts single Images (found in Images folder) from .pcx to png. Преобразование в расспакованном архиве изображений .pcx в .png. - + Delete original files, for the ones splitted / converted. Удалить оригиналы для преобразованных файлов. diff --git a/mapeditor/translation/spanish.ts b/mapeditor/translation/spanish.ts index 4d0ea87fc..73a9b60ed 100644 --- a/mapeditor/translation/spanish.ts +++ b/mapeditor/translation/spanish.ts @@ -27,8 +27,6 @@ Generando mapa - - MainWindow @@ -42,284 +40,327 @@ Archivo - + Map Mapa - + Edit Editar - + View Ver - + Player Jugador - + Toolbar Barra de herramientas - + Minimap Miniatura del mapa - + Map Objects View Vista de Objetos del Mapa - + Browser Navegador - + Inspector Inspector - + Property Propiedad - + Value Valor - + Terrains View Vista de Terrenos - + Brush Pincel - + Terrains Terrenos - + Roads Caminos - + Rivers Ríos - + Open Abrir - + Save Guardar - + New Nuevo - + Save as... Guardar como... - + Ctrl+Shift+S Ctrl+Shift+S - + U/G Subterráneo/Superficie - - + + View underground Ver subterráneo - + Pass Pasar - + Cut Cortar - + Copy Copiar - + Paste Pegar - + Fill Rellenar - + Fills the selection with obstacles Rellena la selección con obstáculos - + Grid Rejilla - + General General - + Map title and description Título y descripción del mapa - + Players settings Configuración de jugadores - - + + Undo Deshacer - + Redo Rehacer - + Erase Borrar - + Neutral Neutral - + Validate Validar - + + + + Update appearance Actualizar apariencia - + Recreate obstacles Recrear obstáculos - + Player 1 Jugador 1 - + Player 2 Jugador 2 - + Player 3 Jugador 3 - + Player 4 Jugador 4 - + Player 5 Jugador 5 - + Player 6 Jugador 6 - + Player 7 Jugador 7 - + Player 8 Jugador 8 - + Export as... Exportar como... - + + Confirmation + + + + + Unsaved changes will be lost, are you sure? + + + + + Failed to open map + + + + + Cannot open map from this folder + + + + Open map Abrir mapa - + All supported maps (*.vmap *.h3m);;VCMI maps(*.vmap);;HoMM3 maps(*.h3m) Todos los mapas soportados (*.vmap *.h3m);;Mapas VCMI (*.vmap);;Mapas HoMM3 (*.h3m) - - + + Save map Guardar mapa - - + + VCMI maps (*.vmap) Mapas VCMI (*.vmap) - + Type Tipo - + View surface Ver superficie + + + No objects selected + + + + + This operation is irreversible. Do you want to continue? + + + + + Errors occured. %1 objects were not updated + + + + + Save to image + + MapSettings @@ -329,162 +370,220 @@ Configuración del mapa - + General General - + Map name Nombre del mapa - + Map description Descripción del mapa - + + Limit maximum heroes level + + + + Difficulty Dificultad - + + Mods + + + + + Mandatory mods for playing this map + + + + + Mod name + + + + + Version + + + + + Automatic assignment + + + + + Set required mods based on objects placed on the map. This method may cause problems if you have customized rewards, garrisons, etc from mods + + + + + Map objects mods + + + + + Set all mods having a game content as mandatory + + + + + Full content mods + + + + Events Eventos - + Victory Victoria - + Victory message Mensaje de victoria - + Only for human players Solo para jugadores humanos - + Allow standard victory Permitir victoria estándar - - + + Parameters Parámetros - + Loss Derrota - + 7 days without town 7 días sin ciudad - + Defeat message Mensaje de derrota - + Abilities Habilidades - + Spells Hechizos - + Artifacts Artefactos - + Heroes Héroes - + Ok Aceptar - + No special victory Sin victoria especial - + Capture artifact Capturar artefacto - + Hire creatures Contratar criaturas - + Accumulate resources Acumular recursos - + Construct building Construir edificio - + Capture town Capturar ciudad - + Defeat hero Vencer héroe - + Transport artifact Transportar artefacto - + No special loss Sin pérdida especial - + Lose castle Perder castillo - + Lose hero Perder héroe - + Time expired Expiró el tiempo - + Days without town Días sin ciudad + + MapView + + + Can't place object + + + MessageWidget @@ -496,47 +595,51 @@ PlayerParams - No team - Sin equipo + Sin equipo - + Human/CPU Humano/CPU - + CPU only Sólo CPU - + Team Equipo - + Main town Ciudad principal - + + Color + + + + Random faction Facción aleatoria - + Generate hero at main Generar héroe en la ciudad principal - + (default) (predeterminado) - + Player ID: %1 ID de jugador: %1 @@ -554,7 +657,12 @@ Jugadores - + + 1 + 1 + + + Ok Aceptar @@ -610,6 +718,11 @@ Map is not loaded No se ha cargado ningún mapa + + + No factions allowed for player %1 + + No players allowed to play this map @@ -695,6 +808,11 @@ Map description is not specified No se especifica la descripción del mapa + + + Map contains object from mod "%1", but doesn't require it + + Exception occurs during validation: %1 @@ -764,114 +882,139 @@ Jugadores - + 0 0 - + Human/Computer Humano/Ordenador - - - - + + + + Random Aleatorio - + Computer only Sólo ordenador - + + Human teams + + + + + Computer teams + + + + Monster strength Fuerza de monstruos - + Weak Débil - - + + Normal Normal - + Strong Fuerte - + Water content Contenido del agua - + None Ninguno - + Islands Islas - + Template Plantilla - + Custom seed Semilla personalizada - + Generate random map Generar un mapa aleatorio - + Ok Aceptar - + Cancel Cancelar + + + No template + + + + + No template for parameters scecified. Random map cannot be generated. + + + + + RMG failure + + main - + Filepath of the map to open. Ruta del archivo del mapa a abrir. - + Extract original H3 archives into a separate folder. Extraer archivos originales de H3 en una carpeta separada. - + From an extracted archive, it Splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's. Desde un archivo extraído, separa TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 y Un44 en imágenes PNG individuales. - + From an extracted archive, Converts single Images (found in Images folder) from .pcx to png. Desde un archivo extraído, convierte imágenes individuales (encontradas en la carpeta Imágenes) de .pcx a png. - + Delete original files, for the ones splitted / converted. Eliminar archivos originales, por los que se han separado / convertido. diff --git a/mapeditor/translation/ukrainian.ts b/mapeditor/translation/ukrainian.ts index d823173da..8470bca90 100644 --- a/mapeditor/translation/ukrainian.ts +++ b/mapeditor/translation/ukrainian.ts @@ -40,284 +40,327 @@ Файл - + Map Мапа - + Edit Редагування - + View Вигляд - + Player Гравець - + Toolbar Панель інструментів - + Minimap Мінімапа - + Map Objects View Перегляд об'єктів мапи - + Browser Навігатор - + Inspector Інспектор - + Property Властивість - + Value Значення - + Terrains View Перегляд поверхні - + Brush Кисть - + Terrains Землі - + Roads Шляхи - + Rivers Річки - + Open Відкрити - + Save Зберегти - + New Створити - + Save as... - Зберегти як + Зберегти як... - + Ctrl+Shift+S Ctrl+Shift+S - + U/G П/З - - + + View underground Дивитись підземелля - + Pass Прохідність - + Cut Вирізати - + Copy Скопіювати - + Paste Вставити - + Fill Заповнити - + Fills the selection with obstacles Заповнити перешкодами - + Grid Сітка - + General Загальний - + Map title and description Назва та опис мапи - + Players settings Налаштування гравців - - + + Undo Відмінити - + Redo Повторити - + Erase Стерти - + Neutral Нейтральний - + Validate Перевірити - + + + + Update appearance Оновити вигляд - + Recreate obstacles Оновити перешкоди - + Player 1 Гравець 1 - + Player 2 Гравець 2 - + Player 3 Гравець 3 - + Player 4 Гравець 4 - + Player 5 Гравець 5 - + Player 6 Гравець 6 - + Player 7 Гравець 7 - + Player 8 Гравець 8 - + Export as... + Експортувати як... + + + + Confirmation - + + Unsaved changes will be lost, are you sure? + + + + + Failed to open map + + + + + Cannot open map from this folder + + + + Open map Відкрити мапу - + All supported maps (*.vmap *.h3m);;VCMI maps(*.vmap);;HoMM3 maps(*.h3m) Всі підтримувані мапи (*.vmap *.h3m);;Мапи VCMI (*.vmap);;Мапи HoMM3 (*.h3m) - - + + Save map Зберегти мапу - - + + VCMI maps (*.vmap) Мапи VCMI - + Type Тип - + View surface Дивитись поверхню + + + No objects selected + + + + + This operation is irreversible. Do you want to continue? + + + + + Errors occured. %1 objects were not updated + + + + + Save to image + + MapSettings @@ -327,162 +370,220 @@ Налаштування мапи - + General Загальний - + Map name Назва мапи - + Map description Опис мапи - + + Limit maximum heroes level + Обмежити максимальний рівень героїв + + + Difficulty Складність - + + Mods + Модифікації + + + + Mandatory mods for playing this map + Модифікації необхідні для гри на мапи + + + + Mod name + Назва модифікації + + + + Version + Версія + + + + Automatic assignment + Автоматичне визначення + + + + Set required mods based on objects placed on the map. This method may cause problems if you have customized rewards, garrisons, etc from mods + Встановити необхідні модифікації на основі об'єктів, розміщених на мапі. Цей метод може викликати проблеми, якщо у вас є налаштовані нагороди, гарнізони тощо з модів + + + + Map objects mods + Моди з об'єктами мапи + + + + Set all mods having a game content as mandatory + Встановити усі моди з ігровим контентом як обов'язкові + + + + Full content mods + Усі модифікації + + + Events Події - + Victory Перемога - + Victory message Повідомлення про перемогу - + Only for human players Тільки для гравців-людей - + Allow standard victory Дозволити типову перемогу - - + + Parameters Параметри - + Loss Програш - + 7 days without town 7 днів без міста - + Defeat message Повідомлення про програш - + Abilities Уміння - + Spells Закляття - + Artifacts Артефакти - + Heroes Герої - + Ok Підтвердити - + No special victory Немає особливої перемоги - + Capture artifact Отримати артефакт - + Hire creatures Найняти істот - + Accumulate resources Накопичити ресурси - + Construct building Побудувати будівлю - + Capture town Захопити місто - + Defeat hero Перемогти героя - + Transport artifact Доставити артефакт - + No special loss Немає особливої поразки - + Lose castle Втратити місто - + Lose hero Втратити героя - + Time expired Закінчився час - + Days without town Дні без міста + + MapView + + + Can't place object + + + MessageWidget @@ -494,47 +595,47 @@ PlayerParams - - No team - Без команди - - - + Human/CPU Людина/Комп'ютер - + CPU only Тільки комп'ютер - + Team Команда - + Main town Головне місто - + + Color + Колір + + + Random faction Випадкова фракція - + Generate hero at main Згенерувати героя - + (default) (за замовчуванням) - + Player ID: %1 Гравець %1 @@ -552,7 +653,12 @@ Гравці - + + 1 + 1 + + + Ok Підтвердити @@ -608,6 +714,11 @@ Map is not loaded + + + No factions allowed for player %1 + + No players allowed to play this map @@ -693,6 +804,11 @@ Map description is not specified + + + Map contains object from mod "%1", but doesn't require it + + Exception occurs during validation: %1 @@ -762,114 +878,139 @@ Гравців - + 0 0 - + Human/Computer Людина/Комп'ютер - - - - + + + + Random Випадково - + Computer only Тільки комп'ютер - + + Human teams + Команди людей + + + + Computer teams + Команди комп'ютерів + + + Monster strength Сила монстрів - + Weak Слабкі - - + + Normal Типова - + Strong Сильні - + Water content Наявність води - + None Відсутня - + Islands Острови - + Template Шаблон - + Custom seed Користувацьке зерно - + Generate random map Згенерувати випадкову карту - + Ok Підтвердити - + Cancel Скасувати + + + No template + + + + + No template for parameters scecified. Random map cannot be generated. + + + + + RMG failure + + main - + Filepath of the map to open. - + Extract original H3 archives into a separate folder. - + From an extracted archive, it Splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's. - + From an extracted archive, Converts single Images (found in Images folder) from .pcx to png. - + Delete original files, for the ones splitted / converted.