1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-28 08:48:48 +02:00

Merge remote-tracking branch 'origin/beta' into object_distribution

This commit is contained in:
Tomasz Zieliński 2023-03-31 15:44:14 +02:00
commit 308b42549b
70 changed files with 2583 additions and 1124 deletions

View File

@ -118,17 +118,17 @@
// few strings from WoG used by vcmi
"vcmi.stackExperience.description" : "» 经 验 获 得 明 细 «\n\n生物类型 ................... : %s\n经验等级 ................. : %s (%i)\n经验点数 ............... : %i\n下一个等级所需经验 .. : %i\n每次战斗最大获得经验 ... : %i%% (%i)\n获得经验的生物数量 .... : %i\n最大招募数量\n不会丢失经验升级 .... : %i\n经验倍数 ........... : %.2f\n升级倍数 .............. : %.2f\n10级后经验值 ........ : %i\n最大招募数量下\n 升级到10级所需经验数量: %i",
"vcmi.stackExperience.rank.1" : "新兵 1级",
"vcmi.stackExperience.rank.2" : "列兵 2级",
"vcmi.stackExperience.rank.3" : "下士 3级",
"vcmi.stackExperience.rank.4" : "中士 4级",
"vcmi.stackExperience.rank.5" : "上士 5级",
"vcmi.stackExperience.rank.6" : "少尉 6级",
"vcmi.stackExperience.rank.7" : "中尉 7级",
"vcmi.stackExperience.rank.8" : "上尉 8级",
"vcmi.stackExperience.rank.9" : "少校 9级",
"vcmi.stackExperience.rank.10" : "中校 10级",
"vcmi.stackExperience.rank.11" : "上校 11级",
"vcmi.stackExperience.rank.0" : "新兵 1级",
"vcmi.stackExperience.rank.1" : "列兵 2级",
"vcmi.stackExperience.rank.2" : "下士 3级",
"vcmi.stackExperience.rank.3" : "中士 4级",
"vcmi.stackExperience.rank.4" : "上士 5级",
"vcmi.stackExperience.rank.5" : "少尉 6级",
"vcmi.stackExperience.rank.6" : "中尉 7级",
"vcmi.stackExperience.rank.7" : "上尉 8级",
"vcmi.stackExperience.rank.8" : "少校 9级",
"vcmi.stackExperience.rank.9" : "中校 10级",
"vcmi.stackExperience.rank.10" : "上校 11级",
"core.bonus.ADDITIONAL_ATTACK.name": "双击",
"core.bonus.ADDITIONAL_ATTACK.description": "可以攻击两次",
@ -244,10 +244,6 @@
"core.bonus.REBIRTH.description": "{val}% 数量死亡后会复活",
"core.bonus.RETURN_AFTER_STRIKE.name": "攻击并返回",
"core.bonus.RETURN_AFTER_STRIKE.description": "攻击后回到初始位置",
"core.bonus.SELF_LUCK.name": "永久幸运",
"core.bonus.SELF_LUCK.description": "永久拥有幸运值",
"core.bonus.SELF_MORALE.name": "士气高涨",
"core.bonus.SELF_MORALE.description": "永久拥有高昂的士气",
"core.bonus.SHOOTER.name": "射手",
"core.bonus.SHOOTER.description": "生物可以设计",
"core.bonus.SHOOTS_ALL_ADJACENT.name": "范围远程攻击",

View File

@ -1,5 +1,5 @@
{
"vcmi.adventureMap.monsterThreat.title" : "\n\n Threat: ",
"vcmi.adventureMap.monsterThreat.title" : "\n\nThreat: ",
"vcmi.adventureMap.monsterThreat.levels.0" : "Effortless",
"vcmi.adventureMap.monsterThreat.levels.1" : "Very Weak",
"vcmi.adventureMap.monsterThreat.levels.2" : "Weak",
@ -13,24 +13,24 @@
"vcmi.adventureMap.monsterThreat.levels.10" : "Deadly",
"vcmi.adventureMap.monsterThreat.levels.11" : "Impossible",
"vcmi.adventureMap.confirmRestartGame" : "Are you sure you want to restart game?",
"vcmi.adventureMap.noTownWithMarket" : "No available marketplace!",
"vcmi.adventureMap.noTownWithTavern" : "No available town with tavern!",
"vcmi.adventureMap.spellUnknownProblem" : "Unknown problem with this spell, no more information available.",
"vcmi.adventureMap.confirmRestartGame" : "Are you sure you want to restart the game?",
"vcmi.adventureMap.noTownWithMarket" : "There are no available marketplaces!",
"vcmi.adventureMap.noTownWithTavern" : "There are no available towns with taverns!",
"vcmi.adventureMap.spellUnknownProblem" : "There is an unknown problem with this spell! No more information is available.",
"vcmi.adventureMap.playerAttacked" : "Player has been attacked: %s",
"vcmi.adventureMap.moveCostDetails" : "Movement points - Cost: %TURNS turns + %POINTS points, Remaining points: %REMAINING",
"vcmi.adventureMap.moveCostDetailsNoTurns" : "Movement points - Cost: %POINTS points, Remaining points: %REMAINING",
"vcmi.server.errors.existingProcess" : "Another vcmiserver process is running, please terminate it first",
"vcmi.server.errors.modsIncompatibility" : "Required mods to load game:",
"vcmi.server.confirmReconnect" : "Connect to the last session?",
"vcmi.server.errors.existingProcess" : "Another VCMI server process is running. Please terminate it before starting a new game.",
"vcmi.server.errors.modsIncompatibility" : "The following mods are required to load the game:",
"vcmi.server.confirmReconnect" : "Do you want to reconnect to the last session?",
"vcmi.settingsMainWindow.generalTab.hover" : "General",
"vcmi.settingsMainWindow.generalTab.help" : "Switches to General Options tab, which contains settings related to general game client behavior",
"vcmi.settingsMainWindow.battleTab.hover" : "Battle",
"vcmi.settingsMainWindow.battleTab.help" : "Switches to Battle Options tab, which allows configuring game behavior during battles",
"vcmi.settingsMainWindow.adventureTab.hover" : "Adventure Map",
"vcmi.settingsMainWindow.adventureTab.help" : "Switches to Adventure Map Options tab - adventure map is part of the game where you can move your heroes",
"vcmi.settingsMainWindow.adventureTab.help" : "Switches to Adventure Map Options tab (adventure map is the section of the game where players can control the movements of their heroes)",
"vcmi.systemOptions.videoGroup" : "Video Settings",
"vcmi.systemOptions.audioGroup" : "Audio Settings",
@ -38,51 +38,50 @@
"vcmi.systemOptions.townsGroup" : "Town Screen",
"vcmi.systemOptions.fullscreenButton.hover" : "Fullscreen",
"vcmi.systemOptions.fullscreenButton.help" : "{Fullscreen}\n\n If selected, VCMI will run in fullscreen mode, otherwise VCMI will run in window",
"vcmi.systemOptions.fullscreenButton.help" : "{Fullscreen}\n\nIf selected, VCMI will run in fullscreen mode, otherwise it will run in windowed mode",
"vcmi.systemOptions.resolutionButton.hover" : "Resolution: %wx%h",
"vcmi.systemOptions.resolutionButton.help" : "{Select Resolution}\n\n Change in-game screen resolution. Game restart required to apply new resolution.",
"vcmi.systemOptions.resolutionButton.help" : "{Select Resolution}\n\nChange in-game screen resolution. A game restart is required to apply the new resolution.",
"vcmi.systemOptions.resolutionMenu.hover" : "Select Resolution",
"vcmi.systemOptions.resolutionMenu.help" : "Change in-game screen resolution.",
"vcmi.systemOptions.fullscreenFailed" : "{Fullscreen}\n\n Failed to switch to fullscreen mode! Current resolution is not supported by display!",
"vcmi.systemOptions.fullscreenFailed" : "{Fullscreen}\n\nFailed to switch to fullscreen mode! The current resolution is not supported by the display!",
"vcmi.systemOptions.framerateButton.hover" : "Show FPS",
"vcmi.systemOptions.framerateButton.help" : "{Show FPS}\n\n Toggles visibility of Frames Per Second counter in corner of game window.",
"vcmi.systemOptions.framerateButton.help" : "{Show FPS}\n\nToggle the visibility of the Frames Per Second counter in the corner of the game window",
"vcmi.adventureOptions.infoBarPick.hover" : "Show Messages in Info Panel",
"vcmi.adventureOptions.infoBarPick.help" : "{Show Messages in Info Panel}\n\nWhenever possible, game messages from visiting map objects will be shown in info bar instead of showing up as popup windows",
"vcmi.adventureOptions.infoBarPick.help" : "{Show Messages in Info Panel}\n\nWhenever possible, game messages from visiting map objects will be shown in the info pannel, instead of popping up in a separate window.",
"vcmi.adventureOptions.numericQuantities.hover" : "Numeric Creature Quantities",
"vcmi.adventureOptions.numericQuantities.help" : "{Numeric Creature Quantities}\n\n Shows approximate enemy creatures quantities in numeric A-B format.",
"vcmi.adventureOptions.numericQuantities.help" : "{Numeric Creature Quantities}\n\nShow the approximate quantities of enemy creatures in the numeric A-B format.",
"vcmi.adventureOptions.forceMovementInfo.hover" : "Always Show Movement Cost",
"vcmi.adventureOptions.forceMovementInfo.help" : "{Always Show Movement Cost}\n\n Replaces default status bar info with movement points data without need to hold ALT button.",
"vcmi.adventureOptions.forceMovementInfo.help" : "{Always Show Movement Cost}\n\nAlways show movement points data in status bar information. (Instead of viewing it only while you hold down ALT key)",
"vcmi.adventureOptions.showGrid.hover" : "Show Grid",
"vcmi.adventureOptions.showGrid.help" : "{Show Grid}\n\n Shows grid overlay, showing borders between adventure map tiles.",
"vcmi.adventureOptions.mapSwipe.hover" : "Map Swipe",
"vcmi.adventureOptions.mapSwipe.help" : "{Map Swipe}\n\n Allows map movement via finger swipe gesture on systems with touchscreen. As of right now, can also be accessed via left mouse button.",
"vcmi.adventureOptions.showGrid.help" : "{Show Grid}\n\nShow the grid overlay, highlighting the borders between adventure map tiles.",
"vcmi.adventureOptions.mapSwipe.hover" : "Map Swipe/Panning",
"vcmi.adventureOptions.mapSwipe.help" : "{Map Swipe/Panning}\n\nOn touchscreen devices, you can move the map by swiping with your finger. To pan the map using the mouse, hold down the left or middle mouse button and move the mouse.",
"vcmi.adventureOptions.mapScrollSpeed1.hover": "",
"vcmi.adventureOptions.mapScrollSpeed5.hover": "",
"vcmi.adventureOptions.mapScrollSpeed6.hover": "",
"vcmi.adventureOptions.mapScrollSpeed1.help": "Set map scrolling speed to very slow",
"vcmi.adventureOptions.mapScrollSpeed5.help": "Set map scrolling speed to very fast",
"vcmi.adventureOptions.mapScrollSpeed6.help": "Set map scrolling speed to instantaneous.",
"vcmi.adventureOptions.mapScrollSpeed1.help": "Set the map scrolling speed to very slow",
"vcmi.adventureOptions.mapScrollSpeed5.help": "Set the map scrolling speed to very fast",
"vcmi.adventureOptions.mapScrollSpeed6.help": "Set the map scrolling speed to instantaneous.",
"vcmi.battleOptions.queueSizeLabel.hover": "Show Creature Turn Order",
"vcmi.battleOptions.queueSizeLabel.hover": "Show Turn Order Queue",
"vcmi.battleOptions.queueSizeNoneButton.hover": "OFF",
"vcmi.battleOptions.queueSizeAutoButton.hover": "AUTO",
"vcmi.battleOptions.queueSizeSmallButton.hover": "SMALL",
"vcmi.battleOptions.queueSizeBigButton.hover": "BIG",
"vcmi.battleOptions.queueSizeNoneButton.help": "Completely disables visibility of creature turn order in battle",
"vcmi.battleOptions.queueSizeAutoButton.help": "Sets turn order size depending on game resolution (small when playing with screen resolution below 700 pixels high, big otherwise)",
"vcmi.battleOptions.queueSizeSmallButton.help": "Sets turn order size to small",
"vcmi.battleOptions.queueSizeBigButton.help": "Sets turn order size to big (not supported if game resolution is less than 700 pixels high)",
"vcmi.battleOptions.queueSizeNoneButton.help": "Do not display Turn Order Queue",
"vcmi.battleOptions.queueSizeAutoButton.help": "Automatically adjust the size of the turn order queue based on the game's resolution(SMALL size is used when playing the game on a resolution with a height lower than 700 pixels, BIG size is used otherwise)",
"vcmi.battleOptions.queueSizeSmallButton.help": "Sets turn order queue size to SMALL",
"vcmi.battleOptions.queueSizeBigButton.help": "Sets turn order queue size to BIG (not supported if game resolution height is less than 700 pixels)",
"vcmi.battleOptions.animationsSpeed1.hover": "",
"vcmi.battleOptions.animationsSpeed5.hover": "",
"vcmi.battleOptions.animationsSpeed6.hover": "",
"vcmi.battleOptions.animationsSpeed1.help": "Sets animation speed to very slow",
"vcmi.battleOptions.animationsSpeed5.help": "Sets animation speed to very fast",
"vcmi.battleOptions.animationsSpeed6.help": "Sets animation speed to instantaneous",
"vcmi.battleOptions.animationsSpeed1.help": "Set animation speed to very slow",
"vcmi.battleOptions.animationsSpeed5.help": "Set animation speed to very fast",
"vcmi.battleOptions.animationsSpeed6.help": "Set animation speed to instantaneous",
"vcmi.battleOptions.skipBattleIntroMusic.hover": "Skip Intro Music",
"vcmi.battleOptions.skipBattleIntroMusic.help": "{Skip Intro Music}\n\n Skip short music that plays at beginning of each battle before action starts. Can also be skipped by pressing ESC key.",
"vcmi.battleWindow.pressKeyToSkipIntro" : "Press any key to skip battle intro",
"vcmi.battleOptions.skipBattleIntroMusic.help": "{Skip Intro Music}\n\nAllow actions during the intro music that plays at the beginning of each battle",
"vcmi.battleWindow.pressKeyToSkipIntro" : "Press any key to start battle immediately",
"vcmi.battleWindow.damageEstimation.melee" : "Attack %CREATURE (%DAMAGE).",
"vcmi.battleWindow.damageEstimation.meleeKills" : "Attack %CREATURE (%DAMAGE, %KILLS).",
@ -96,11 +95,11 @@
"vcmi.battleWindow.damageEstimation.kills.1" : "%d will perish",
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Show Available Creatures",
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Show Available Creatures}\n\n Shows creatures available to purchase instead of their growth in town summary (bottom-left corner).",
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Show Available Creatures}\n\nShow the number of creatures available to purchase instead of their growth in town summary (bottom-left corner of town screen).",
"vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Show Weekly Growth of Creatures",
"vcmi.otherOptions.creatureGrowthAsDwellingLabel.help" : "{Show Weekly Growth of Creatures}\n\n Shows creatures' weekly growth instead of available amount in town summary (bottom-left corner).",
"vcmi.otherOptions.creatureGrowthAsDwellingLabel.help" : "{Show Weekly Growth of Creatures}\n\nShow creatures' weekly growth instead of available amount in town summary (bottom-left corner of town screen).",
"vcmi.otherOptions.compactTownCreatureInfo.hover": "Compact Creature Info",
"vcmi.otherOptions.compactTownCreatureInfo.help": "{Compact Creature Info}\n\n Smaller town creatures information in town summary.",
"vcmi.otherOptions.compactTownCreatureInfo.help": "{Compact Creature Info}\n\nShow smaller information for town creatures in town summary (bottom-left corner of town screen).",
"vcmi.townHall.missingBase" : "Base building %s must be built first",
"vcmi.townHall.noCreaturesToRecruit" : "There are no creatures to recruit!",
@ -120,20 +119,20 @@
"vcmi.logicalExpressions.allOf" : "All of the following:",
"vcmi.logicalExpressions.noneOf" : "None of the following:",
"vcmi.heroWindow.openCommander.hover" : "Open commander window",
"vcmi.heroWindow.openCommander.help" : "Displays information about commander of this hero",
"vcmi.heroWindow.openCommander.hover" : "Open commander info window",
"vcmi.heroWindow.openCommander.help" : "Shows details about the commander of this hero",
"vcmi.commanderWindow.artifactMessage" : "Do you want to give this artifact back to hero?",
"vcmi.commanderWindow.artifactMessage" : "Do you want to return this artifact to the hero?",
"vcmi.creatureWindow.showBonuses.hover" : "Switch to bonuses view",
"vcmi.creatureWindow.showBonuses.help" : "Displays all active bonuses of the commander",
"vcmi.creatureWindow.showBonuses.help" : "Display all active bonuses of the commander",
"vcmi.creatureWindow.showSkills.hover" : "Switch to skills view",
"vcmi.creatureWindow.showSkills.help" : "Displays all learned skills of the commander",
"vcmi.creatureWindow.returnArtifact.hover" : "Give back artifact",
"vcmi.creatureWindow.returnArtifact.help" : "Use this button to return stack artifact back into hero backpack",
"vcmi.creatureWindow.showSkills.help" : "Display all learned skills of the commander",
"vcmi.creatureWindow.returnArtifact.hover" : "Return artifact",
"vcmi.creatureWindow.returnArtifact.help" : "Click this button to return the artifact to the hero's backpack",
"vcmi.questLog.hideComplete.hover" : "Hide complete quests",
"vcmi.questLog.hideComplete.help" : "Hide all quests that already completed",
"vcmi.questLog.hideComplete.help" : "Hide all completed quests",
"vcmi.randomMapTab.widgets.defaultTemplate" : "(default)",
"vcmi.randomMapTab.widgets.templateLabel" : "Template",
@ -143,108 +142,108 @@
// few strings from WoG used by vcmi
"vcmi.stackExperience.description" : "» S t a c k E x p e r i e n c e D e t a i l s «\n\nCreature Type ................... : %s\nExperience Rank ................. : %s (%i)\nExperience Points ............... : %i\nExperience Points to Next Rank .. : %i\nMaximum Experience per Battle ... : %i%% (%i)\nNumber of Creatures in stack .... : %i\nMaximum New Recruits\n without losing current Rank .... : %i\nExperience Multiplier ........... : %.2f\nUpgrade Multiplier .............. : %.2f\nExperience after Rank 10 ........ : %i\nMaximum New Recruits to remain at\n Rank 10 if at Maximum Experience : %i",
"vcmi.stackExperience.rank.1" : "Basic",
"vcmi.stackExperience.rank.2" : "Novice",
"vcmi.stackExperience.rank.3" : "Trained",
"vcmi.stackExperience.rank.4" : "Skilled",
"vcmi.stackExperience.rank.5" : "Proven",
"vcmi.stackExperience.rank.6" : "Veteran",
"vcmi.stackExperience.rank.7" : "Adept",
"vcmi.stackExperience.rank.8" : "Expert",
"vcmi.stackExperience.rank.9" : "Elite",
"vcmi.stackExperience.rank.10" : "Master",
"vcmi.stackExperience.rank.11" : "Ace",
"vcmi.stackExperience.rank.0" : "Basic",
"vcmi.stackExperience.rank.1" : "Novice",
"vcmi.stackExperience.rank.2" : "Trained",
"vcmi.stackExperience.rank.3" : "Skilled",
"vcmi.stackExperience.rank.4" : "Proven",
"vcmi.stackExperience.rank.5" : "Veteran",
"vcmi.stackExperience.rank.6" : "Adept",
"vcmi.stackExperience.rank.7" : "Expert",
"vcmi.stackExperience.rank.8" : "Elite",
"vcmi.stackExperience.rank.9" : "Master",
"vcmi.stackExperience.rank.10" : "Ace",
"core.bonus.ADDITIONAL_ATTACK.name": "Double Strike",
"core.bonus.ADDITIONAL_ATTACK.description": "Attacks twice",
"core.bonus.ADDITIONAL_RETALIATION.name": "Additional retaliations",
"core.bonus.ADDITIONAL_RETALIATION.description": "May Retaliate ${val} extra times",
"core.bonus.ADDITIONAL_RETALIATION.description": "May retaliate ${val} extra times",
"core.bonus.AIR_IMMUNITY.name": "Air immunity",
"core.bonus.AIR_IMMUNITY.description": "Immune to all Air school spells",
"core.bonus.AIR_IMMUNITY.description": "Immune to all spells from the school of Air magic",
"core.bonus.ATTACKS_ALL_ADJACENT.name": "Attack all around",
"core.bonus.ATTACKS_ALL_ADJACENT.description": "Attacks all adjacent enemies",
"core.bonus.BLOCKS_RETALIATION.name": "No retaliation",
"core.bonus.BLOCKS_RETALIATION.description": "Enemy cannot retaliate",
"core.bonus.BLOCKS_RANGED_RETALIATION.name": "No ranged retaliation",
"core.bonus.BLOCKS_RANGED_RETALIATION.description": "Enemy cannot Retaliate by shooting",
"core.bonus.BLOCKS_RANGED_RETALIATION.description": "Enemy cannot retaliate by using a ranged attack",
"core.bonus.CATAPULT.name": "Catapult",
"core.bonus.CATAPULT.description": "Attacks siege walls",
"core.bonus.CATAPULT_EXTRA_SHOTS.name": "Additional siege attacks",
"core.bonus.CATAPULT_EXTRA_SHOTS.description": "Can hit siege walls ${val} extra times per attack",
"core.bonus.CHANGES_SPELL_COST_FOR_ALLY.name": "Reduce Casting Cost (${val})",
"core.bonus.CHANGES_SPELL_COST_FOR_ALLY.description": "Reduces spell cost for hero",
"core.bonus.CHANGES_SPELL_COST_FOR_ALLY.description": "Reduces the spellcasting cost for the hero by ${val}",
"core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.name": "Magic Damper (${val})",
"core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.description": "Increases Cost of enemy spells",
"core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.description": "Increases spellcasting cost of enemy spells by ${val}",
"core.bonus.CHARGE_IMMUNITY.name": "Immune to Charge",
"core.bonus.CHARGE_IMMUNITY.description": "Immune to Champion charge",
"core.bonus.CHARGE_IMMUNITY.description": "Immune to Cavalier's and Champion's Charge",
"core.bonus.DARKNESS.name": "Darkness cover",
"core.bonus.DARKNESS.description": "Adds ${val} darkness radius",
"core.bonus.DARKNESS.description": "Creates a shroud of darkness with a ${val} radius",
"core.bonus.DEATH_STARE.name": "Death Stare (${val}%)",
"core.bonus.DEATH_STARE.description": "${val}% chance to kill single creature",
"core.bonus.DEATH_STARE.description": "Has a ${val}% chance to kill a single creature",
"core.bonus.DEFENSIVE_STANCE.name": "Defense Bonus",
"core.bonus.DEFENSIVE_STANCE.description": "+${val} Defense when defending",
"core.bonus.DESTRUCTION.name": "Destruction",
"core.bonus.DESTRUCTION.description": "Has ${val}% chance to kill extra units after attack",
"core.bonus.DOUBLE_DAMAGE_CHANCE.name": "Death Blow",
"core.bonus.DOUBLE_DAMAGE_CHANCE.description": "${val}% chance for double damage",
"core.bonus.DOUBLE_DAMAGE_CHANCE.description": "Has a ${val}% chance of dealing double base damage when attacking",
"core.bonus.DRAGON_NATURE.name": "Dragon",
"core.bonus.DRAGON_NATURE.description": "Creature has a Dragon Nature",
"core.bonus.DIRECT_DAMAGE_IMMUNITY.name": "Direct Damage Immunity",
"core.bonus.DIRECT_DAMAGE_IMMUNITY.description": "Immune to direct damage spells",
"core.bonus.EARTH_IMMUNITY.name": "Earth immunity",
"core.bonus.EARTH_IMMUNITY.description": "Immune to all Earth school spells",
"core.bonus.EARTH_IMMUNITY.description": "Immune to all spells from the school of Earth magic",
"core.bonus.ENCHANTER.name": "Enchanter",
"core.bonus.ENCHANTER.description": "Can cast mass ${subtype.spell} every turn",
"core.bonus.ENCHANTED.name": "Enchanted",
"core.bonus.ENCHANTED.description": "Affected by permanent ${subtype.spell}",
"core.bonus.ENEMY_DEFENCE_REDUCTION.name": "Ignore Defense (${val}%)",
"core.bonus.ENEMY_DEFENCE_REDUCTION.description": "Ignores part of Defence for the attack",
"core.bonus.ENEMY_DEFENCE_REDUCTION.description": "When attacking, ${val}% of the defender's defense is ignored",
"core.bonus.FIRE_IMMUNITY.name": "Fire immunity",
"core.bonus.FIRE_IMMUNITY.description": "Immune to all Fire school spells",
"core.bonus.FIRE_IMMUNITY.description": "Immune to all spells from the school of Fire magic",
"core.bonus.FIRE_SHIELD.name": "Fire Shield (${val}%)",
"core.bonus.FIRE_SHIELD.description": "Reflects part of melee damage",
"core.bonus.FIRST_STRIKE.name": "First Strike",
"core.bonus.FIRST_STRIKE.description": "This creature attacks first instead of retaliating",
"core.bonus.FIRST_STRIKE.description": "This creature retaliates before being attacked",
"core.bonus.FEAR.name": "Fear",
"core.bonus.FEAR.description": "Causes Fear on an enemy stack",
"core.bonus.FEARLESS.name": "Fearless",
"core.bonus.FEARLESS.description": "Immune to Fear ability",
"core.bonus.FLYING.name": "Fly",
"core.bonus.FLYING.description": "Can Fly (ignores obstacles)",
"core.bonus.FLYING.description": "Flies when moving (ignores obstacles)",
"core.bonus.FREE_SHOOTING.name": "Shoot Close",
"core.bonus.FREE_SHOOTING.description": "Can shoot in Close Combat",
"core.bonus.FREE_SHOOTING.description": "Can use ranged attacks at melee range",
"core.bonus.GARGOYLE.name": "Gargoyle",
"core.bonus.GARGOYLE.description": "Cannot be rised or healed",
"core.bonus.GARGOYLE.description": "Cannot be raised or healed",
"core.bonus.GENERAL_DAMAGE_REDUCTION.name": "Reduce Damage (${val}%)",
"core.bonus.GENERAL_DAMAGE_REDUCTION.description": "Reduces physical damage from ranged or melee",
"core.bonus.GENERAL_DAMAGE_REDUCTION.description": "Reduces physical damage from ranged or melee attacks",
"core.bonus.HATE.name": "Hates ${subtype.creature}",
"core.bonus.HATE.description": "Does ${val}% more damage",
"core.bonus.HATE.description": "Does ${val}% more damage to ${subtype.creature}",
"core.bonus.HEALER.name": "Healer",
"core.bonus.HEALER.description": "Heals allied units",
"core.bonus.HP_REGENERATION.name": "Regeneration",
"core.bonus.HP_REGENERATION.description": "Heals ${SHval} hit points every round",
"core.bonus.JOUSTING.name": "Champion Charge",
"core.bonus.JOUSTING.description": "+${val}% damage per hex travelled",
"core.bonus.JOUSTING.name": "Champion charge",
"core.bonus.JOUSTING.description": "+${val}% damage for each hex travelled",
"core.bonus.KING.name": "King",
"core.bonus.KING.description": "Vulnerable to SLAYER level ${val} or higher",
"core.bonus.LEVEL_SPELL_IMMUNITY.name": "Spell immunity 1-${val}",
"core.bonus.LEVEL_SPELL_IMMUNITY.description": "Immune to spells of levels 1-${val}",
"core.bonus.LIMITED_SHOOTING_RANGE.name" : "Limited shooting range",
"core.bonus.LIMITED_SHOOTING_RANGE.description" : "Cannot shoot targets beyond ${val} hexes away",
"core.bonus.LIMITED_SHOOTING_RANGE.description" : "Unable to target units farther than ${val} hexes",
"core.bonus.LIFE_DRAIN.name": "Drain life (${val}%)",
"core.bonus.LIFE_DRAIN.description": "Drains ${val}% of damage dealt",
"core.bonus.MANA_CHANNELING.name": "Magic Channel ${val}%",
"core.bonus.MANA_CHANNELING.description": "Gives your hero mana spent by enemy",
"core.bonus.MANA_CHANNELING.description": "Gives your hero ${val}% of the mana spent by the enemy",
"core.bonus.MANA_DRAIN.name": "Mana Drain",
"core.bonus.MANA_DRAIN.description": "Drains ${val} mana every turn",
"core.bonus.MAGIC_MIRROR.name": "Magic Mirror (${val}%)",
"core.bonus.MAGIC_MIRROR.description": "${val}% chance to redirects an offensive spell to enemy",
"core.bonus.MAGIC_RESISTANCE.name": "Magic Resistance(${val}%)",
"core.bonus.MAGIC_RESISTANCE.description": "${val}% chance to resist enemy spell",
"core.bonus.MAGIC_MIRROR.description": "Has a ${val}% chance to redirect an offensive spell to an enemy unit",
"core.bonus.MAGIC_RESISTANCE.name": "Magic Resistance (${val}%)",
"core.bonus.MAGIC_RESISTANCE.description": "Has a ${val}% chance to resist an enemy spell",
"core.bonus.MIND_IMMUNITY.name": "Mind Spell Immunity",
"core.bonus.MIND_IMMUNITY.description": "Immune to Mind-type spells",
"core.bonus.NO_DISTANCE_PENALTY.name": "No distance penalty",
"core.bonus.NO_DISTANCE_PENALTY.description": "Full damage from any distance",
"core.bonus.NO_DISTANCE_PENALTY.description": "Does full damage at any distance",
"core.bonus.NO_MELEE_PENALTY.name": "No melee penalty",
"core.bonus.NO_MELEE_PENALTY.description": "Creature has no Melee Penalty",
"core.bonus.NO_MORALE.name": "Neutral Morale",
@ -263,10 +262,6 @@
"core.bonus.REBIRTH.description": "${val}% of stack will rise after death",
"core.bonus.RETURN_AFTER_STRIKE.name": "Attack and Return",
"core.bonus.RETURN_AFTER_STRIKE.description": "Returns after melee attack",
"core.bonus.SELF_LUCK.name": "Positive luck",
"core.bonus.SELF_LUCK.description": "Always has Positive Luck",
"core.bonus.SELF_MORALE.name": "Positive morale",
"core.bonus.SELF_MORALE.description": "Always has Positive Morale",
"core.bonus.SHOOTER.name": "Ranged",
"core.bonus.SHOOTER.description": "Creature can shoot",
"core.bonus.SHOOTS_ALL_ADJACENT.name": "Shoot all around",
@ -276,11 +271,11 @@
"core.bonus.SPELLCASTER.name": "Spellcaster",
"core.bonus.SPELLCASTER.description": "Can cast ${subtype.spell}",
"core.bonus.SPELL_AFTER_ATTACK.name": "Cast After Attack",
"core.bonus.SPELL_AFTER_ATTACK.description": "${val}% to cast ${subtype.spell} after attack",
"core.bonus.SPELL_AFTER_ATTACK.description": "Has a ${val}% chance to cast ${subtype.spell} after it attacks",
"core.bonus.SPELL_BEFORE_ATTACK.name": "Cast Before Attack",
"core.bonus.SPELL_BEFORE_ATTACK.description": "${val}% to cast ${subtype.spell} before attack",
"core.bonus.SPELL_BEFORE_ATTACK.description": "Has a ${val}% chance to cast ${subtype.spell} before it attacks",
"core.bonus.SPELL_DAMAGE_REDUCTION.name": "Spell Resistance",
"core.bonus.SPELL_DAMAGE_REDUCTION.description": "Damage from spells reduced ${val}%.",
"core.bonus.SPELL_DAMAGE_REDUCTION.description": "Damage from spells reduced by ${val}%.",
"core.bonus.SPELL_IMMUNITY.name": "Spell immunity",
"core.bonus.SPELL_IMMUNITY.description": "Immune to ${subtype.spell}",
"core.bonus.SPELL_LIKE_ATTACK.name": "Spell-like attack",
@ -288,7 +283,7 @@
"core.bonus.SPELL_RESISTANCE_AURA.name": "Aura of Resistance",
"core.bonus.SPELL_RESISTANCE_AURA.description": "Nearby stacks get ${val}% magic resistance",
"core.bonus.SUMMON_GUARDIANS.name": "Summon guardians",
"core.bonus.SUMMON_GUARDIANS.description": "At battle start summons ${subtype.creature} (${val}%)",
"core.bonus.SUMMON_GUARDIANS.description": "At the start of battle summons ${subtype.creature} (${val}%)",
"core.bonus.SYNERGY_TARGET.name": "Synergizable",
"core.bonus.SYNERGY_TARGET.description": "This creature is vulnerable to synergy effect",
"core.bonus.TWO_HEX_ATTACK_BREATH.name": "Breath",
@ -296,13 +291,13 @@
"core.bonus.THREE_HEADED_ATTACK.name": "Three-headed attack",
"core.bonus.THREE_HEADED_ATTACK.description": "Attacks three adjacent units",
"core.bonus.TRANSMUTATION.name": "Transmutation",
"core.bonus.TRANSMUTATION.description": "${val}% chance to transform attacked unit to other type",
"core.bonus.TRANSMUTATION.description": "${val}% chance to transform attacked unit to a different type",
"core.bonus.UNDEAD.name": "Undead",
"core.bonus.UNDEAD.description": "Creature is Undead",
"core.bonus.UNLIMITED_RETALIATIONS.name": "Unlimited retaliations",
"core.bonus.UNLIMITED_RETALIATIONS.description": "Retaliates any number of attacks",
"core.bonus.UNLIMITED_RETALIATIONS.description": "Can retaliate against an unlimited number of attacks",
"core.bonus.WATER_IMMUNITY.name": "Water immunity",
"core.bonus.WATER_IMMUNITY.description": "Immune to all Water school spells",
"core.bonus.WATER_IMMUNITY.description": "Immune to all spells from the school of Water magic",
"core.bonus.WIDE_BREATH.name": "Wide breath",
"core.bonus.WIDE_BREATH.description": "Wide breath attack (multiple hexes)"
}

View File

@ -47,6 +47,8 @@
"vcmi.systemOptions.framerateButton.hover" : "FPS anzeigen",
"vcmi.systemOptions.framerateButton.help" : "{FPS anzeigen}\n\n Schaltet die Sichtbarkeit des Zählers für die Bilder pro Sekunde in der Ecke des Spielfensters um.",
"vcmi.adventureOptions.infoBarPick.hover" : "Meldungen im Infobereich anzeigen",
"vcmi.adventureOptions.infoBarPick.help" : "{Meldungen im Infobereich anzeigen}\n\nWann immer möglich, werden Spielnachrichten von besuchten Kartenobjekten in der Infoleiste angezeigt, anstatt als Popup-Fenster zu erscheinen",
"vcmi.adventureOptions.numericQuantities.hover" : "Numerische Kreaturenmengen",
"vcmi.adventureOptions.numericQuantities.help" : "{Numerische Kreaturenmengen}\n\n Zeigt die ungefähre Menge der feindlichen Kreaturen im numerischen Format A-B an.",
"vcmi.adventureOptions.forceMovementInfo.hover" : "Bewegungskosten immer anzeigen",
@ -79,6 +81,19 @@
"vcmi.battleOptions.animationsSpeed6.help": "Setzt die Animationsgeschwindigkeit auf sofort",
"vcmi.battleOptions.skipBattleIntroMusic.hover": "Intro-Musik überspringen",
"vcmi.battleOptions.skipBattleIntroMusic.help": "{Intro-Musik überspringen}\n\n Überspringe die kurze Musik, die zu Beginn eines jeden Kampfes gespielt wird, bevor die Action beginnt. Kann auch durch Drücken der ESC-Taste übersprungen werden.",
"vcmi.battleWindow.pressKeyToSkipIntro" : "Beliebige Taste drücken, um das Kampf-Intro zu überspringen",
"vcmi.battleWindow.damageEstimation.melee" : "Angriff auf %CREATURE (%DAMAGE).",
"vcmi.battleWindow.damageEstimation.meleeKills" : "Angriff auf %CREATURE (%DAMAGE, %KILLS).",
"vcmi.battleWindow.damageEstimation.ranged" : "Schuss auf %CREATURE (%SHOTS, %DAMAGE).",
"vcmi.battleWindow.damageEstimation.rangedKills" : "Schuss auf %CREATURE (%SHOTS, %DAMAGE, %KILLS).",
"vcmi.battleWindow.damageEstimation.shots" : "%d Schüsse verbleibend",
"vcmi.battleWindow.damageEstimation.shots.1" : "%d Schüsse verbleibend",
"vcmi.battleWindow.damageEstimation.damage" : "%d Schaden",
"vcmi.battleWindow.damageEstimation.damage.1" : "%d Schaden",
"vcmi.battleWindow.damageEstimation.kills" : "%d werden verenden",
"vcmi.battleWindow.damageEstimation.kills.1" : "%d werden verenden",
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Verfügbare Kreaturen anzeigen",
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Verfügbare Kreaturen anzeigen}\n\n Zeigt in der Stadtübersicht (linke untere Ecke) die zum Kauf verfügbaren Kreaturen anstelle ihres Wachstums an.",
@ -128,17 +143,17 @@
// few strings from WoG used by vcmi
"vcmi.stackExperience.description" : "» D e t a i l s z u r S t a p e l e r f a h r u n g «\n\nKreatur-Typ ................... : %s\nErfahrungsrang ................. : %s (%i)\nErfahrungspunkte ............... : %i\nErfahrungspunkte für den nächsten Rang .. : %i\nMaximale Erfahrung pro Kampf ... : %i%% (%i)\nAnzahl der Kreaturen im Stapel .... : %i\nMaximale Anzahl neuer Rekruten\n ohne Verlust von aktuellem Rang .... : %i\nErfahrungs-Multiplikator ........... : %.2f\nUpgrade-Multiplikator .............. : %.2f\nErfahrung nach Rang 10 ........ : %i\nMaximale Anzahl der neuen Rekruten, die bei\n Rang 10 bei maximaler Erfahrung übrig sind : %i",
"vcmi.stackExperience.rank.1" : "Grundlagen",
"vcmi.stackExperience.rank.2" : "Neuling",
"vcmi.stackExperience.rank.3" : "Ausgebildet",
"vcmi.stackExperience.rank.4" : "Kompetent",
"vcmi.stackExperience.rank.5" : "Bewährt",
"vcmi.stackExperience.rank.6" : "Veteran",
"vcmi.stackExperience.rank.7" : "Gekonnt",
"vcmi.stackExperience.rank.8" : "Experte",
"vcmi.stackExperience.rank.9" : "Elite",
"vcmi.stackExperience.rank.10" : "Meister",
"vcmi.stackExperience.rank.11" : "Ass",
"vcmi.stackExperience.rank.0" : "Grundlagen",
"vcmi.stackExperience.rank.1" : "Neuling",
"vcmi.stackExperience.rank.2" : "Ausgebildet",
"vcmi.stackExperience.rank.3" : "Kompetent",
"vcmi.stackExperience.rank.4" : "Bewährt",
"vcmi.stackExperience.rank.5" : "Veteran",
"vcmi.stackExperience.rank.6" : "Gekonnt",
"vcmi.stackExperience.rank.7" : "Experte",
"vcmi.stackExperience.rank.8" : "Elite",
"vcmi.stackExperience.rank.9" : "Meister",
"vcmi.stackExperience.rank.10" : "Ass",
"core.bonus.ADDITIONAL_ATTACK.name": "Doppelschlag",
"core.bonus.ADDITIONAL_ATTACK.description": "Greift zweimal an",
@ -210,12 +225,8 @@
"core.bonus.HP_REGENERATION.description": "Heilt ${SHval} Trefferpunkte jede Runde",
"core.bonus.JOUSTING.name": "Champion Charge",
"core.bonus.JOUSTING.description": "+${val}% Schaden pro zurückgelegtem Feld",
"core.bonus.KING1.name": "König 1",
"core.bonus.KING1.description": "Anfällig für grundlegende SLAYER",
"core.bonus.KING2.name": "König 2",
"core.bonus.KING2.description": "Anfällig für erweiterte SLAYER",
"core.bonus.KING3.name": "König3",
"core.bonus.KING3.description":"Anfällig für Experten-SLAYER",
"core.bonus.KING.name": "König",
"core.bonus.KING.description": "Anfällig für SLAYER Level ${val} oder höher",
"core.bonus.LEVEL_SPELL_IMMUNITY.name": "Zauberimmunität 1-${val}",
"core.bonus.LEVEL_SPELL_IMMUNITY.description": "Immun gegen Zaubersprüche der Stufen 1-${val}",
"core.bonus.LIMITED_SHOOTING_RANGE.name" : "Begrenzte Schussweite",
@ -252,10 +263,6 @@
"core.bonus.REBIRTH.description": "${val}% des Stacks wird nach dem Tod auferstehen",
"core.bonus.RETURN_AFTER_STRIKE.name": "Angriff und Rückkehr",
"core.bonus.RETURN_AFTER_STRIKE.description": "Kehrt nach Nahkampfangriff zurück",
"core.bonus.SELF_LUCK.name": "Positives Glück",
"core.bonus.SELF_LUCK.description": "Hat immer positives Glück",
"core.bonus.SELF_MORALE.name": "Positive Moral",
"core.bonus.SELF_MORALE.description": "Hat immer positive Moral",
"core.bonus.SHOOTER.name": "Fernkämpfer",
"core.bonus.SHOOTER.description": "Kreatur kann schießen",
"core.bonus.SHOOTS_ALL_ADJACENT.name": "Schießt rundherum",

View File

@ -249,10 +249,6 @@
"core.bonus.REBIRTH.description": "${val}% stworzeń powstanie po śmierci",
"core.bonus.RETURN_AFTER_STRIKE.name": "Atak i Powrót",
"core.bonus.RETURN_AFTER_STRIKE.description": "Wraca po ataku wręcz",
"core.bonus.SELF_LUCK.name": "Pozytywne szczęście",
"core.bonus.SELF_LUCK.description": "Zawsze posiada pozytywne szczęście",
"core.bonus.SELF_MORALE.name": "Pozytywne Morale",
"core.bonus.SELF_MORALE.description": "Zawsze posiada pozytywne morale",
"core.bonus.SHOOTER.name": "Dystansowy",
"core.bonus.SHOOTER.description": "Stworzenie może strzelać",
"core.bonus.SHOOTS_ALL_ADJACENT.name": "Ostrzeliwuje wszystko dookoła",

View File

@ -145,17 +145,17 @@
// few strings from WoG used by vcmi
"vcmi.stackExperience.description" : "» О п ы т с у щ е с т в «\n\nТип существа ................... : %s\nРанг опыта ................. : %s (%i)\nОчки опыта ............... : %i\nДо следующего .. : %i\nМаксимум за битву ... : %i%% (%i)\nЧисло в отряде .... : %i\nМаксимум новичков\n без потери ранга .... : %i\nМножитель опыта ........... : %.2f\nМножитель улучшения .......... : %.2f\nОпыт после 10 ранга ........ : %i\nМаксимум новичков для сохранения\n ранга 10 при максимальном опыте : %i",
"vcmi.stackExperience.rank.1" : "Рекрут",
"vcmi.stackExperience.rank.2" : "Новичок",
"vcmi.stackExperience.rank.3" : "Тренирован",
"vcmi.stackExperience.rank.4" : "Знающий",
"vcmi.stackExperience.rank.5" : "Подтвержденный",
"vcmi.stackExperience.rank.6" : "Ветеран",
"vcmi.stackExperience.rank.7" : "Адепт",
"vcmi.stackExperience.rank.8" : "Эксперт",
"vcmi.stackExperience.rank.9" : "Элита",
"vcmi.stackExperience.rank.10" : "Мастер",
"vcmi.stackExperience.rank.11" : "Ас",
"vcmi.stackExperience.rank.0" : "Рекрут",
"vcmi.stackExperience.rank.1" : "Новичок",
"vcmi.stackExperience.rank.2" : "Тренирован",
"vcmi.stackExperience.rank.3" : "Знающий",
"vcmi.stackExperience.rank.4" : "Подтвержденный",
"vcmi.stackExperience.rank.5" : "Ветеран",
"vcmi.stackExperience.rank.6" : "Адепт",
"vcmi.stackExperience.rank.7" : "Эксперт",
"vcmi.stackExperience.rank.8" : "Элита",
"vcmi.stackExperience.rank.9" : "Мастер",
"vcmi.stackExperience.rank.10" : "Ас",
"core.bonus.ADDITIONAL_ATTACK.name": "Двойной удар",
"core.bonus.ADDITIONAL_ATTACK.description": "Бьет дважды",
@ -265,10 +265,6 @@
"core.bonus.REBIRTH.description": "${val}% отряда оживет после его гибели",
"core.bonus.RETURN_AFTER_STRIKE.name": "Атака с возвратом",
"core.bonus.RETURN_AFTER_STRIKE.description": "После атаки возвращается на начальный гекс",
"core.bonus.SELF_LUCK.name": "Удачливый",
"core.bonus.SELF_LUCK.description": "Удача всегда позитивна",
"core.bonus.SELF_MORALE.name": "Воодушевленный",
"core.bonus.SELF_MORALE.description": "Боевой дух всегда позитивен",
"core.bonus.SHOOTER.name": "Стрелок",
"core.bonus.SHOOTER.description": "Совершает атаки в дальнем бою",
"core.bonus.SHOOTS_ALL_ADJACENT.name": "Стреляет по области",

View File

@ -131,17 +131,17 @@
// few strings from WoG used by vcmi
"vcmi.stackExperience.description" : "» D e t a l l e s d e E x p e r i e n c i a d e l G r u p o «\n\nTipo de Criatura ................ : %s\nRango de Experiencia ............ : %s (%i)\nPuntos de Experiencia ............ : %i\nPuntos de Experiencia para el\nSiguiente Rango ............... : %i\nExperiencia Máxima por Batalla .. : %i%% (%i)\nNúmero de Criaturas en el grupo .. : %i\nMáximo de Nuevos Reclutas sin\nPerder el Rango Actual ......... : %i\nMultiplicador de Experiencia .... : %.2f\nMultiplicador de Actualización .. : %.2f\nExperiencia después del Rango 10 : %i\nMáximo de Nuevos Reclutas para\nMantener el Rango 10 si\nEstá en la Experiencia Máxima : %i",
"vcmi.stackExperience.rank.1" : "Básico",
"vcmi.stackExperience.rank.2" : "Novato",
"vcmi.stackExperience.rank.3" : "Entrenado",
"vcmi.stackExperience.rank.4" : "Hábil",
"vcmi.stackExperience.rank.5" : "Probado",
"vcmi.stackExperience.rank.6" : "Veterano",
"vcmi.stackExperience.rank.7" : "Experto",
"vcmi.stackExperience.rank.8" : "Experto Superior",
"vcmi.stackExperience.rank.9" : "Élite",
"vcmi.stackExperience.rank.10" : "Maestro",
"vcmi.stackExperience.rank.11" : "As",
"vcmi.stackExperience.rank.0" : "Básico",
"vcmi.stackExperience.rank.1" : "Novato",
"vcmi.stackExperience.rank.2" : "Entrenado",
"vcmi.stackExperience.rank.3" : "Hábil",
"vcmi.stackExperience.rank.4" : "Probado",
"vcmi.stackExperience.rank.5" : "Veterano",
"vcmi.stackExperience.rank.6" : "Experto",
"vcmi.stackExperience.rank.7" : "Experto Superior",
"vcmi.stackExperience.rank.8" : "Élite",
"vcmi.stackExperience.rank.9" : "Maestro",
"vcmi.stackExperience.rank.10" : "As",
"core.bonus.ADDITIONAL_ATTACK.name": "Doble Ataque",
"core.bonus.ADDITIONAL_ATTACK.description": "Ataca dos veces",
@ -257,10 +257,6 @@
"core.bonus.REBIRTH.description": "El ${val}% del grupo resucitará después de la muerte",
"core.bonus.RETURN_AFTER_STRIKE.name": "Atacar y volver",
"core.bonus.RETURN_AFTER_STRIKE.description": "Regresa después de un ataque cuerpo a cuerpo",
"core.bonus.SELF_LUCK.name": "Suerte positiva",
"core.bonus.SELF_LUCK.description": "Siempre tiene suerte positiva",
"core.bonus.SELF_MORALE.name": "Moral positiva",
"core.bonus.SELF_MORALE.description": "Siempre tiene moral positiva",
"core.bonus.SHOOTER.name": "A distancia",
"core.bonus.SHOOTER.description": "La criatura puede disparar",
"core.bonus.SHOOTS_ALL_ADJACENT.name": "Dispara en todas direcciones",

View File

@ -249,10 +249,6 @@
"core.bonus.REBIRTH.description" : "${val}% загону відродиться після смерті",
"core.bonus.RETURN_AFTER_STRIKE.name" : "Атакує і повертається",
"core.bonus.RETURN_AFTER_STRIKE.description" : "Повертається після атаки ближнього бою",
"core.bonus.SELF_LUCK.name" : "Позитивна удача",
"core.bonus.SELF_LUCK.description" : "Завжди має позитивну удачу",
"core.bonus.SELF_MORALE.name" : "Позитивний бойовий дух",
"core.bonus.SELF_MORALE.description" : "Завжди має позитивний бойовий дух",
"core.bonus.SHOOTER.name" : "Стрілок",
"core.bonus.SHOOTER.description" : "Істота може стріляти",
"core.bonus.SHOOTS_ALL_ADJACENT.name" : "Стріляйте по площі",
@ -295,15 +291,15 @@
"core.bonus.LIMITED_SHOOTING_RANGE.description" : "Не може стріляти по цілях на відстані більше ${val} гексів",
"vcmi.stackExperience.description" : "» S t a c k E x p e r i e n c e D e t a i l s «\n\nCreature Type ................... : %s\nExperience Rank ................. : %s (%i)\nExperience Points ............... : %i\nExperience Points to Next Rank .. : %i\nMaximum Experience per Battle ... : %i%% (%i)\nNumber of Creatures in stack .... : %i\nMaximum New Recruits\n without losing current Rank .... : %i\nExperience Multiplier ........... : %.2f\nUpgrade Multiplier .............. : %.2f\nExperience after Rank 10 ........ : %i\nMaximum New Recruits to remain at\n Rank 10 if at Maximum Experience : %i",
"vcmi.stackExperience.rank.1" : "Початковий",
"vcmi.stackExperience.rank.2" : "Новачок",
"vcmi.stackExperience.rank.3" : "Підготовлений",
"vcmi.stackExperience.rank.4" : "Досвідчений",
"vcmi.stackExperience.rank.5" : "Випробуваний",
"vcmi.stackExperience.rank.6" : "Ветеран",
"vcmi.stackExperience.rank.7" : "Адепт",
"vcmi.stackExperience.rank.8" : "Експерт",
"vcmi.stackExperience.rank.9" : "Еліта",
"vcmi.stackExperience.rank.10" : "Майстер",
"vcmi.stackExperience.rank.11" : "Профі",
"vcmi.stackExperience.rank.0" : "Початковий",
"vcmi.stackExperience.rank.1" : "Новачок",
"vcmi.stackExperience.rank.2" : "Підготовлений",
"vcmi.stackExperience.rank.3" : "Досвідчений",
"vcmi.stackExperience.rank.4" : "Випробуваний",
"vcmi.stackExperience.rank.5" : "Ветеран",
"vcmi.stackExperience.rank.6" : "Адепт",
"vcmi.stackExperience.rank.7" : "Експерт",
"vcmi.stackExperience.rank.8" : "Еліта",
"vcmi.stackExperience.rank.9" : "Майстер",
"vcmi.stackExperience.rank.10" : "Профі",
}

View File

@ -16,7 +16,6 @@
"name" : "VCMI - grundlegende Dateien",
"description" : "Grundlegende Dateien, die für die korrekte Ausführung von VCMI erforderlich sind",
"author" : "VCMI-Team",
"modType" : "Grafik",
"skipValidation" : true,
"translations" : [
@ -28,7 +27,6 @@
"name" : "Podstawowe pliki VCMI",
"description" : "Dodatkowe pliki wymagane do prawidłowego działania VCMI",
"author" : "Zespół VCMI",
"modType" : "Graficzny",
"skipValidation" : true,
"translations" : [
@ -40,7 +38,6 @@
"name" : "Ключевые файлы VCMI",
"description" : "Файлы, необходимые для полноценной работы VCMI",
"author" : "Команда VCMI",
"modType" : "Графический",
"skipValidation" : true,
"translations" : [
@ -52,7 +49,6 @@
"name" : "VCMI - ключові файли",
"description" : "Ключові файли необхідні для повноцінної роботи VCMI",
"author" : "Команда VCMI",
"modType" : "Графіка",
"translations" : [
"config/vcmi/ukrainian.json"
@ -63,7 +59,6 @@
"name" : "VCMI - ficheros necesarios",
"description" : "Ficheros necesarios para ejecutar VCMI correctamente",
"author" : "Abel Rivas",
"modType" : "Gráfico",
"skipValidation" : true,
"translations" : [

View File

@ -142,11 +142,13 @@ Mix_Chunk *CSoundHandler::GetSoundChunk(std::string &sound, bool cache)
int CSoundHandler::ambientDistToVolume(int distance) const
{
if(distance >= ambientConfig["distances"].Vector().size())
const auto & distancesVector = ambientConfig["distances"].Vector();
if(distance >= distancesVector.size())
return 0;
int volume = static_cast<int>(ambientConfig["distances"].Vector()[distance].Integer());
return volume * (int)ambientConfig["volume"].Integer() * getVolume() / 10000;
int volume = static_cast<int>(distancesVector[distance].Integer());
return volume * (int)ambientConfig["volume"].Integer() / 100;
}
void CSoundHandler::ambientStopSound(std::string soundId)
@ -211,7 +213,20 @@ void CSoundHandler::setVolume(ui32 percent)
CAudioBase::setVolume(percent);
if (initialized)
{
setChannelVolume(-1, volume);
for (auto const & channel : channelVolumes)
updateChannelVolume(channel.first);
}
}
void CSoundHandler::updateChannelVolume(int channel)
{
if (channelVolumes.count(channel))
setChannelVolume(channel, getVolume() * channelVolumes[channel] / 100);
else
setChannelVolume(channel, getVolume());
}
// Sets the sound volume, from 0 (mute) to 100
@ -258,29 +273,40 @@ void CSoundHandler::ambientUpdateChannels(std::map<std::string, int> soundsArg)
std::vector<std::string> stoppedSounds;
for(auto & pair : ambientChannels)
{
if(!vstd::contains(soundsArg, pair.first))
const std::string & soundId = pair.first;
const int channel = pair.second;
if(!vstd::contains(soundsArg, soundId))
{
ambientStopSound(pair.first);
stoppedSounds.push_back(pair.first);
ambientStopSound(soundId);
stoppedSounds.push_back(soundId);
}
else
{
int volume = ambientDistToVolume(soundsArg[pair.first]);
CCS->soundh->setChannelVolume(pair.second, volume);
int volume = ambientDistToVolume(soundsArg[soundId]);
channelVolumes[channel] = volume;
updateChannelVolume(channel);
}
}
for(auto soundId : stoppedSounds)
{
channelVolumes.erase(ambientChannels[soundId]);
ambientChannels.erase(soundId);
}
for(auto & pair : soundsArg)
{
if(!vstd::contains(ambientChannels, pair.first))
{
int channel = CCS->soundh->playSound(pair.first, -1);
int volume = ambientDistToVolume(pair.second);
const std::string & soundId = pair.first;
const int distance = pair.second;
CCS->soundh->setChannelVolume(channel, volume);
CCS->soundh->ambientChannels.insert(std::make_pair(pair.first, channel));
if(!vstd::contains(ambientChannels, soundId))
{
int channel = playSound(soundId, -1);
int volume = ambientDistToVolume(distance);
channelVolumes[channel] = volume;
updateChannelVolume(channel);
ambientChannels[soundId] = channel;
}
}
}
@ -293,6 +319,7 @@ void CSoundHandler::ambientStopAllChannels()
{
ambientStopSound(ch.first);
}
channelVolumes.clear();
ambientChannels.clear();
}

View File

@ -51,9 +51,12 @@ private:
int ambientDistToVolume(int distance) const;
void ambientStopSound(std::string soundId);
void updateChannelVolume(int channel);
const JsonNode ambientConfig;
std::map<std::string, int> ambientChannels;
std::map<int, int> channelVolumes;
public:
CSoundHandler();

View File

@ -2033,7 +2033,7 @@ bool CPlayerInterface::capturedAllEvents()
return true;
}
bool needToLockAdventureMap = adventureInt->active && CGI->mh->hasOngoingAnimations();
bool needToLockAdventureMap = adventureInt && adventureInt->active && CGI->mh->hasOngoingAnimations();
if (ignoreEvents || needToLockAdventureMap)
{

View File

@ -119,7 +119,10 @@ BattleActionsController::BattleActionsController(BattleInterface & owner):
void BattleActionsController::endCastingSpell()
{
if(heroSpellToCast)
{
heroSpellToCast.reset();
owner.windowObject->blockUI(false);
}
if(owner.stacksController->getActiveStack())
possibleActions = getPossibleActionsForStack(owner.stacksController->getActiveStack()); //restore actions after they were cleared
@ -287,6 +290,8 @@ void BattleActionsController::castThisSpell(SpellID spellID)
possibleActions.push_back (spellSelMode); //only this one action can be performed at the moment
GH.fakeMouseMove();//update cursor
}
owner.windowObject->blockUI(true);
}
const CSpell * BattleActionsController::getHeroSpellToCast( ) const
@ -520,6 +525,8 @@ bool BattleActionsController::actionIsLegal(PossiblePlayerBattleAction action, B
switch (action.get())
{
case PossiblePlayerBattleAction::CHOOSE_TACTICS_STACK:
return (targetStack && targetStackOwned && targetStack->Speed() > 0);
case PossiblePlayerBattleAction::CREATURE_INFO:
return (targetStack && targetStackOwned);
@ -689,14 +696,14 @@ void BattleActionsController::actionRealize(PossiblePlayerBattleAction action, B
if (action.spell() == SpellID::SACRIFICE)
{
heroSpellToCast->aimToHex(targetHex);
possibleActions.push_back(PossiblePlayerBattleAction::SACRIFICE);
possibleActions.push_back({PossiblePlayerBattleAction::SACRIFICE, action.spell()});
owner.stacksController->setSelectedStack(targetStack);
return;
}
if (action.spell() == SpellID::TELEPORT)
{
heroSpellToCast->aimToUnit(targetStack);
possibleActions.push_back(PossiblePlayerBattleAction::TELEPORT);
possibleActions.push_back({PossiblePlayerBattleAction::TELEPORT, action.spell()});
owner.stacksController->setSelectedStack(targetStack);
return;
}

View File

@ -756,7 +756,15 @@ void ShootingAnimation::createProjectile(const Point & from, const Point & dest)
uint32_t ShootingAnimation::getAttackClimaxFrame() const
{
const CCreature *shooterInfo = getCreature();
return shooterInfo->animation.attackClimaxFrame;
uint32_t maxFrames = stackAnimation(attackingStack)->framesInGroup(getGroup());
uint32_t climaxFrame = shooterInfo->animation.attackClimaxFrame;
uint32_t selectedFrame = vstd::clamp(shooterInfo->animation.attackClimaxFrame, 1, maxFrames);
if (climaxFrame != selectedFrame)
logGlobal->warn("Shooter %s has ranged attack climax frame set to %d, but only %d available!", shooterInfo->getNamePluralTranslated(), climaxFrame, maxFrames);
return selectedFrame - 1; // H3 counts frames from 1
}
ECreatureAnimType ShootingAnimation::getUpwardsGroup() const

View File

@ -35,8 +35,6 @@
#include "../../lib/CStack.h"
#include "../../lib/spells/ISpellMechanics.h"
#include <SDL_events.h>
BattleFieldController::BattleFieldController(BattleInterface & owner):
owner(owner)
{
@ -67,10 +65,7 @@ BattleFieldController::BattleFieldController(BattleInterface & owner):
backgroundWithHexes = std::make_unique<Canvas>(Point(background->width(), background->height()));
auto accessibility = owner.curInt->cb->getAccesibility();
for(int i = 0; i < accessibility.size(); i++)
stackCountOutsideHexes[i] = (accessibility[i] == EAccessibility::ACCESSIBLE);
updateAccessibleHexes();
addUsedEvents(LCLICK | RCLICK | MOVE);
LOCPLINT->cingconsole->pos = this->pos;
}
@ -180,11 +175,6 @@ void BattleFieldController::redrawBackgroundWithHexes()
if (activeStack)
occupyableHexes = owner.curInt->cb->battleGetAvailableHexes(activeStack, true, &attackableHexes);
auto accessibility = owner.curInt->cb->getAccesibility();
for(int i = 0; i < accessibility.size(); i++)
stackCountOutsideHexes[i] = (accessibility[i] == EAccessibility::ACCESSIBLE);
//prepare background graphic with hexes and shaded hexes
backgroundWithHexes->draw(background, Point(0,0));
owner.obstacleController->showAbsoluteObstacles(*backgroundWithHexes);
@ -579,6 +569,14 @@ bool BattleFieldController::isTileAttackable(const BattleHex & number) const
return false;
}
void BattleFieldController::updateAccessibleHexes()
{
auto accessibility = owner.curInt->cb->getAccesibility();
for(int i = 0; i < accessibility.size(); i++)
stackCountOutsideHexes[i] = (accessibility[i] == EAccessibility::ACCESSIBLE || (accessibility[i] == EAccessibility::SIDE_COLUMN));
}
bool BattleFieldController::stackCountOutsideHex(const BattleHex & number) const
{
return stackCountOutsideHexes[number];
@ -591,6 +589,7 @@ void BattleFieldController::showAll(SDL_Surface * to)
void BattleFieldController::show(SDL_Surface * to)
{
updateAccessibleHexes();
owner.stacksController->update();
owner.obstacleController->update();

View File

@ -56,6 +56,7 @@ class BattleFieldController : public CIntObject
void showBackgroundImage(Canvas & canvas);
void showBackgroundImageWithHexes(Canvas & canvas);
void showHighlightedHexes(Canvas & canvas);
void updateAccessibleHexes();
BattleHex::EDir selectAttackDirection(BattleHex myNumber, const Point & point);

View File

@ -78,6 +78,11 @@ void BattleObstacleController::obstaclePlaced(const std::vector<std::shared_ptr<
{
for (auto const & oi : obstacles)
{
auto side = owner.curInt->cb->playerToSide(owner.curInt->playerID);
if(!oi->visibleForSide(side.get(),owner.curInt->cb->battleHasNativeStack(side.get())))
continue;
auto spellObstacle = dynamic_cast<const SpellCreatedObstacle*>(oi.get());
if (!spellObstacle)

View File

@ -267,12 +267,8 @@ bool BattleStacksController::stackNeedsAmountBox(const CStack * stack) const
return false;
// if stack has any ongoing animation - hide the box
for(auto anim : currentAnimations)
{
auto stackAnimation = dynamic_cast<BattleStackAnimation*>(anim);
if(stackAnimation && (stackAnimation->stack->ID == stack->ID))
return false;
}
if (stackAmountBoxHidden.count(stack->ID))
return false;
return true;
}
@ -300,26 +296,42 @@ std::shared_ptr<IImage> BattleStacksController::getStackAmountBox(const CStack *
void BattleStacksController::showStackAmountBox(Canvas & canvas, const CStack * stack)
{
//blitting amount background box
auto amountBG = getStackAmountBox(stack);
const int sideShift = stack->side == BattleSide::ATTACKER ? 1 : -1;
const int reverseSideShift = stack->side == BattleSide::ATTACKER ? -1 : 1;
const BattleHex nextPos = stack->getPosition() + sideShift;
const bool edge = stack->getPosition() % GameConstants::BFIELD_WIDTH == (stack->side == BattleSide::ATTACKER ? GameConstants::BFIELD_WIDTH - 2 : 1);
const bool moveInside = !edge && !owner.fieldController->stackCountOutsideHex(nextPos);
bool doubleWide = stack->doubleWide();
bool turnedRight = facingRight(stack);
bool attacker = stack->side == BattleSide::ATTACKER;
int xAdd = (stack->side == BattleSide::ATTACKER ? 220 : 202) +
(stack->doubleWide() ? 44 : 0) * sideShift +
(moveInside ? amountBG->width() + 10 : 0) * reverseSideShift;
int yAdd = 260 + ((stack->side == BattleSide::ATTACKER || moveInside) ? 0 : -15);
BattleHex stackPos = stack->getPosition();
canvas.draw(amountBG, stackAnimation[stack->ID]->pos.topLeft() + Point(xAdd, yAdd));
// double-wide unit turned around - use opposite hex for stack label
if (doubleWide && turnedRight != attacker)
stackPos = stack->occupiedHex();
//blitting amount
Point textPos = stackAnimation[stack->ID]->pos.topLeft() + amountBG->dimensions()/2 + Point(xAdd, yAdd);
BattleHex frontPos = turnedRight ?
stackPos.cloneInDirection(BattleHex::RIGHT) :
stackPos.cloneInDirection(BattleHex::LEFT);
canvas.drawText(textPos, EFonts::FONT_TINY, Colors::WHITE, ETextAlignment::CENTER, TextOperations::formatMetric(stack->getCount(), 4));
bool moveInside = !owner.fieldController->stackCountOutsideHex(frontPos);
Point boxPosition;
if (moveInside)
{
boxPosition = owner.fieldController->hexPositionLocal(stackPos).center() + Point(-15, 1);
}
else
{
if (turnedRight)
boxPosition = owner.fieldController->hexPositionLocal(frontPos).center() + Point (-22, 1);
else
boxPosition = owner.fieldController->hexPositionLocal(frontPos).center() + Point(-8, -14);
}
Point textPosition = amountBG->dimensions()/2 + boxPosition;
canvas.draw(amountBG, boxPosition);
canvas.drawText(textPosition, EFonts::FONT_TINY, Colors::WHITE, ETextAlignment::CENTER, TextOperations::formatMetric(stack->getCount(), 4));
}
void BattleStacksController::showStack(Canvas & canvas, const CStack * stack)
@ -368,6 +380,7 @@ void BattleStacksController::updateBattleAnimations()
if (hadAnimations && currentAnimations.empty())
{
//stackAmountBoxHidden.clear();
owner.executeStagedAnimations();
if (currentAnimations.empty())
owner.onAnimationsFinished();
@ -378,8 +391,15 @@ void BattleStacksController::updateBattleAnimations()
void BattleStacksController::addNewAnim(BattleAnimation *anim)
{
if (currentAnimations.empty())
stackAmountBoxHidden.clear();
owner.onAnimationsStarted();
currentAnimations.push_back(anim);
auto stackAnimation = dynamic_cast<BattleStackAnimation*>(anim);
if(stackAnimation)
stackAmountBoxHidden.insert(stackAnimation->stack->ID);
}
void BattleStacksController::stackRemoved(uint32_t stackID)
@ -668,6 +688,8 @@ void BattleStacksController::endAction(const BattleAction* action)
owner.executeStagedAnimations();
owner.waitForAnimations();
stackAmountBoxHidden.clear();
owner.windowObject->blockUI(activeStack == nullptr);
removeExpiredColorFilters();
}
@ -738,8 +760,8 @@ Point BattleStacksController::getStackPositionAtHex(BattleHex hexNum, const CSta
if(stack && stack->initialPosition < 0) //creatures in turrets
return owner.siegeController->getTurretCreaturePosition(stack->initialPosition);
static const Point basePos(-190, -139); // position of creature in topleft corner
static const int imageShiftX = 30; // X offset to base pos for facing right stacks, negative for facing left
static const Point basePos(-189, -139); // position of creature in topleft corner
static const int imageShiftX = 29; // X offset to base pos for facing right stacks, negative for facing left
ret.x = basePos.x + 22 * ( (hexNum.getY() + 1)%2 ) + 44 * hexNum.getX();
ret.y = basePos.y + 42 * hexNum.getY();

View File

@ -67,6 +67,9 @@ class BattleStacksController
/// <creatureID, if false reverse creature's animation> //TODO: move it to battle callback
std::map<int, bool> stackFacingRight;
/// Stacks have amount box hidden due to ongoing animations
std::set<int> stackAmountBoxHidden;
/// currently active stack; nullptr - no one
const CStack *activeStack;

View File

@ -541,11 +541,8 @@ void BattleWindow::blockUI(bool on)
w->block(on || owner.tacticsMode);
if(auto w = widget<CButton>("alternativeAction"))
w->block(on || owner.tacticsMode);
// block only if during enemy turn and auto-fight is off
// otherwise - crash on accessing non-exisiting active stack
if(auto w = widget<CButton>("options"))
w->block(!owner.curInt->isAutoFightOn && !owner.stacksController->getActiveStack());
if(auto w = widget<CButton>("autofight"))
w->block(owner.actionsController->spellcastingModeActive());
auto btactEnd = widget<CButton>("tacticEnd");
auto btactNext = widget<CButton>("tacticNext");

View File

@ -297,7 +297,14 @@ std::shared_ptr<CToggleButton> InterfaceObjectConfigurable::buildToggleButton(co
button->setImageOrder(imgOrder[0].Integer(), imgOrder[1].Integer(), imgOrder[2].Integer(), imgOrder[3].Integer());
}
if(!config["callback"].isNull())
button->addCallback(callbacks.at(config["callback"].String()));
{
std::string callbackName = config["callback"].String();
if (callbacks.count(callbackName))
button->addCallback(callbacks.at(callbackName));
else
logGlobal->error("Invalid callback '%s' in widget", callbackName );
}
return button;
}

View File

@ -12,9 +12,9 @@
#include "NotificationHandler.h"
#include <SDL_video.h>
#include <SDL_events.h>
#include <SDL_syswm.h>
#if defined(VCMI_WINDOWS)
#include <SDL_syswm.h>
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:

View File

@ -98,8 +98,13 @@ void MapTileStorage::load(size_t index, const std::string & filename, EImageBlit
for(auto & entry : terrainAnimations)
{
entry = std::make_unique<CAnimation>(filename);
entry->preload();
if (!filename.empty())
{
entry = std::make_unique<CAnimation>(filename);
entry->preload();
}
else
entry = std::make_unique<CAnimation>();
for(size_t i = 0; i < entry->size(); ++i)
entry->getImage(i)->setBlitMode(blitMode);

View File

@ -66,16 +66,18 @@ void BasicMapView::render(Canvas & target, bool fullUpdate)
void BasicMapView::show(SDL_Surface * to)
{
controller->update(GH.mainFPSmng->getElapsedMilliseconds());
controller->updateBefore(GH.mainFPSmng->getElapsedMilliseconds());
Canvas target(to);
CSDL_Ext::CClipRectGuard guard(to, pos);
render(target, false);
controller->updateAfter(GH.mainFPSmng->getElapsedMilliseconds());
}
void BasicMapView::showAll(SDL_Surface * to)
{
controller->update(0);
controller->updateBefore(0);
Canvas target(to);
CSDL_Ext::CClipRectGuard guard(to, pos);

View File

@ -88,7 +88,7 @@ std::shared_ptr<IMapRendererContext> MapViewController::getContext() const
return context;
}
void MapViewController::update(uint32_t timeDelta)
void MapViewController::updateBefore(uint32_t timeDelta)
{
// confirmed to match H3 for
// - hero embarking on boat (500 ms)
@ -116,56 +116,32 @@ void MapViewController::update(uint32_t timeDelta)
settings["adventure"]["enemyMoveTime"].Float();
movementContext->progress += timeDelta / heroMoveTime;
movementContext->progress = std::min( 1.0, movementContext->progress);
Point positionFrom = Point(hero->convertToVisitablePos(movementContext->tileFrom)) * model->getSingleTileSize() + model->getSingleTileSize() / 2;
Point positionDest = Point(hero->convertToVisitablePos(movementContext->tileDest)) * model->getSingleTileSize() + model->getSingleTileSize() / 2;
Point positionCurr = vstd::lerp(positionFrom, positionDest, movementContext->progress);
if(movementContext->progress >= 1.0)
{
setViewCenter(hero->getSightCenter());
removeObject(context->getObject(movementContext->target));
addObject(context->getObject(movementContext->target));
activateAdventureContext(movementContext->animationTime);
}
else
{
setViewCenter(positionCurr, movementContext->tileDest.z);
}
setViewCenter(positionCurr, movementContext->tileDest.z);
}
if(teleportContext)
{
teleportContext->progress += timeDelta / heroTeleportDuration;
if(teleportContext->progress >= 1.0)
{
activateAdventureContext(teleportContext->animationTime);
}
teleportContext->progress = std::min( 1.0, teleportContext->progress);
}
if(fadingOutContext)
{
fadingOutContext->progress -= timeDelta / fadeOutDuration;
if(fadingOutContext->progress <= 0.0)
{
removeObject(context->getObject(fadingOutContext->target));
activateAdventureContext(fadingOutContext->animationTime);
}
fadingOutContext->progress = std::max( 0.0, fadingOutContext->progress);
}
if(fadingInContext)
{
fadingInContext->progress += timeDelta / fadeInDuration;
if(fadingInContext->progress >= 1.0)
{
activateAdventureContext(fadingInContext->animationTime);
}
fadingInContext->progress = std::min( 1.0, fadingInContext->progress);
}
if(adventureContext)
@ -180,6 +156,48 @@ void MapViewController::update(uint32_t timeDelta)
}
}
void MapViewController::updateAfter(uint32_t timeDelta)
{
if(movementContext)
{
const auto * object = context->getObject(movementContext->target);
const auto * hero = dynamic_cast<const CGHeroInstance *>(object);
const auto * boat = dynamic_cast<const CGBoat *>(object);
assert(boat || hero);
if(!hero)
hero = boat->hero;
if(movementContext->progress >= 1.0)
{
setViewCenter(hero->getSightCenter());
removeObject(context->getObject(movementContext->target));
addObject(context->getObject(movementContext->target));
activateAdventureContext(movementContext->animationTime);
}
}
if(teleportContext && teleportContext->progress >= 1.0)
{
activateAdventureContext(teleportContext->animationTime);
}
if(fadingOutContext && fadingOutContext->progress <= 0.0)
{
removeObject(context->getObject(fadingOutContext->target));
activateAdventureContext(fadingOutContext->animationTime);
}
if(fadingInContext && fadingInContext->progress >= 1.0)
{
activateAdventureContext(fadingInContext->animationTime);
}
}
bool MapViewController::isEventVisible(const CGObjectInstance * obj)
{
if(adventureContext == nullptr)

View File

@ -83,7 +83,8 @@ public:
void setViewCenter(const int3 & position);
void setViewCenter(const Point & position, int level);
void setTileSize(const Point & tileSize);
void update(uint32_t timeDelta);
void updateBefore(uint32_t timeDelta);
void updateAfter(uint32_t timeDelta);
void activateAdventureContext(uint32_t animationTime);
void activateAdventureContext();

View File

@ -727,6 +727,7 @@ void CCastleBuildings::buildingClicked(BuildingID building, BuildingSubID::EBuil
switch(subID)
{
case BuildingSubID::NONE:
enterBuilding(building);
break;
case BuildingSubID::MYSTIC_POND:

View File

@ -142,6 +142,13 @@ GeneralOptionsTab::GeneralOptionsTab()
std::shared_ptr<CToggleButton> compactTownCreatureInfo = widget<CToggleButton>("compactTownCreatureInfoCheckbox");
compactTownCreatureInfo->setSelected(settings["gameTweaks"]["compactTownCreatureInfo"].Bool());
std::shared_ptr<CLabel> musicVolumeLabel = widget<CLabel>("musicValueLabel");
musicVolumeLabel->setText(std::to_string(CCS->musich->getVolume()) + "%");
std::shared_ptr<CLabel> soundVolumeLabel = widget<CLabel>("soundValueLabel");
musicVolumeLabel->setText(std::to_string(CCS->soundh->getVolume()) + "%");
}

View File

@ -431,22 +431,6 @@
}
},
"SELF_LUCK":
{
"graphics":
{
"icon": "zvs/Lib1.res/SelfLuck"
}
},
"SELF_MORALE":
{
"graphics":
{
"icon": "zvs/Lib1.res/E_MINOT"
}
},
"SHOOTER":
{
"graphics":

View File

@ -104,7 +104,7 @@
"index": 10,
"faction" : "dungeon",
"defaultTavern" : 5,
"affinity" : "might",
"affinity" : "magic",
"commander" : "medusaQueen",
"mapObject" : { "templates" : { "default" : { "animation" : "AH11_.def", "editorAnimation": "AH11_E.def" } } },
"animation": { "battle" : { "male" : "CH010.DEF", "female" : "CH11.DEF" } }
@ -114,7 +114,7 @@
"index": 11,
"faction" : "dungeon",
"defaultTavern" : 5,
"affinity" : "magic",
"affinity" : "might",
"commander" : "medusaQueen",
"mapObject" : { "templates" : { "default" : { "animation" : "AH10_.def", "editorAnimation": "AH10_E.def" } } },
"animation": { "battle" : { "male" : "CH010.DEF", "female" : "CH11.DEF" } }

View File

@ -214,7 +214,7 @@
{ "skill" : "armorer", "level": "basic" }
],
"specialty" : {
"creature" : "griffin"
"creature" : "swordsman"
}
},
"mutareDrake":

View File

@ -215,7 +215,7 @@
"handler" : "whirlpool",
"base" : {
"sounds" : {
"ambient" : ["LOOPWHIRL"],
"ambient" : ["LOOPWHIR"],
"visit" : ["DANGER"]
}
},

View File

@ -18,10 +18,6 @@
"type":"string",
"description": "More lengthy description of mod. No hard limit"
},
"modType" : {
"type":"string",
"description": "Type of mod, e.g. Town, Artifacts, Graphical."
},
"author" : {
"type":"string",
"description": "Author of the mod. Can be nickname, real name or name of team"
@ -60,6 +56,7 @@
"modType" : {
"type":"string",
"enum" : [ "Translation", "Town", "Test", "Templates", "Spells", "Music", "Sounds", "Skills", "Other", "Objects", "Mechanics", "Interface", "Heroes", "Graphical", "Expansion", "Creatures", "Artifacts", "AI" ],
"description": "Type of mod, e.g. Town, Artifacts, Graphical."
},

View File

@ -32,7 +32,11 @@
},
"animation": {
"type": "string",
"description": "Image resource"
"description": "Image resource",
"anyOf" : [
{ "format" : "defFile" },
{ "format" : "imageFile" }
]
},
"unknown": {
"type": "number",

View File

@ -335,7 +335,7 @@
},
"playerAI" : {
"type" : "string",
"default" : "VCAI"
"default" : "Nullkiller"
},
"friendlyAI" : {
"type" : "string",

View File

@ -90,8 +90,7 @@
"damage":{
"type":"core:damage",
"optional":false,
"indirect":true,
"customEffectId" : 82
"indirect":true
}
}
},

View File

@ -91,7 +91,7 @@ void FirstLaunchView::on_pushButtonDataCopy_clicked()
void FirstLaunchView::on_pushButtonDataHelp_clicked()
{
static const QUrl vcmibuilderWiki("https://wiki.vcmi.eu/Installation_on_Linux#Installing_Heroes_III_data_files");
static const QUrl vcmibuilderWiki("https://wiki.vcmi.eu/Using_vcmibuilder");
QDesktopServices::openUrl(vcmibuilderWiki);
}
@ -232,9 +232,10 @@ bool FirstLaunchView::heroesDataDetect()
CResourceHandler::load("config/filesystem.json");
// use file from lod archive to check presence of H3 data. Very rough estimate, but will work in majority of cases
bool heroesDataFound = CResourceHandler::get()->existsResource(ResourceID("DATA/GENRLTXT.TXT"));
bool heroesDataFoundROE = CResourceHandler::get()->existsResource(ResourceID("DATA/GENRLTXT.TXT"));
bool heroesDataFoundSOD = CResourceHandler::get()->existsResource(ResourceID("DATA/TENTCOLR.TXT"));
return heroesDataFound;
return heroesDataFoundROE && heroesDataFoundSOD;
}
void FirstLaunchView::heroesLanguageUpdate()
@ -267,16 +268,46 @@ void FirstLaunchView::copyHeroesData()
QStringList dirMaps = sourceRoot.entryList({"maps"}, QDir::Filter::Dirs);
QStringList dirMp3 = sourceRoot.entryList({"mp3"}, QDir::Filter::Dirs);
if(dirData.empty() || dirMaps.empty() || dirMp3.empty())
if(dirData.empty())
{
QMessageBox::critical(this, "Heroes III data not found!", "Failed to detect valid Heroes III data in chosen directory.\nPlease select directory with installed Heroes III data.");
return;
}
QDir sourceData = sourceRoot.filePath(dirData.front());
QStringList lodArchives = sourceData.entryList({"*.lod"}, QDir::Filter::Files);
QStringList roeFiles = sourceData.entryList({"*.lod"}, QDir::Filter::Files);
QStringList sodFiles = sourceData.entryList({"H3ab*.lod"}, QDir::Filter::Files);
QStringList hdFiles = sourceData.entryList({"*.pak"}, QDir::Filter::Files);
if(lodArchives.empty())
if(sodFiles.empty())
{
if (roeFiles.empty())
{
// Directory structure is correct (Data/Maps/Mp3) but no .lod archives that should be present in any install
QMessageBox::critical(this, "Heroes III data not found!", "Failed to detect valid Heroes III data in chosen directory.\nPlease select directory with installed Heroes III data.");
return;
}
if (!hdFiles.empty())
{
// HD Edition contains only RoE data so we can't use even unmodified files from it
QMessageBox::critical(this, "Heroes III data not found!", "Heroes III: HD Edition files are not supported by VCMI.\nPlease select directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.");
return;
}
// RoE or some other unsupported edition. Demo version?
QMessageBox::critical(this, "Heroes III data not found!", "Unknown or unsupported Heroes III version found.\nPlease select directory with Heroes III: Complete Edition or Heroes III: Shadow of Death.");
return;
}
QStringList copyDirectories = {dirData.front(), dirMaps.front(), dirMp3.front()};
QStringList copyDirectories;
copyDirectories += dirData.front();
if (!dirMaps.empty())
copyDirectories += dirMaps.front();
if (!dirMp3.empty())
copyDirectories += dirMp3.front();
QDir targetRoot = pathToQString(VCMIDirs::get().userDataPath());
@ -310,6 +341,10 @@ void FirstLaunchView::modPresetUpdate()
ui->checkBoxPresetExtras->setEnabled(checkCanInstallExtras());
ui->checkBoxPresetHota->setEnabled(checkCanInstallHota());
ui->checkBoxPresetWog->setEnabled(checkCanInstallWog());
// we can't install anything - either repository checkout is off or all recommended mods are already installed
if (!checkCanInstallTranslation() && !checkCanInstallExtras() && !checkCanInstallHota() && !checkCanInstallWog())
exitSetup();
}
QString FirstLaunchView::findTranslationModName()
@ -364,7 +399,7 @@ CModListView * FirstLaunchView::getModView()
bool FirstLaunchView::checkCanInstallMod(const QString & modID)
{
return getModView() && !getModView()->isModInstalled(modID);
return getModView() && getModView()->isModAvailable(modID);
}
void FirstLaunchView::on_pushButtonPresetBack_clicked()
@ -376,16 +411,16 @@ void FirstLaunchView::on_pushButtonPresetNext_clicked()
{
QStringList modsToInstall;
if (ui->checkBoxPresetLanguage && checkCanInstallTranslation())
if (ui->checkBoxPresetLanguage->isChecked() && checkCanInstallTranslation())
modsToInstall.push_back(findTranslationModName());
if (ui->checkBoxPresetExtras && checkCanInstallExtras())
if (ui->checkBoxPresetExtras->isChecked() && checkCanInstallExtras())
modsToInstall.push_back("vcmi-extras");
if (ui->checkBoxPresetWog && checkCanInstallWog())
if (ui->checkBoxPresetWog->isChecked() && checkCanInstallWog())
modsToInstall.push_back("wake-of-gods");
if (ui->checkBoxPresetHota && checkCanInstallHota())
if (ui->checkBoxPresetHota->isChecked() && checkCanInstallHota())
modsToInstall.push_back("hota");
exitSetup();
@ -394,3 +429,18 @@ void FirstLaunchView::on_pushButtonPresetNext_clicked()
getModView()->doInstallMod(modName);
}
void FirstLaunchView::on_pushButtonDiscord_clicked()
{
QDesktopServices::openUrl(QUrl("https://discord.gg/chBT42V"));
}
void FirstLaunchView::on_pushButtonSlack_clicked()
{
QDesktopServices::openUrl(QUrl("https://slack.vcmi.eu/"));
}
void FirstLaunchView::on_pushButtonGithub_clicked()
{
QDesktopServices::openUrl(QUrl("https://github.com/vcmi/vcmi"));
}

View File

@ -93,6 +93,12 @@ private slots:
void on_pushButtonPresetNext_clicked();
void on_pushButtonDiscord_clicked();
void on_pushButtonSlack_clicked();
void on_pushButtonGithub_clicked();
private:
Ui::FirstLaunchView * ui;

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>650</width>
<height>409</height>
<width>745</width>
<height>389</height>
</rect>
</property>
<property name="windowTitle">
@ -115,7 +115,7 @@
<item>
<widget class="QStackedWidget" name="installerTabs">
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="pageLanguageSelect">
<layout class="QGridLayout" name="gridLayout_3">
@ -131,6 +131,9 @@
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="labelLanguageTitle">
<property name="font">
@ -144,27 +147,14 @@
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="pushButtonLanguageNext">
<property name="text">
<string>Next</string>
<item row="1" column="0" rowspan="4">
<widget class="QListWidget" name="listWidgetLanguage">
<property name="spacing">
<number>5</number>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -172,19 +162,90 @@
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
<height>8</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" rowspan="2">
<widget class="QListWidget" name="listWidgetLanguage">
<property name="spacing">
<number>5</number>
<item row="3" column="1" colspan="2">
<layout class="QGridLayout" name="gridLayout_5">
<item row="3" column="0">
<widget class="QPushButton" name="pushButtonGithub">
<property name="text">
<string>VCMI on Github</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="pushButtonSlack">
<property name="text">
<string>VCMI on Slack</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="pushButtonDiscord">
<property name="text">
<string>VCMI on Discord</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="labelLanguageSocial">
<property name="text">
<string>Have a question? Found a bug? Want to help? Join us:</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1" colspan="2">
<widget class="QLabel" name="labelLanguageWelcome">
<property name="text">
<string>Thanks for installing VCMI.
There are a few more steps to be done before you can start playing.
Keep in mind that in order to use VCMI you need to own original data files, Heroes III: Complete Edition or Shadow of Death.
Heroes III: HD Edition is currently not supported</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>6</number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButtonLanguageNext">
<property name="text">
<string>Next</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
<zorder>labelLanguageWelcome</zorder>
<zorder>labelLanguageTitle</zorder>
<zorder>listWidgetLanguage</zorder>
</widget>
<widget class="QWidget" name="pageDataFiles">
<layout class="QVBoxLayout" name="verticalLayout_4">
@ -539,24 +600,8 @@
</spacer>
</item>
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="labelPresetDescription">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Optionally, you can install additional mods either now or at any point later:</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout_4" columnstretch="1,10,25">
<item row="2" column="0">
<widget class="QCheckBox" name="checkBoxPresetLanguage">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
@ -572,7 +617,29 @@
</property>
</widget>
</item>
<item row="1" column="1">
<item row="4" column="1">
<widget class="QLabel" name="labelPresetHota">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Horn of the Abyss</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="labelPresetLanguage">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@ -580,15 +647,21 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Install translation of Heroes III to your language</string>
<string>Heroes III Translation</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QCheckBox" name="checkBoxPresetExtras">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
@ -604,8 +677,110 @@
</property>
</widget>
</item>
<item row="2" column="1">
<item row="4" column="0">
<widget class="QCheckBox" name="checkBoxPresetHota">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="checkBoxPresetWog">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="labelPresetExtras">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>High Definition Support</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="labelPresetWog">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>In The Wake of Gods</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="labelPresetLanguageDescr">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Install translation of Heroes III to your language</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="labelPresetDescription">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Optionally, you can install additional mods either now or at any point later:</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="labelPresetExtrasDescr">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
@ -620,21 +795,8 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBoxPresetHota">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="labelPresetHota">
<item row="4" column="2">
<widget class="QLabel" name="labelPresetHotaDescr">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
@ -649,21 +811,8 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="checkBoxPresetWog">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="labelPresetWog">
<item row="5" column="2">
<widget class="QLabel" name="labelPresetWogDecsr">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>

View File

@ -316,7 +316,6 @@ CModEntry CModList::getMod(QString modname) const
settings["active"] = false;
}
for(auto entry : repositories)
{
QVariant repoVal = getValue(entry, path);

View File

@ -12,19 +12,6 @@
#include <QIcon>
namespace ModFields
{
static const QString names[ModFields::COUNT] =
{
"name",
"",
"",
"modType",
"version",
};
}
namespace ModStatus
{
static const QString iconDelete = "icons:mod-delete.png";
@ -48,18 +35,59 @@ QString CModListModel::modIndexToName(const QModelIndex & index) const
return "";
}
QString CModListModel::modTypeName(QString modTypeID) const
{
static QMap<QString, QString> modTypes = {
{"Translation", tr("Translation")},
{"Town", tr("Town") },
{"Test", tr("Test") },
{"Templates", tr("Templates") },
{"Spells", tr("Spells") },
{"Music", tr("Music") },
{"Sounds", tr("Sounds") },
{"Skills", tr("Skills") },
{"Other", tr("Other") },
{"Objects", tr("Objects") },
{"Mechanical", tr("Mechanics") },
{"Mechanics", tr("Mechanics") },
{"Themes", tr("Interface") },
{"Interface", tr("Interface") },
{"Heroes", tr("Heroes") },
{"Graphic", tr("Graphical") },
{"Graphical", tr("Graphical") },
{"Expansion", tr("Expansion") },
{"Creatures", tr("Creatures") },
{"Artifacts", tr("Artifacts") },
{"AI", tr("AI") },
};
if (modTypes.contains(modTypeID))
return modTypes[modTypeID];
return tr("Other");
}
QVariant CModListModel::getValue(const CModEntry & mod, int field) const
{
switch(field)
{
case ModFields::STATUS_ENABLED:
return mod.getModStatus() & (ModStatus::ENABLED | ModStatus::INSTALLED);
case ModFields::STATUS_ENABLED:
return mod.getModStatus() & (ModStatus::ENABLED | ModStatus::INSTALLED);
case ModFields::STATUS_UPDATE:
return mod.getModStatus() & (ModStatus::UPDATEABLE | ModStatus::INSTALLED);
case ModFields::STATUS_UPDATE:
return mod.getModStatus() & (ModStatus::UPDATEABLE | ModStatus::INSTALLED);
default:
return mod.getValue(ModFields::names[field]);
case ModFields::NAME:
return mod.getValue("name");
case ModFields::VERSION:
return mod.getValue("version");
case ModFields::TYPE:
return modTypeName(mod.getValue("modType").toString());
default:
return QVariant();
}
}

View File

@ -48,6 +48,7 @@ class CModListModel : public QAbstractItemModel, public CModList
void endResetModel();
QString modIndexToName(const QModelIndex & index) const;
QString modTypeName(QString modTypeID) const;
QVariant getTextAlign(int field) const;
QVariant getValue(const CModEntry & mod, int field) const;

View File

@ -24,6 +24,7 @@
#include "../jsonutils.h"
#include "../../lib/CConfigHandler.h"
#include "../../lib/Languages.h"
void CModListView::setupModModel()
{
@ -74,8 +75,9 @@ void CModListView::setupModsView()
ui->allModsView->setColumnWidth(ModFields::TYPE, 75);
ui->allModsView->setColumnWidth(ModFields::VERSION, 60);
}
ui->allModsView->setColumnWidth(ModFields::STATUS_ENABLED, 24);
ui->allModsView->setColumnWidth(ModFields::STATUS_UPDATE, 24);
ui->allModsView->resizeColumnToContents(ModFields::STATUS_ENABLED);
ui->allModsView->resizeColumnToContents(ModFields::STATUS_UPDATE);
ui->allModsView->setUniformRowHeights(true);
@ -212,6 +214,25 @@ QString CModListView::genChangelogText(CModEntry & mod)
return result;
}
QStringList CModListView::getModNames(QStringList input)
{
QStringList result;
for(const auto & modID : input)
{
auto mod = modModel->getMod(modID);
QString modName = mod.getValue("name").toString();
if (modName.isEmpty())
result += modID;
else
result += modName;
}
return result;
}
QString CModListView::genModInfoText(CModEntry & mod)
{
QString prefix = "<p><span style=\" font-weight:600;\">%1: </span>"; // shared prefix
@ -221,7 +242,6 @@ QString CModListView::genModInfoText(CModEntry & mod)
QString textTemplate = prefix + "</p><p align=\"justify\">%2</p>";
QString listTemplate = "<p align=\"justify\">%1: %2</p>";
QString noteTemplate = "<p align=\"justify\">%1</p>";
QString compatibleString = prefix + tr("Mod is compatible") + "</p>";
QString incompatibleString = redPrefix + tr("Mod is incompatible") + "</p>";
QString supportedVersions = redPrefix + "%2 %3 %4</p>";
@ -242,9 +262,7 @@ QString CModListView::genModInfoText(CModEntry & mod)
result += urlTemplate.arg(tr("Contact")).arg(mod.getValue("contact").toString()).arg(mod.getValue("contact").toString());
//compatibility info
if(mod.isCompatible())
result += compatibleString.arg(tr("Compatibility"));
else
if(!mod.isCompatible())
{
auto compatibilityInfo = mod.getValue("compatibility").toMap();
auto minStr = compatibilityInfo.value("min").toString();
@ -267,9 +285,34 @@ QString CModListView::genModInfoText(CModEntry & mod)
}
}
result += replaceIfNotEmpty(mod.getValue("depends"), lineTemplate.arg(tr("Required mods")));
result += replaceIfNotEmpty(mod.getValue("conflicts"), lineTemplate.arg(tr("Conflicting mods")));
result += replaceIfNotEmpty(mod.getValue("description"), textTemplate.arg(tr("Description")));
QStringList supportedLanguages;
QVariant baseLanguageVariant = mod.getBaseValue("language");
QString baseLanguageID = baseLanguageVariant.isValid() ? baseLanguageVariant.toString() : "english";
bool needToShowSupportedLanguages = false;
for(const auto & language : Languages::getLanguageList())
{
if (!language.hasTranslation)
continue;
QString languageID = QString::fromStdString(language.identifier);
if (languageID != baseLanguageID && !mod.getValue(languageID).isValid())
continue;
if (languageID != baseLanguageID)
needToShowSupportedLanguages = true;
supportedLanguages += QApplication::translate("Language", language.nameEnglish.c_str());
}
if(needToShowSupportedLanguages)
result += replaceIfNotEmpty(supportedLanguages, lineTemplate.arg(tr("Languages")));
result += replaceIfNotEmpty(getModNames(mod.getValue("depends").toStringList()), lineTemplate.arg(tr("Required mods")));
result += replaceIfNotEmpty(getModNames(mod.getValue("conflicts").toStringList()), lineTemplate.arg(tr("Conflicting mods")));
result += replaceIfNotEmpty(getModNames(mod.getValue("description").toStringList()), textTemplate.arg(tr("Description")));
result += "<p></p>"; // to get some empty space
@ -281,12 +324,12 @@ QString CModListView::genModInfoText(CModEntry & mod)
QString notes;
notes += replaceIfNotEmpty(findInvalidDependencies(mod.getName()), listTemplate.arg(unknownDeps));
notes += replaceIfNotEmpty(findBlockingMods(mod.getName()), listTemplate.arg(blockingMods));
notes += replaceIfNotEmpty(getModNames(findInvalidDependencies(mod.getName())), listTemplate.arg(unknownDeps));
notes += replaceIfNotEmpty(getModNames(findBlockingMods(mod.getName())), listTemplate.arg(blockingMods));
if(mod.isEnabled())
notes += replaceIfNotEmpty(findDependentMods(mod.getName(), true), listTemplate.arg(hasActiveDependentMods));
notes += replaceIfNotEmpty(getModNames(findDependentMods(mod.getName(), true)), listTemplate.arg(hasActiveDependentMods));
if(mod.isInstalled())
notes += replaceIfNotEmpty(findDependentMods(mod.getName(), false), listTemplate.arg(hasDependentMods));
notes += replaceIfNotEmpty(getModNames(findDependentMods(mod.getName(), false)), listTemplate.arg(hasDependentMods));
if(mod.getName().contains('.'))
notes += noteTemplate.arg(thisIsSubmod);
@ -829,10 +872,10 @@ void CModListView::doInstallMod(const QString & modName)
}
}
bool CModListView::isModInstalled(const QString & modName)
bool CModListView::isModAvailable(const QString & modName)
{
auto mod = modModel->getMod(modName);
return mod.isInstalled();
return mod.isAvailable();
}
bool CModListView::isModEnabled(const QString & modName)

View File

@ -47,6 +47,9 @@ class CModListView : public QWidget
void checkManagerErrors();
/// replace mod ID's with proper human-readable mod names
QStringList getModNames(QStringList input);
// find mods unknown to mod list (not present in repo and not installed)
QStringList findInvalidDependencies(QString mod);
// find mods that block enabling of this mod: conflicting with this mod or one of required mods
@ -86,8 +89,8 @@ public:
/// install mod by name
void doInstallMod(const QString & modName);
/// returns true if mod is currently installed
bool isModInstalled(const QString & modName);
/// returns true if mod is available in repository and can be installed
bool isModAvailable(const QString & modName);
/// finds translation mod for specified languages. Returns empty string on error
QString getTranslationModName(const QString & language);

View File

@ -375,7 +375,7 @@ void CSettingsView::loadTranslation()
if (!translationExists)
return;
bool translationInstalled = mainWindow->getModView()->isModInstalled(modName);
bool translationAvailable = mainWindow->getModView()->isModAvailable(modName);
bool translationEnabled = mainWindow->getModView()->isModEnabled(modName);
ui->pushButtonTranslation->setVisible(!translationEnabled);
@ -385,13 +385,13 @@ void CSettingsView::loadTranslation()
ui->labelTranslationStatus->setText(tr("Active"));
}
if (translationInstalled && !translationEnabled)
if (!translationEnabled && !translationAvailable)
{
ui->labelTranslationStatus->setText(tr("Disabled"));
ui->pushButtonTranslation->setText(tr("Enable"));
}
if (!translationInstalled)
if (translationAvailable)
{
ui->labelTranslationStatus->setText(tr("Not Installed"));
ui->pushButtonTranslation->setText(tr("Install"));
@ -413,15 +413,15 @@ void CSettingsView::on_pushButtonTranslation_clicked()
if (modName.isEmpty())
return;
if (mainWindow->getModView()->isModInstalled(modName))
{
mainWindow->getModView()->enableModByName(modName);
}
else
if (mainWindow->getModView()->isModAvailable(modName))
{
mainWindow->switchToModsTab();
mainWindow->getModView()->doInstallMod(modName);
}
else
{
mainWindow->getModView()->enableModByName(modName);
}
}
void CSettingsView::on_comboBoxLanguageBase_currentIndexChanged(int index)

View File

@ -4,17 +4,111 @@
<context>
<name>CModListModel</name>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="142"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="42"/>
<source>Translation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="43"/>
<source>Town</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="44"/>
<source>Test</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="45"/>
<source>Templates</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="46"/>
<source>Spells</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="47"/>
<source>Music</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="48"/>
<source>Sounds</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="49"/>
<source>Skills</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="50"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="67"/>
<source>Other</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="51"/>
<source>Objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="52"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="53"/>
<source>Mechanics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="54"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="55"/>
<source>Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="56"/>
<source>Heroes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="57"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="58"/>
<source>Graphical</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="59"/>
<source>Expansion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="60"/>
<source>Creatures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="61"/>
<source>Artifacts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="62"/>
<source>AI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="170"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="145"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="173"/>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="146"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="174"/>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
@ -63,7 +157,7 @@
</message>
<message>
<location filename="../modManager/cmodlistview_moc.ui" line="163"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="272"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="315"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
@ -113,114 +207,113 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="230"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="250"/>
<source>Mod name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="231"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="251"/>
<source>Installed version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="232"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="252"/>
<source>Latest version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="235"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<source>Download size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="236"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="256"/>
<source>Authors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="239"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="259"/>
<source>License</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="242"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="262"/>
<source>Contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="246"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="253"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<source>Compatibility</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="263"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="273"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="281"/>
<source>Required VCMI version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="261"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<source>Supported VCMI version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="266"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="284"/>
<source>Supported VCMI versions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="270"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="311"/>
<source>Languages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="313"/>
<source>Required mods</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="314"/>
<source>Conflicting mods</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="276"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="319"/>
<source>This mod can not be installed or enabled because following dependencies are not present</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="277"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="320"/>
<source>This mod can not be enabled because following mods are incompatible with this mod</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="278"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="321"/>
<source>This mod can not be disabled because it is required to run following mods</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="322"/>
<source>This mod can not be uninstalled or updated because it is required to run following mods</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="280"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="323"/>
<source>This is submod and it can not be installed or uninstalled separately from parent mod</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="295"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="338"/>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="797"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="840"/>
<source>Screenshot %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="224"/>
<source>Mod is compatible</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="225"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="245"/>
<source>Mod is incompatible</source>
<translation type="unfinished"></translation>
</message>
@ -449,32 +542,32 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="384"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="445"/>
<source>Your Heroes III data files have been successfully found.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="552"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="775"/>
<source>Optionally, you can install additional mods either now or at any point later:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="616"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="791"/>
<source>Install support for playing Heroes III in resolutions other than 800x600.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="645"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="807"/>
<source>Install compatible version of addon Horn of the Abyss: fan-made Heroes III expansion, ported by VCMI team</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="674"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="823"/>
<source>Install compatible version of addon &quot;In The Wake of Gods&quot;: fan-made Heroes III expansion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="870"/>
<source>Finish</source>
<translation type="unfinished"></translation>
</message>
@ -484,84 +577,135 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="143"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="146"/>
<source>Choose your language</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="150"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="493"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="175"/>
<source>VCMI on Github</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="182"/>
<source>VCMI on Slack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="189"/>
<source>VCMI on Discord</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="196"/>
<source>Have a question? Found a bug? Want to help? Join us:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="205"/>
<source>Thanks for installing VCMI.
There are a few more steps to be done before you can start playing.
Keep in mind that in order to use VCMI you need to own original data files, Heroes III: Complete Edition or Shadow of Death.
Heroes III: HD Edition is currently not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="239"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="554"/>
<source>Next</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="215"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="276"/>
<source>Find Heroes III data files</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="246"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="307"/>
<source>Open help in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="259"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<source>Search again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="304"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="365"/>
<source>If you don&apos;t have installed Heroes III copy, it is possible to use our automatic installation tool &apos;vcmibuilder&apos; to extract data from GoG.com installer. Visit our wiki for detailed instructions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="381"/>
<source>VCMI requires Heroes III data files in one of the locations listed above. Please copy Heroes III data in one of these directories.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="342"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="403"/>
<source>Heroes III data files</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="355"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="416"/>
<source>Alternatively, you can select directory with installed Heroes III data and VCMI will copy exisiting data automatically.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="371"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="432"/>
<source>Copy existing data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="414"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="475"/>
<source>Your Heroes III language has been successfully detected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="424"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="485"/>
<source>Automatic detection of language failed. Please select language of your Heroes III copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="443"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="504"/>
<source>Heroes III language</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="486"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="714"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="547"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="863"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="524"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="585"/>
<source>Install VCMI Mod Preset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="584"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="635"/>
<source>Horn of the Abyss</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="657"/>
<source>Heroes III Translation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<source>High Definition Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="743"/>
<source>In The Wake of Gods</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="759"/>
<source>Install translation of Heroes III to your language</source>
<translation type="unfinished"></translation>
</message>

View File

@ -4,17 +4,111 @@
<context>
<name>CModListModel</name>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="142"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="42"/>
<source>Translation</source>
<translation>Übersetzung</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="43"/>
<source>Town</source>
<translation>Stadt</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="44"/>
<source>Test</source>
<translation>Test</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="45"/>
<source>Templates</source>
<translation>Templates</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="46"/>
<source>Spells</source>
<translation>Zaubersprüche</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="47"/>
<source>Music</source>
<translation>Musik</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="48"/>
<source>Sounds</source>
<translation>Sounds</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="49"/>
<source>Skills</source>
<translation>Fertigkeiten</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="50"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="67"/>
<source>Other</source>
<translation>Andere</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="51"/>
<source>Objects</source>
<translation>Objekte</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="52"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="53"/>
<source>Mechanics</source>
<translation>Mechaniken</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="54"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="55"/>
<source>Interface</source>
<translation>Schnittstelle</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="56"/>
<source>Heroes</source>
<translation>Helden</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="57"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="58"/>
<source>Graphical</source>
<translation>Grafisches</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="59"/>
<source>Expansion</source>
<translation>Erweiterung</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="60"/>
<source>Creatures</source>
<translation>Kreaturen</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="61"/>
<source>Artifacts</source>
<translation>Artefakte</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="62"/>
<source>AI</source>
<translation>KI</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="170"/>
<source>Name</source>
<translation>Name</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="145"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="173"/>
<source>Type</source>
<translation>Typ</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="146"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="174"/>
<source>Version</source>
<translation>Version</translation>
</message>
@ -63,7 +157,7 @@
</message>
<message>
<location filename="../modManager/cmodlistview_moc.ui" line="163"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="272"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="315"/>
<source>Description</source>
<translation>Beschreibung</translation>
</message>
@ -113,114 +207,113 @@
<translation>Abbrechen</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="230"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="250"/>
<source>Mod name</source>
<translation>Mod-Name</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="231"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="251"/>
<source>Installed version</source>
<translation>Installierte Version</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="232"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="252"/>
<source>Latest version</source>
<translation>Letzte Version</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="235"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<source>Download size</source>
<translation>Downloadgröße</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="236"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="256"/>
<source>Authors</source>
<translation>Autoren</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="239"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="259"/>
<source>License</source>
<translation>Lizenz</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="242"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="262"/>
<source>Contact</source>
<translation type="unfinished"></translation>
<translation>Kontakt</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="246"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="253"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<source>Compatibility</source>
<translation>Kompatibilität</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="263"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="273"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="281"/>
<source>Required VCMI version</source>
<translation>Benötigte VCMI Version</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="261"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<source>Supported VCMI version</source>
<translation>Unterstützte VCMI Version</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="266"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="284"/>
<source>Supported VCMI versions</source>
<translation>Unterstützte VCMI Versionen</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="270"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="311"/>
<source>Languages</source>
<translation>Sprachen</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="313"/>
<source>Required mods</source>
<translation>Benötigte Mods</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="314"/>
<source>Conflicting mods</source>
<translation>Mods mit Konflikt</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="276"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="319"/>
<source>This mod can not be installed or enabled because following dependencies are not present</source>
<translation>Diese Mod kann nicht installiert oder aktiviert werden, da die folgenden Abhängigkeiten nicht vorhanden sind</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="277"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="320"/>
<source>This mod can not be enabled because following mods are incompatible with this mod</source>
<translation>Diese Mod kann nicht aktiviert werden, da folgende Mods nicht mit dieser Mod kompatibel sind</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="278"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="321"/>
<source>This mod can not be disabled because it is required to run following mods</source>
<translation>Diese Mod kann nicht deaktiviert werden, da sie zum Ausführen der folgenden Mods erforderlich ist</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="322"/>
<source>This mod can not be uninstalled or updated because it is required to run following mods</source>
<translation>Diese Mod kann nicht deinstalliert oder aktualisiert werden, da sie für die folgenden Mods erforderlich ist</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="280"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="323"/>
<source>This is submod and it can not be installed or uninstalled separately from parent mod</source>
<translation>Dies ist eine Submod und kann nicht separat von der Hauptmod installiert oder deinstalliert werden</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="295"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="338"/>
<source>Notes</source>
<translation>Anmerkungen</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="797"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="840"/>
<source>Screenshot %1</source>
<translation>Screenshot %1</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="224"/>
<source>Mod is compatible</source>
<translation>Mod ist kompatibel</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="225"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="245"/>
<source>Mod is incompatible</source>
<translation>Mod ist inkompatibel</translation>
</message>
@ -242,7 +335,7 @@
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="590"/>
<source>Adventure Map AI</source>
<translation type="unfinished"></translation>
<translation>Abenteuerkarte KI</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="334"/>
@ -261,18 +354,18 @@
<location filename="../settingsView/csettingsview_moc.ui" line="79"/>
<location filename="../settingsView/csettingsview_moc.ui" line="576"/>
<source>Artificial Intelligence</source>
<translation type="unfinished"></translation>
<translation>Künstliche Intelligenz</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="89"/>
<location filename="../settingsView/csettingsview_moc.ui" line="415"/>
<source>Mod Repositories</source>
<translation type="unfinished"></translation>
<translation>Mod-Repositorien</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="368"/>
<source>Update now</source>
<translation type="unfinished"></translation>
<translation>Jetzt aktualisieren</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="261"/>
@ -285,37 +378,37 @@
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="215"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
<translation>Zeiger</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="500"/>
<source>Heroes III Data Language</source>
<translation type="unfinished"></translation>
<translation>Sprache der Heroes III Daten</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="552"/>
<source>Default</source>
<translation type="unfinished"></translation>
<translation>Standard</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="557"/>
<source>Hardware</source>
<translation type="unfinished"></translation>
<translation>Hardware</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="562"/>
<source>Software</source>
<translation type="unfinished"></translation>
<translation>Software</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="597"/>
<source>Heroes III Translation</source>
<translation type="unfinished"></translation>
<translation>Heroes III Übersetzung</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="429"/>
<source>Check on startup</source>
<translation type="unfinished"></translation>
<translation>Beim Start prüfen</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.ui" line="158"/>
@ -408,27 +501,27 @@
<message>
<location filename="../settingsView/csettingsview_moc.cpp" line="385"/>
<source>Active</source>
<translation type="unfinished">Aktiv</translation>
<translation>Aktiv</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.cpp" line="390"/>
<source>Disabled</source>
<translation type="unfinished"></translation>
<translation>Deaktiviert</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.cpp" line="391"/>
<source>Enable</source>
<translation type="unfinished">Aktivieren</translation>
<translation>Aktivieren</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.cpp" line="396"/>
<source>Not Installed</source>
<translation type="unfinished"></translation>
<translation>Nicht installiert</translation>
</message>
<message>
<location filename="../settingsView/csettingsview_moc.cpp" line="397"/>
<source>Install</source>
<translation type="unfinished">Installieren</translation>
<translation>Installieren</translation>
</message>
</context>
<context>
@ -436,134 +529,191 @@
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="28"/>
<source>Language</source>
<translation type="unfinished"></translation>
<translation>Sprache</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="53"/>
<source>Heroes III Data</source>
<translation type="unfinished"></translation>
<translation>Heroes III Daten</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="78"/>
<source>Mods Preset</source>
<translation type="unfinished"></translation>
<translation>Mods Voreinstellung</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="384"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="445"/>
<source>Your Heroes III data files have been successfully found.</source>
<translation type="unfinished"></translation>
<translation>Ihre Heroes III-Datendateien wurden erfolgreich gefunden.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="552"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="775"/>
<source>Optionally, you can install additional mods either now or at any point later:</source>
<translation type="unfinished"></translation>
<translation>Optional können Sie jetzt oder zu einem beliebigen späteren Zeitpunkt zusätzliche Mods installieren:</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="616"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="791"/>
<source>Install support for playing Heroes III in resolutions other than 800x600.</source>
<translation type="unfinished"></translation>
<translation>Installieren Sie Unterstützung für das Spielen von Heroes III in anderen Auflösungen als 800x600.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="645"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="807"/>
<source>Install compatible version of addon Horn of the Abyss: fan-made Heroes III expansion, ported by VCMI team</source>
<translation type="unfinished"></translation>
<translation>Installieren Sie die kompatible Version des Addons Horn of the Abyss: eine von Fans entwickelte Heroes III-Erweiterung, portiert vom VCMI-Team</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="674"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="823"/>
<source>Install compatible version of addon &quot;In The Wake of Gods&quot;: fan-made Heroes III expansion</source>
<translation type="unfinished"></translation>
<translation>Installieren Sie die kompatible Version des Addons &quot;In The Wake of Gods&quot;: von Fans entwickelte Heroes III-Erweiterung</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="870"/>
<source>Finish</source>
<translation type="unfinished"></translation>
<translation>Fertigstellen</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="111"/>
<source>Step %v out of %m</source>
<translation type="unfinished"></translation>
<translation>Schritt %v von %m</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="143"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="146"/>
<source>Choose your language</source>
<translation type="unfinished"></translation>
<translation>Wählen Sie Ihre Sprache</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="150"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="493"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="175"/>
<source>VCMI on Github</source>
<translation>VCMI auf Github</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="182"/>
<source>VCMI on Slack</source>
<translation>VCMI auf Slack</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="189"/>
<source>VCMI on Discord</source>
<translation>VCMI auf Discord</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="196"/>
<source>Have a question? Found a bug? Want to help? Join us:</source>
<translation>Haben Sie eine Frage? Einen Fehler gefunden? Möchten Sie helfen? Machen Sie mit:</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="205"/>
<source>Thanks for installing VCMI.
There are a few more steps to be done before you can start playing.
Keep in mind that in order to use VCMI you need to own original data files, Heroes III: Complete Edition or Shadow of Death.
Heroes III: HD Edition is currently not supported</source>
<translation>Vielen Dank für die Installation von VCMI.
Es sind noch ein paar Schritte notwendig, bevor Sie mit dem Spielen beginnen können.
Denken Sie daran, dass Sie die Originaldateien, Heroes III: Complete Edition oder Shadow of Death besitzen müssen, um VCMI verwenden zu können.
Heroes III: HD Edition wird derzeit nicht unterstützt</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="239"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="554"/>
<source>Next</source>
<translation type="unfinished"></translation>
<translation>Weiter</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="215"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="276"/>
<source>Find Heroes III data files</source>
<translation type="unfinished"></translation>
<translation>Heroes III Daten suchen</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="246"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="307"/>
<source>Open help in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="259"/>
<source>Search again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="304"/>
<source>If you don&apos;t have installed Heroes III copy, it is possible to use our automatic installation tool &apos;vcmibuilder&apos; to extract data from GoG.com installer. Visit our wiki for detailed instructions.</source>
<translation type="unfinished"></translation>
<translation>Hilfe im Browser öffnen</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<source>Search again</source>
<translation>Erneut suchen</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="365"/>
<source>If you don&apos;t have installed Heroes III copy, it is possible to use our automatic installation tool &apos;vcmibuilder&apos; to extract data from GoG.com installer. Visit our wiki for detailed instructions.</source>
<translation>Wenn Sie keine Kopie von Heroes III installiert haben, können Sie unser automatisches Installationstool &apos;vcmibuilder&apos; verwenden, um Daten aus dem GoG.com-Installationsprogramm zu extrahieren. Besuchen Sie unser Wiki für detaillierte Anweisungen.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="381"/>
<source>VCMI requires Heroes III data files in one of the locations listed above. Please copy Heroes III data in one of these directories.</source>
<translation type="unfinished"></translation>
<translation>VCMI benötigt Heroes III Daten in einem der oben aufgeführten Verzeichnisse. Bitte kopieren Sie die Heroes III-Daten in eines dieser Verzeichnisse.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="342"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="403"/>
<source>Heroes III data files</source>
<translation type="unfinished"></translation>
<translation>Heroes III Dateien</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="355"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="416"/>
<source>Alternatively, you can select directory with installed Heroes III data and VCMI will copy exisiting data automatically.</source>
<translation type="unfinished"></translation>
<translation>Alternativ können Sie ein Verzeichnis mit installierten Heroes III-Daten auswählen, und VCMI wird die vorhandenen Daten automatisch kopieren.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="371"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="432"/>
<source>Copy existing data</source>
<translation type="unfinished"></translation>
<translation>Vorhandene Daten kopieren</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="414"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="475"/>
<source>Your Heroes III language has been successfully detected.</source>
<translation type="unfinished"></translation>
<translation>Ihre Heroes III-Sprache wurde erfolgreich erkannt.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="424"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="485"/>
<source>Automatic detection of language failed. Please select language of your Heroes III copy</source>
<translation type="unfinished"></translation>
<translation>Automatische Erkennung der Sprache fehlgeschlagen. Bitte wählen Sie die Sprache Ihrer Heroes III Kopie</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="443"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="504"/>
<source>Heroes III language</source>
<translation type="unfinished"></translation>
<translation>Heroes III Sprache</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="486"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="714"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="547"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="863"/>
<source>Back</source>
<translation type="unfinished"></translation>
<translation>Zurück</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="524"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="585"/>
<source>Install VCMI Mod Preset</source>
<translation type="unfinished"></translation>
<translation>VCMI Mod Voreinstellung installieren</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="584"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="635"/>
<source>Horn of the Abyss</source>
<translation>Horn of the Abyss</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="657"/>
<source>Heroes III Translation</source>
<translation>Heroes III Übersetzung</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<source>High Definition Support</source>
<translation>Unterstützung für hohe Auflösungen</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="743"/>
<source>In The Wake of Gods</source>
<translation>In The Wake of Gods</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="759"/>
<source>Install translation of Heroes III to your language</source>
<translation type="unfinished"></translation>
<translation>Übersetzung von Heroes III für Ihre Sprache installieren</translation>
</message>
</context>
<context>
@ -579,67 +729,67 @@
<message>
<location filename="../languages.cpp" line="23"/>
<source>Chinese</source>
<translation type="unfinished"></translation>
<translation>Chinesisch</translation>
</message>
<message>
<location filename="../languages.cpp" line="24"/>
<source>English</source>
<translation type="unfinished">English (Englisch)</translation>
<translation>Englisch</translation>
</message>
<message>
<location filename="../languages.cpp" line="25"/>
<source>French</source>
<translation type="unfinished"></translation>
<translation>Französisch</translation>
</message>
<message>
<location filename="../languages.cpp" line="26"/>
<source>German</source>
<translation type="unfinished"></translation>
<translation>Deutsch</translation>
</message>
<message>
<location filename="../languages.cpp" line="27"/>
<source>Korean</source>
<translation type="unfinished"></translation>
<translation>Koreanisch</translation>
</message>
<message>
<location filename="../languages.cpp" line="28"/>
<source>Polish</source>
<translation type="unfinished"></translation>
<translation>Polnisch</translation>
</message>
<message>
<location filename="../languages.cpp" line="29"/>
<source>Russian</source>
<translation type="unfinished"></translation>
<translation>Russisch</translation>
</message>
<message>
<location filename="../languages.cpp" line="30"/>
<source>Spanish</source>
<translation type="unfinished"></translation>
<translation>Spanisch</translation>
</message>
<message>
<location filename="../languages.cpp" line="31"/>
<source>Ukrainian</source>
<translation type="unfinished"></translation>
<translation>Ukrainisch</translation>
</message>
<message>
<location filename="../languages.cpp" line="32"/>
<source>Other (East European)</source>
<translation type="unfinished"></translation>
<translation>Sonstige (osteuropäisch)</translation>
</message>
<message>
<location filename="../languages.cpp" line="33"/>
<source>Other (Cyrillic Script)</source>
<translation type="unfinished"></translation>
<translation>Sonstige (kyrillische Schrift)</translation>
</message>
<message>
<location filename="../languages.cpp" line="34"/>
<source>Other (West European)</source>
<translation type="unfinished"></translation>
<translation>Sonstige (westeuropäisch)</translation>
</message>
<message>
<location filename="../languages.cpp" line="56"/>
<source>Auto (%1)</source>
<translation type="unfinished"></translation>
<translation>Auto (%1)</translation>
</message>
</context>
<context>
@ -663,12 +813,12 @@
<message>
<location filename="../lobby/lobby_moc.ui" line="76"/>
<source>People in lobby</source>
<translation type="unfinished"></translation>
<translation>Personen in der Lobby</translation>
</message>
<message>
<location filename="../lobby/lobby_moc.ui" line="114"/>
<source>Lobby chat</source>
<translation type="unfinished"></translation>
<translation>Lobby-Chat</translation>
</message>
<message>
<location filename="../lobby/lobby_moc.ui" line="194"/>
@ -683,17 +833,17 @@
<message>
<location filename="../lobby/lobby_moc.ui" line="274"/>
<source>Resolve</source>
<translation type="unfinished"></translation>
<translation>Auflösen</translation>
</message>
<message>
<location filename="../lobby/lobby_moc.ui" line="286"/>
<source>New game</source>
<translation type="unfinished"></translation>
<translation>Neues Spiel</translation>
</message>
<message>
<location filename="../lobby/lobby_moc.ui" line="293"/>
<source>Load game</source>
<translation type="unfinished"></translation>
<translation>Spiel laden</translation>
</message>
<message>
<location filename="../lobby/lobby_moc.ui" line="149"/>
@ -733,12 +883,12 @@
<message>
<location filename="../lobby/lobby_moc.cpp" line="369"/>
<source>Disconnect</source>
<translation type="unfinished"></translation>
<translation>Verbindung trennen</translation>
</message>
<message>
<location filename="../lobby/lobby_moc.cpp" line="461"/>
<source>No issues detected</source>
<translation type="unfinished"></translation>
<translation>Keine Probleme festgestellt</translation>
</message>
</context>
<context>
@ -789,7 +939,7 @@
<message>
<location filename="../mainwindow_moc.ui" line="226"/>
<source>Map Editor</source>
<translation type="unfinished"></translation>
<translation>Karteneditor</translation>
</message>
<message>
<location filename="../mainwindow_moc.ui" line="279"/>

View File

@ -4,17 +4,111 @@
<context>
<name>CModListModel</name>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="142"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="42"/>
<source>Translation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="43"/>
<source>Town</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="44"/>
<source>Test</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="45"/>
<source>Templates</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="46"/>
<source>Spells</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="47"/>
<source>Music</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="48"/>
<source>Sounds</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="49"/>
<source>Skills</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="50"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="67"/>
<source>Other</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="51"/>
<source>Objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="52"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="53"/>
<source>Mechanics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="54"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="55"/>
<source>Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="56"/>
<source>Heroes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="57"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="58"/>
<source>Graphical</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="59"/>
<source>Expansion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="60"/>
<source>Creatures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="61"/>
<source>Artifacts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="62"/>
<source>AI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="170"/>
<source>Name</source>
<translation>Nazwa</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="145"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="173"/>
<source>Type</source>
<translation>Typ</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="146"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="174"/>
<source>Version</source>
<translation>Wersja</translation>
</message>
@ -63,7 +157,7 @@
</message>
<message>
<location filename="../modManager/cmodlistview_moc.ui" line="163"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="272"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="315"/>
<source>Description</source>
<translation>Opis</translation>
</message>
@ -113,114 +207,113 @@
<translation>Przerwij</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="230"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="250"/>
<source>Mod name</source>
<translation>Nazwa moda</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="231"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="251"/>
<source>Installed version</source>
<translation>Zainstalowana wersja</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="232"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="252"/>
<source>Latest version</source>
<translation>Najnowsza wersja</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="235"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<source>Download size</source>
<translation>Rozmiar pobierania</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="236"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="256"/>
<source>Authors</source>
<translation>Autorzy</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="239"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="259"/>
<source>License</source>
<translation>Licencja</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="242"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="262"/>
<source>Contact</source>
<translation>Kontakt</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="246"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="253"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<source>Compatibility</source>
<translation>Kompatybilność</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="263"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="273"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="281"/>
<source>Required VCMI version</source>
<translation>Wymagana wersja VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="261"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<source>Supported VCMI version</source>
<translation>Wspierana wersja VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="266"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="284"/>
<source>Supported VCMI versions</source>
<translation>Wspierane wersje VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="270"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="311"/>
<source>Languages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="313"/>
<source>Required mods</source>
<translation>Wymagane mody</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="314"/>
<source>Conflicting mods</source>
<translation>Konfliktujące mody</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="276"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="319"/>
<source>This mod can not be installed or enabled because following dependencies are not present</source>
<translation>Ten mod nie może zostać zainstalowany lub włączony ponieważ następujące zależności nie zostały spełnione</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="277"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="320"/>
<source>This mod can not be enabled because following mods are incompatible with this mod</source>
<translation>Ten mod nie może zostać włączony ponieważ następujące mody z nim niekompatybilne</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="278"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="321"/>
<source>This mod can not be disabled because it is required to run following mods</source>
<translation>Ten mod nie może zostać wyłączony ponieważ jest wymagany by do uruchomienia następujących modów</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="322"/>
<source>This mod can not be uninstalled or updated because it is required to run following mods</source>
<translation>Ten mod nie może zostać odinstalowany lub zaktualizowany ponieważ jest wymagany do uruchomienia następujących modów</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="280"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="323"/>
<source>This is submod and it can not be installed or uninstalled separately from parent mod</source>
<translation>To jest moduł składowy innego moda i nie może być zainstalowany lub odinstalowany oddzielnie od moda nadrzędnego</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="295"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="338"/>
<source>Notes</source>
<translation>Uwagi</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="797"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="840"/>
<source>Screenshot %1</source>
<translation>Zrzut ekranu %1</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="224"/>
<source>Mod is compatible</source>
<translation>Mod jest kompatybilny</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="225"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="245"/>
<source>Mod is incompatible</source>
<translation>Mod jest niekompatybilny</translation>
</message>
@ -449,32 +542,32 @@
<translation>Zestaw modów</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="384"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="445"/>
<source>Your Heroes III data files have been successfully found.</source>
<translation>Twoje pliki Heroes III zostały pomyślnie znalezione.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="552"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="775"/>
<source>Optionally, you can install additional mods either now or at any point later:</source>
<translation>Opcjonalnie możesz zainstalować dodatkowe modyfikacje teraz lub później:</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="616"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="791"/>
<source>Install support for playing Heroes III in resolutions other than 800x600.</source>
<translation>Zapinstaluj wsparcie dla grania w Heroes III w rozdzielczości innej niż 800x600.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="645"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="807"/>
<source>Install compatible version of addon Horn of the Abyss: fan-made Heroes III expansion, ported by VCMI team</source>
<translation>Zainstaluj kompatybilną wersję fanowskiego dodatku Horn of the Abyss przeportowaną przez zespół VCMI</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="674"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="823"/>
<source>Install compatible version of addon &quot;In The Wake of Gods&quot;: fan-made Heroes III expansion</source>
<translation>Zainstaluj kompatybilną wersję fanowskiego dodatku &quot;In The Wake Of Gods&quot;</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="870"/>
<source>Finish</source>
<translation>Zakończ</translation>
</message>
@ -484,84 +577,135 @@
<translation>Krok %v z %m</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="143"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="146"/>
<source>Choose your language</source>
<translation>Wybierz język</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="150"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="493"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="175"/>
<source>VCMI on Github</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="182"/>
<source>VCMI on Slack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="189"/>
<source>VCMI on Discord</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="196"/>
<source>Have a question? Found a bug? Want to help? Join us:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="205"/>
<source>Thanks for installing VCMI.
There are a few more steps to be done before you can start playing.
Keep in mind that in order to use VCMI you need to own original data files, Heroes III: Complete Edition or Shadow of Death.
Heroes III: HD Edition is currently not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="239"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="554"/>
<source>Next</source>
<translation>Dalej</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="215"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="276"/>
<source>Find Heroes III data files</source>
<translation>Znajdź pliki Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="246"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="307"/>
<source>Open help in browser</source>
<translation>Otwórz pomoc w przeglądarce</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="259"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<source>Search again</source>
<translation>Szukaj ponownie</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="304"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="365"/>
<source>If you don&apos;t have installed Heroes III copy, it is possible to use our automatic installation tool &apos;vcmibuilder&apos; to extract data from GoG.com installer. Visit our wiki for detailed instructions.</source>
<translation>Jeśli nie masz zainstalowanej kopii Heroes III istnieje możliwość użycia naszego automatycznego narzędzia instalacyjnego &apos;vcmibuilder&apos; by wyodrębnić dane z instalatora GoG.com. Odwiedź nasze wiki po szczegółowe instrukcje.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="381"/>
<source>VCMI requires Heroes III data files in one of the locations listed above. Please copy Heroes III data in one of these directories.</source>
<translation>VCMI wymaga plików Heroes III w jednej z wymienionych wyżej lokalizacji. Proszę, skopiuj pliki Heroes III do jednego z tych katalogów.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="342"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="403"/>
<source>Heroes III data files</source>
<translation>Pliki Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="355"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="416"/>
<source>Alternatively, you can select directory with installed Heroes III data and VCMI will copy exisiting data automatically.</source>
<translation>Możesz też wybrać folder z zainstalowanym Heroes III i VCMI automatycznie skopiuje istniejące dane.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="371"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="432"/>
<source>Copy existing data</source>
<translation>Skopiuj istniejące dane</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="414"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="475"/>
<source>Your Heroes III language has been successfully detected.</source>
<translation>Twój język Heroes III został pomyślnie wykryty.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="424"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="485"/>
<source>Automatic detection of language failed. Please select language of your Heroes III copy</source>
<translation>Automatyczna detekcja języka nie powiodła się. Proszę wybrać język twojego Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="443"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="504"/>
<source>Heroes III language</source>
<translation>Język Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="486"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="714"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="547"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="863"/>
<source>Back</source>
<translation>Wstecz</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="524"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="585"/>
<source>Install VCMI Mod Preset</source>
<translation>Zainstaluj zestaw modyfikacji</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="584"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="635"/>
<source>Horn of the Abyss</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="657"/>
<source>Heroes III Translation</source>
<translation type="unfinished">Tłumaczenie Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<source>High Definition Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="743"/>
<source>In The Wake of Gods</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="759"/>
<source>Install translation of Heroes III to your language</source>
<translation>Zainstaluj tłumaczenie Heroes III dla twojego języka</translation>
</message>

View File

@ -4,17 +4,111 @@
<context>
<name>CModListModel</name>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="142"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="42"/>
<source>Translation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="43"/>
<source>Town</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="44"/>
<source>Test</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="45"/>
<source>Templates</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="46"/>
<source>Spells</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="47"/>
<source>Music</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="48"/>
<source>Sounds</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="49"/>
<source>Skills</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="50"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="67"/>
<source>Other</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="51"/>
<source>Objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="52"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="53"/>
<source>Mechanics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="54"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="55"/>
<source>Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="56"/>
<source>Heroes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="57"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="58"/>
<source>Graphical</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="59"/>
<source>Expansion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="60"/>
<source>Creatures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="61"/>
<source>Artifacts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="62"/>
<source>AI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="170"/>
<source>Name</source>
<translation>Название</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="145"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="173"/>
<source>Type</source>
<translation>Тип</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="146"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="174"/>
<source>Version</source>
<translation>Версия</translation>
</message>
@ -63,7 +157,7 @@
</message>
<message>
<location filename="../modManager/cmodlistview_moc.ui" line="163"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="272"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="315"/>
<source>Description</source>
<translation>Описание</translation>
</message>
@ -113,114 +207,113 @@
<translation>Отмена</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="230"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="250"/>
<source>Mod name</source>
<translation>Название мода</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="231"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="251"/>
<source>Installed version</source>
<translation>Установленная версия</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="232"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="252"/>
<source>Latest version</source>
<translation>Последняя версия</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="235"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<source>Download size</source>
<translation>Размер загрузки</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="236"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="256"/>
<source>Authors</source>
<translation>Авторы</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="239"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="259"/>
<source>License</source>
<translation>Лицензия</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="242"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="262"/>
<source>Contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="246"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="253"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<source>Compatibility</source>
<translation>Совместимость</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="263"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="273"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="281"/>
<source>Required VCMI version</source>
<translation>Требуемая версия VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="261"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<source>Supported VCMI version</source>
<translation>Поддерживаемая версия VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="266"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="284"/>
<source>Supported VCMI versions</source>
<translation>Поддерживаемые версии VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="270"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="311"/>
<source>Languages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="313"/>
<source>Required mods</source>
<translation>Зависимости</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="314"/>
<source>Conflicting mods</source>
<translation>Конфликтующие моды</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="276"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="319"/>
<source>This mod can not be installed or enabled because following dependencies are not present</source>
<translation>Этот мод не может быть установлен или активирован, так как отсутствуют следующие зависимости</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="277"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="320"/>
<source>This mod can not be enabled because following mods are incompatible with this mod</source>
<translation>Этот мод не может быть установлен или активирован, так как следующие моды несовместимы с этим</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="278"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="321"/>
<source>This mod can not be disabled because it is required to run following mods</source>
<translation>Этот мод не может быть выключен, так как он является зависимостью для следующих</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="322"/>
<source>This mod can not be uninstalled or updated because it is required to run following mods</source>
<translation>Этот мод не может быть удален или обновлен, так как является зависимостью для следующих модов</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="280"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="323"/>
<source>This is submod and it can not be installed or uninstalled separately from parent mod</source>
<translation>Это вложенный мод, он не может быть установлен или удален отдельно от родительского</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="295"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="338"/>
<source>Notes</source>
<translation>Замечания</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="797"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="840"/>
<source>Screenshot %1</source>
<translation>Скриншот %1</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="224"/>
<source>Mod is compatible</source>
<translation>Мод совместим</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="225"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="245"/>
<source>Mod is incompatible</source>
<translation>Мод несовместим</translation>
</message>
@ -449,32 +542,32 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="384"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="445"/>
<source>Your Heroes III data files have been successfully found.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="552"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="775"/>
<source>Optionally, you can install additional mods either now or at any point later:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="616"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="791"/>
<source>Install support for playing Heroes III in resolutions other than 800x600.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="645"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="807"/>
<source>Install compatible version of addon Horn of the Abyss: fan-made Heroes III expansion, ported by VCMI team</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="674"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="823"/>
<source>Install compatible version of addon &quot;In The Wake of Gods&quot;: fan-made Heroes III expansion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="870"/>
<source>Finish</source>
<translation type="unfinished"></translation>
</message>
@ -484,84 +577,135 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="143"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="146"/>
<source>Choose your language</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="150"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="493"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="175"/>
<source>VCMI on Github</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="182"/>
<source>VCMI on Slack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="189"/>
<source>VCMI on Discord</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="196"/>
<source>Have a question? Found a bug? Want to help? Join us:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="205"/>
<source>Thanks for installing VCMI.
There are a few more steps to be done before you can start playing.
Keep in mind that in order to use VCMI you need to own original data files, Heroes III: Complete Edition or Shadow of Death.
Heroes III: HD Edition is currently not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="239"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="554"/>
<source>Next</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="215"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="276"/>
<source>Find Heroes III data files</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="246"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="307"/>
<source>Open help in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="259"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<source>Search again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="304"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="365"/>
<source>If you don&apos;t have installed Heroes III copy, it is possible to use our automatic installation tool &apos;vcmibuilder&apos; to extract data from GoG.com installer. Visit our wiki for detailed instructions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="381"/>
<source>VCMI requires Heroes III data files in one of the locations listed above. Please copy Heroes III data in one of these directories.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="342"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="403"/>
<source>Heroes III data files</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="355"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="416"/>
<source>Alternatively, you can select directory with installed Heroes III data and VCMI will copy exisiting data automatically.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="371"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="432"/>
<source>Copy existing data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="414"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="475"/>
<source>Your Heroes III language has been successfully detected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="424"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="485"/>
<source>Automatic detection of language failed. Please select language of your Heroes III copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="443"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="504"/>
<source>Heroes III language</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="486"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="714"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="547"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="863"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="524"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="585"/>
<source>Install VCMI Mod Preset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="584"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="635"/>
<source>Horn of the Abyss</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="657"/>
<source>Heroes III Translation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<source>High Definition Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="743"/>
<source>In The Wake of Gods</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="759"/>
<source>Install translation of Heroes III to your language</source>
<translation type="unfinished"></translation>
</message>

File diff suppressed because it is too large Load Diff

View File

@ -4,17 +4,111 @@
<context>
<name>CModListModel</name>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="142"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="42"/>
<source>Translation</source>
<translation>Переклад</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="43"/>
<source>Town</source>
<translation>Місто</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="44"/>
<source>Test</source>
<translation>Тестування</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="45"/>
<source>Templates</source>
<translation>Шаблони</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="46"/>
<source>Spells</source>
<translation>Закляття</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="47"/>
<source>Music</source>
<translation>Музика</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="48"/>
<source>Sounds</source>
<translation>Звуки</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="49"/>
<source>Skills</source>
<translation>Вміння</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="50"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="67"/>
<source>Other</source>
<translation>Інше</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="51"/>
<source>Objects</source>
<translation>Об&apos;єкти</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="52"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="53"/>
<source>Mechanics</source>
<translation>Механіки</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="54"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="55"/>
<source>Interface</source>
<translation>Інтерфейс</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="56"/>
<source>Heroes</source>
<translation>Герої</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="57"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="58"/>
<source>Graphical</source>
<translation>Графічний</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="59"/>
<source>Expansion</source>
<translation>Розширення</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="60"/>
<source>Creatures</source>
<translation>Істоти</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="61"/>
<source>Artifacts</source>
<translation>Артефакти</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="62"/>
<source>AI</source>
<translation>ШІ</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="170"/>
<source>Name</source>
<translation>Назва</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="145"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="173"/>
<source>Type</source>
<translation>Тип</translation>
</message>
<message>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="146"/>
<location filename="../modManager/cmodlistmodel_moc.cpp" line="174"/>
<source>Version</source>
<translation>Версія</translation>
</message>
@ -63,7 +157,7 @@
</message>
<message>
<location filename="../modManager/cmodlistview_moc.ui" line="163"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="272"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="315"/>
<source>Description</source>
<translation>Опис</translation>
</message>
@ -113,114 +207,113 @@
<translation>Відмінити</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="230"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="250"/>
<source>Mod name</source>
<translation>Назва модифікації</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="231"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="251"/>
<source>Installed version</source>
<translation>Встановлена версія</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="232"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="252"/>
<source>Latest version</source>
<translation>Найновіша версія</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="235"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<source>Download size</source>
<translation>Розмір для завантаження</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="236"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="256"/>
<source>Authors</source>
<translation>Автори</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="239"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="259"/>
<source>License</source>
<translation>Ліцензія</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="242"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="262"/>
<source>Contact</source>
<translation>Контакти</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="246"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="253"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<source>Compatibility</source>
<translation>Сумісність</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="255"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="263"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="273"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="281"/>
<source>Required VCMI version</source>
<translation>Необхідна версія VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="261"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<source>Supported VCMI version</source>
<translation>Підтримувана версія VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="266"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="284"/>
<source>Supported VCMI versions</source>
<translation>Підтримувані версії VCMI</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="270"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="311"/>
<source>Languages</source>
<translation>Мови</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="313"/>
<source>Required mods</source>
<translation>Необхідні модифікації</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="271"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="314"/>
<source>Conflicting mods</source>
<translation>Конфліктуючі модифікації</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="276"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="319"/>
<source>This mod can not be installed or enabled because following dependencies are not present</source>
<translation>Цю модифікацію не можна встановити чи активувати, оскільки відсутні наступні залежності</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="277"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="320"/>
<source>This mod can not be enabled because following mods are incompatible with this mod</source>
<translation>Цю модифікацію не можна ввімкнути, оскільки наступні модифікації несумісні з цією модифікацією</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="278"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="321"/>
<source>This mod can not be disabled because it is required to run following mods</source>
<translation>Цю модифікацію не можна відключити, оскільки вона необхідна для запуску наступних модифікацій</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="279"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="322"/>
<source>This mod can not be uninstalled or updated because it is required to run following mods</source>
<translation>Цю модифікацію не можна видалити або оновити, оскільки вона необхідна для запуску наступних модифікацій</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="280"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="323"/>
<source>This is submod and it can not be installed or uninstalled separately from parent mod</source>
<translation>Це вкладена модифікація, і її не можна встановити або видалити окремо від батьківської модифікації</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="295"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="338"/>
<source>Notes</source>
<translation>Примітки</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="797"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="840"/>
<source>Screenshot %1</source>
<translation>Знімок екрану %1</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="224"/>
<source>Mod is compatible</source>
<translation>Модифікація сумісна</translation>
</message>
<message>
<location filename="../modManager/cmodlistview_moc.cpp" line="225"/>
<location filename="../modManager/cmodlistview_moc.cpp" line="245"/>
<source>Mod is incompatible</source>
<translation>Модифікація несумісна</translation>
</message>
@ -449,32 +542,32 @@
<translation>Початкові модифікації</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="384"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="445"/>
<source>Your Heroes III data files have been successfully found.</source>
<translation>Файли даних вашої гри Heroes III успішно знайдено.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="552"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="775"/>
<source>Optionally, you can install additional mods either now or at any point later:</source>
<translation>За бажанням ви можете встановити додаткові модифікації зараз або пізніше:</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="616"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="791"/>
<source>Install support for playing Heroes III in resolutions other than 800x600.</source>
<translation type="unfinished"></translation>
<translation>Встановити підтримку для гри в Heroes III у роздільних здатностях, більших за 800x600.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="645"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="807"/>
<source>Install compatible version of addon Horn of the Abyss: fan-made Heroes III expansion, ported by VCMI team</source>
<translation type="unfinished"></translation>
<translation>Встановити сумісну версію доповнення Horn of the Abyss: фанатське доповнення Heroes III, портоване командою VCMI</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="674"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="823"/>
<source>Install compatible version of addon &quot;In The Wake of Gods&quot;: fan-made Heroes III expansion</source>
<translation type="unfinished"></translation>
<translation>Встановити сумісну версію доповнення &quot; In The Wake of Gods&quot;: фанатське доповнення до Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="870"/>
<source>Finish</source>
<translation>Завершити</translation>
</message>
@ -484,84 +577,141 @@
<translation>Крок %v з %m</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="143"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="146"/>
<source>Choose your language</source>
<translation>Оберіть свою мову</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="150"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="493"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="175"/>
<source>VCMI on Github</source>
<translation>VCMI на Github</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="182"/>
<source>VCMI on Slack</source>
<translation>VCMI на Slack</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="189"/>
<source>VCMI on Discord</source>
<translation>VCMI на Discord</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="196"/>
<source>Have a question? Found a bug? Want to help? Join us:</source>
<translation>Маєте питання? Виявили помилку? Хочете допомогти? Приєднуйтесь до нас:</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="205"/>
<source>Thanks for installing VCMI.
There are a few more steps to be done before you can start playing.
Keep in mind that in order to use VCMI you need to own original data files, Heroes III: Complete Edition or Shadow of Death.
Heroes III: HD Edition is currently not supported</source>
<translation>Дякуємо, що встановили VCMI.
Залишилося зробити ще кілька кроків, перш ніж ви зможете почати грати.
Майте на увазі, що для використання VCMI вам потрібно мати оригінальні файли гри Heroes III: Complete Edition або Shadow of Death.
Heroes III: HD Edition наразі не підтримується</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="239"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="554"/>
<source>Next</source>
<translation>Далі</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="215"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="276"/>
<source>Find Heroes III data files</source>
<translation>Пошук файлів даних Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="246"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="307"/>
<source>Open help in browser</source>
<translation>Відкрити довідку у браузері</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="259"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<source>Search again</source>
<translation>Повторити пошук</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="304"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="365"/>
<source>If you don&apos;t have installed Heroes III copy, it is possible to use our automatic installation tool &apos;vcmibuilder&apos; to extract data from GoG.com installer. Visit our wiki for detailed instructions.</source>
<translation type="unfinished"></translation>
<translation>Якщо у вас не встановлена копія Heroes III, ви можете скористатися нашим засобом встановлення &quot;vcmibuilder&quot;, щоб видобути дані з інсталятора GoG.com. Докладні інструкції можна знайти у нашій вікі.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="320"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="381"/>
<source>VCMI requires Heroes III data files in one of the locations listed above. Please copy Heroes III data in one of these directories.</source>
<translation type="unfinished"></translation>
<translation>VCMI потребує файлів даних Heroes III в одному з перелічених вище розташувань. Будь ласка, скопіюйте дані Heroes III в одну з цих директорій.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="342"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="403"/>
<source>Heroes III data files</source>
<translation>Файли даних Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="355"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="416"/>
<source>Alternatively, you can select directory with installed Heroes III data and VCMI will copy exisiting data automatically.</source>
<translation type="unfinished"></translation>
<translation>Або ж ви можете вибрати директорію зі встановленими даними Heroes III, і VCMI автоматично скопіює ці дані.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="371"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="432"/>
<source>Copy existing data</source>
<translation>Копіювати наявні дані</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="414"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="475"/>
<source>Your Heroes III language has been successfully detected.</source>
<translation>Мову вашої гри Heroes III успішно визначено.</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="424"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="485"/>
<source>Automatic detection of language failed. Please select language of your Heroes III copy</source>
<translation>Не вдалося визначити мову гри. Будь ласка, виберіть мову вашої копії Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="443"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="504"/>
<source>Heroes III language</source>
<translation>Мова Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="486"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="714"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="547"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="863"/>
<source>Back</source>
<translation>Назад</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="524"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="585"/>
<source>Install VCMI Mod Preset</source>
<translation>Встановлення початкових модифікацій VCMI</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="584"/>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="635"/>
<source>Horn of the Abyss</source>
<translation>Horn of the Abyss</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="657"/>
<source>Heroes III Translation</source>
<translation>Переклад Heroes III</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="721"/>
<source>High Definition Support</source>
<translation>Підтримка високих роздільних здатностей</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="743"/>
<source>In The Wake of Gods</source>
<translation>In The Wake of Gods</translation>
</message>
<message>
<location filename="../firstLaunch/firstlaunch_moc.ui" line="759"/>
<source>Install translation of Heroes III to your language</source>
<translation>Встановити переклад Heroes III на вашу мову</translation>
</message>

View File

@ -48,6 +48,20 @@ void CGeneralTextHandler::detectInstallParameters()
"ukrainian"
} };
if(!CResourceHandler::get("core")->existsResource(ResourceID("DATA/GENRLTXT.TXT", EResType::TEXT)))
{
Settings language = settings.write["session"]["language"];
language->String() = "english";
Settings confidence = settings.write["session"]["languageDeviation"];
confidence->Float() = 1.0;
Settings encoding = settings.write["session"]["encoding"];
encoding->String() = Languages::getLanguageOptions("english").encoding;
return;
}
// load file that will be used for footprint generation
// this is one of the most text-heavy files in game and consists solely from translated texts
auto resource = CResourceHandler::get("core")->load(ResourceID("DATA/GENRLTXT.TXT", EResType::TEXT));
@ -254,7 +268,7 @@ const std::string & CGeneralTextHandler::deserialize(const TextIdentifier & iden
return identifier.get();
}
auto const & entry = stringsLocalizations.at(identifier.get());
const auto & entry = stringsLocalizations.at(identifier.get());
if (!entry.overrideValue.empty())
return entry.overrideValue;
@ -312,7 +326,7 @@ bool CGeneralTextHandler::validateTranslation(const std::string & language, cons
{
bool allPresent = true;
for (auto const & string : stringsLocalizations)
for(const auto & string : stringsLocalizations)
{
if (string.second.modContext != modContext)
continue; // Not our mod
@ -341,7 +355,7 @@ bool CGeneralTextHandler::validateTranslation(const std::string & language, cons
bool allFound = true;
for (auto const & string : config.Struct())
for(const auto & string : config.Struct())
{
if (stringsLocalizations.count(string.first) > 0)
continue;

View File

@ -1059,8 +1059,7 @@ namespace
std::string defFile(const JsonNode & node)
{
TEST_FILE(node.meta, "Sprites/", node.String(), EResType::ANIMATION);
return "Def file \"" + node.String() + "\" was not found";
return testAnimation(node.String(), node.meta);
}
std::string animationFile(const JsonNode & node)

View File

@ -308,8 +308,6 @@ public:
RESET_STATE,
UPDATE,
REMOVE,
ACTIVATE_AND_UPDATE,
ACTIVATE_AND_REMOVE
};
JsonNode data;

View File

@ -2166,6 +2166,7 @@ void BattleTriggerEffect::applyGs(CGameState * gs) const
break;
}
case Bonus::ENCHANTER:
case Bonus::MORALE:
break;
case Bonus::FEAR:
st->fear = true;
@ -2398,7 +2399,6 @@ void BattleObstaclesChanged::applyBattle(IBattleState * battleState)
case BattleChanges::EOperation::ADD:
battleState->addObstacle(change);
break;
case BattleChanges::EOperation::ACTIVATE_AND_UPDATE:
case BattleChanges::EOperation::UPDATE:
battleState->updateObstacle(change);
break;

View File

@ -346,7 +346,7 @@ std::vector<bfs::path> VCMIDirsWIN32::dataPaths() const
}
bfs::path VCMIDirsWIN32::clientPath() const { return binaryPath() / "VCMI_client.exe"; }
bfs::path VCMIDirsWIN32::mapEditorPath() const { return binaryPath() / "VCMI_editor.exe"; }
bfs::path VCMIDirsWIN32::mapEditorPath() const { return binaryPath() / "VCMI_mapeditor.exe"; }
bfs::path VCMIDirsWIN32::serverPath() const { return binaryPath() / "VCMI_server.exe"; }
bfs::path VCMIDirsWIN32::libraryPath() const { return "."; }

View File

@ -798,19 +798,21 @@ std::vector<std::shared_ptr<const CObstacleInstance>> CBattleInfoCallback::battl
return obstacles;
}
std::vector<std::shared_ptr<const CObstacleInstance>> CBattleInfoCallback::getAllAffectedObstaclesByStack(const battle::Unit * unit) const
std::vector<std::shared_ptr<const CObstacleInstance>> CBattleInfoCallback::getAllAffectedObstaclesByStack(const battle::Unit * unit, const std::set<BattleHex> & passed) const
{
std::vector<std::shared_ptr<const CObstacleInstance>> affectedObstacles = std::vector<std::shared_ptr<const CObstacleInstance>>();
auto affectedObstacles = std::vector<std::shared_ptr<const CObstacleInstance>>();
RETURN_IF_NOT_BATTLE(affectedObstacles);
if(unit->alive())
{
affectedObstacles = battleGetAllObstaclesOnPos(unit->getPosition(), false);
if(!passed.count(unit->getPosition()))
affectedObstacles = battleGetAllObstaclesOnPos(unit->getPosition(), false);
if(unit->doubleWide())
{
BattleHex otherHex = unit->occupiedHex(unit->getPosition());
if(otherHex.isValid())
BattleHex otherHex = unit->occupiedHex();
if(otherHex.isValid() && !passed.count(otherHex))
for(auto & i : battleGetAllObstaclesOnPos(otherHex, false))
affectedObstacles.push_back(i);
if(!vstd::contains(affectedObstacles, i))
affectedObstacles.push_back(i);
}
for(auto hex : unit->getHexes())
if(hex == ESiegeHex::GATE_BRIDGE)
@ -932,6 +934,8 @@ ReachabilityInfo CBattleInfoCallback::makeBFS(const AccessibilityInfo &accessibi
return ret;
const std::set<BattleHex> obstacles = getStoppers(params.perspective);
auto checkParams = params;
checkParams.ignoreKnownAccessible = true; //Ignore starting hexes obstacles
std::queue<BattleHex> hexq; //bfs queue
@ -949,7 +953,7 @@ ReachabilityInfo CBattleInfoCallback::makeBFS(const AccessibilityInfo &accessibi
hexq.pop();
//walking stack can't step past the obstacles
if(curHex != params.startPosition && isInObstacle(curHex, obstacles, params))
if(isInObstacle(curHex, obstacles, checkParams))
continue;
const int costToNeighbour = ret.distances[curHex.hex] + 1;
@ -982,6 +986,9 @@ bool CBattleInfoCallback::isInObstacle(
for(auto occupiedHex : occupiedHexes)
{
if(params.ignoreKnownAccessible && vstd::contains(params.knownAccessible, occupiedHex))
continue;
if(vstd::contains(obstacles, occupiedHex))
{
if(occupiedHex == ESiegeHex::GATE_BRIDGE)

View File

@ -60,7 +60,7 @@ public:
boost::optional<int> battleIsFinished() const override; //return none if battle is ongoing; otherwise the victorious side (0/1) or 2 if it is a draw
std::vector<std::shared_ptr<const CObstacleInstance>> battleGetAllObstaclesOnPos(BattleHex tile, bool onlyBlocking = true) const override;
std::vector<std::shared_ptr<const CObstacleInstance>> getAllAffectedObstaclesByStack(const battle::Unit * unit) const override;
std::vector<std::shared_ptr<const CObstacleInstance>> getAllAffectedObstaclesByStack(const battle::Unit * unit, const std::set<BattleHex> & passed) const override;
const CStack * battleGetStackByPos(BattleHex pos, bool onlyAlive = true) const;

View File

@ -47,10 +47,7 @@ std::vector<std::shared_ptr<const CObstacleInstance>> CBattleInfoEssentials::bat
else
{
if(!!player && *perspective != battleGetMySide())
{
logGlobal->error("Unauthorized obstacles access attempt!");
return ret;
}
logGlobal->warn("Unauthorized obstacles access attempt, assuming massive spell");
}
for(const auto & obstacle : getBattle()->getAllObstacles())

View File

@ -72,7 +72,7 @@ public:
//blocking obstacles makes tile inaccessible, others cause special effects (like Land Mines, Moat, Quicksands)
virtual std::vector<std::shared_ptr<const CObstacleInstance>> battleGetAllObstaclesOnPos(BattleHex tile, bool onlyBlocking = true) const = 0;
virtual std::vector<std::shared_ptr<const CObstacleInstance>> getAllAffectedObstaclesByStack(const battle::Unit * unit) const = 0;
virtual std::vector<std::shared_ptr<const CObstacleInstance>> getAllAffectedObstaclesByStack(const battle::Unit * unit, const std::set<BattleHex> & passed) const = 0;
};

View File

@ -28,6 +28,7 @@ struct DLL_LINKAGE ReachabilityInfo
ui8 side = 0;
bool doubleWide = false;
bool flying = false;
bool ignoreKnownAccessible = false; //Ignore obstacles if it is in accessible hexes
std::vector<BattleHex> knownAccessible; //hexes that will be treated as accessible, even if they're occupied by stack (by default - tiles occupied by stack we do reachability for, so it doesn't block itself)
BattleHex startPosition; //assumed position of stack

View File

@ -16,6 +16,7 @@
#include "../CModHandler.h"
#include "JsonRandom.h"
#include "../IGameCallback.h"
#include "../CGeneralTextHandler.h"
VCMI_LIB_NAMESPACE_BEGIN
@ -307,9 +308,22 @@ bool CRandomRewardObjectInfo::givesBonuses() const
return testForKey(parameters, "bonuses");
}
const JsonNode & CRandomRewardObjectInfo::getParameters() const
{
return parameters;
}
void CRewardableConstructor::initTypeData(const JsonNode & config)
{
objectInfo.init(config);
if (!config["name"].isNull())
VLC->generaltexth->registerString( config.meta, getNameTextID(), config["name"].String());
}
bool CRewardableConstructor::hasNameTextID() const
{
return !objectInfo.getParameters()["name"].isNull();
}
CGObjectInstance * CRewardableConstructor::create(std::shared_ptr<const ObjectTemplate> tmpl) const

View File

@ -28,6 +28,8 @@ class DLL_LINKAGE CRandomRewardObjectInfo : public IObjectInfo
void configureReward(CRewardableObject * object, CRandomGenerator & rng, CRewardInfo & info, const JsonNode & source) const;
void configureResetInfo(CRewardableObject * object, CRandomGenerator & rng, CRewardResetInfo & info, const JsonNode & source) const;
public:
const JsonNode & getParameters() const;
bool givesResources() const override;
bool givesExperience() const override;
@ -60,6 +62,8 @@ class DLL_LINKAGE CRewardableConstructor : public AObjectTypeHandler
void initTypeData(const JsonNode & config) override;
public:
bool hasNameTextID() const override;
CGObjectInstance * create(std::shared_ptr<const ObjectTemplate> tmpl = nullptr) const override;
void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const override;

View File

@ -83,7 +83,7 @@ CConnection::CConnection(const std::string & host, ui16 port, std::string Name,
if(error)
{
logNetwork->error("Problem with resolving: \n%s", error.message());
goto connerror1;
throw std::runtime_error("Can't establish connection: Problem with resolving");
}
pom = endpoint_iterator;
if(pom != end)
@ -91,7 +91,7 @@ CConnection::CConnection(const std::string & host, ui16 port, std::string Name,
else
{
logNetwork->error("Critical problem: No endpoints found!");
goto connerror1;
throw std::runtime_error("Can't establish connection: No endpoints found!");
}
while(pom != end)
{
@ -110,20 +110,12 @@ CConnection::CConnection(const std::string & host, ui16 port, std::string Name,
}
else
{
logNetwork->error("Problem with connecting: %s", error.message());
throw std::runtime_error("Can't establish connection: Failed to connect!");
}
endpoint_iterator++;
}
//we shouldn't be here - error handling
connerror1:
logNetwork->error("Something went wrong... checking for error info");
if(error)
logNetwork->error(error.message());
else
logNetwork->error("No error info. ");
throw std::runtime_error("Can't establish connection :(");
}
CConnection::CConnection(std::shared_ptr<TSocket> Socket, std::string Name, std::string UUID):
iser(this),
oser(this),

View File

@ -121,6 +121,9 @@ void Obstacle::adjustAffectedHexes(std::set<BattleHex> & hexes, const Mechanics
bool Obstacle::applicable(Problem & problem, const Mechanics * m) const
{
if(hidden && m->battle()->battleHasNativeStack(m->battle()->otherSide(m->casterSide)))
return m->adaptProblem(ESpellCastProblem::NO_APPROPRIATE_TARGET, problem);
return LocationEffect::applicable(problem, m);
}
@ -270,12 +273,7 @@ void Obstacle::placeObstacles(ServerCallback * server, const Mechanics * m, cons
BattleObstaclesChanged pack;
boost::optional<BattlePerspective::BattlePerspective> perspective;
if(!m->battle()->getPlayerID())
perspective = boost::make_optional(BattlePerspective::ALL_KNOWING);
auto all = m->battle()->battleGetAllObstacles(perspective);
auto all = m->battle()->battleGetAllObstacles(BattlePerspective::ALL_KNOWING);
int obstacleIdToGive = 1;
for(auto & one : all)

View File

@ -72,7 +72,7 @@ bool RemoveObstacle::canRemove(const CObstacleInstance * obstacle) const
return true;
const auto *spellObstacle = dynamic_cast<const SpellCreatedObstacle *>(obstacle);
if(removeAllSpells && spellObstacle)
if(removeAllSpells && obstacle->obstacleType == CObstacleInstance::SPELL_CREATED)
return true;
if(spellObstacle && !removeSpells.empty())
@ -89,7 +89,7 @@ std::set<const CObstacleInstance *> RemoveObstacle::getTargets(const Mechanics *
std::set<const CObstacleInstance *> possibleTargets;
if(m->isMassive() || alwaysMassive)
{
for(const auto & obstacle : m->battle()->battleGetAllObstacles())
for(const auto & obstacle : m->battle()->battleGetAllObstacles(BattlePerspective::ALL_KNOWING))
if(canRemove(obstacle.get()))
possibleTargets.insert(obstacle.get());
}

View File

@ -40,7 +40,7 @@ bool UnitEffect::applicable(Problem & problem, const Mechanics * m) const
{
//stack effect is applicable in general if there is at least one smart target
auto mainFilter = std::bind(&UnitEffect::getStackFilter, this, m, true, _1);
auto mainFilter = std::bind(&UnitEffect::getStackFilter, this, m, false, _1);
auto predicate = std::bind(&UnitEffect::eraseByImmunityFilter, this, m, _1);
auto targets = m->battle()->battleGetUnitsIf(mainFilter);
@ -59,12 +59,12 @@ bool UnitEffect::applicable(Problem & problem, const Mechanics * m) const
bool UnitEffect::applicable(Problem & problem, const Mechanics * m, const EffectTarget & target) const
{
//stack effect is applicable if it affects at least one smart target
//assume target correctly transformed, just reapply smart filter
//stack effect is applicable if it affects at least one target (smartness should not be checked)
//assume target correctly transformed, just reapply filter
for(const auto & item : target)
if(item.unitValue)
if(getStackFilter(m, true, item.unitValue))
if(getStackFilter(m, false, item.unitValue))
return true;
return false;

View File

@ -51,6 +51,8 @@
#include "../lib/serializer/Cast.h"
#include "../lib/serializer/JsonSerializer.h"
#include "../lib/ScriptHandler.h"
#include "vstd/CLoggerBase.h"
#include <memory>
#include <vcmi/events/EventBus.h>
#include <vcmi/events/GenericEvents.h>
#include <vcmi/events/AdventureEvents.h>
@ -1398,6 +1400,11 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
//initing necessary tables
auto accessibility = getAccesibility(curStack);
std::set<BattleHex> passed;
//Ignore obstacles on starting position
passed.insert(curStack->getPosition());
if(curStack->doubleWide())
passed.insert(curStack->occupiedHex());
//shifting destination (if we have double wide stack and we can occupy dest but not be exactly there)
if(!stackAtEnd && curStack->doubleWide() && !accessibility.accessible(dest, curStack))
@ -1427,7 +1434,10 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
ret = path.second;
int creSpeed = gs->curB->tacticDistance ? GameConstants::BFIELD_SIZE : curStack->Speed(0, true);
int creSpeed = curStack->Speed(0, true);
if (gs->curB->tacticDistance > 0 && creSpeed > 0)
creSpeed = GameConstants::BFIELD_SIZE;
auto isGateDrawbridgeHex = [&](BattleHex hex) -> bool
{
@ -1590,10 +1600,12 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
if(otherHex.isValid() && !obstacle2.empty())
obstacleHit = true;
}
if(!obstacleHit)
passed.insert(hex);
}
}
if (tiles.size() > 0)
if (!tiles.empty())
{
//commit movement
BattleStackMoved sm;
@ -1609,7 +1621,12 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
if (curStack->getPosition() != dest)
{
if(stackIsMoving && start != curStack->getPosition())
stackIsMoving = handleDamageFromObstacle(curStack, stackIsMoving);
{
stackIsMoving = handleDamageFromObstacle(curStack, stackIsMoving, passed);
passed.insert(curStack->getPosition());
if(curStack->doubleWide())
passed.insert(curStack->occupiedHex());
}
if (gateStateChanging)
{
if (curStack->getPosition() == openGateAtHex)
@ -1637,7 +1654,7 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
}
//handling obstacle on the final field (separate, because it affects both flying and walking stacks)
handleDamageFromObstacle(curStack);
handleDamageFromObstacle(curStack, false, passed);
return ret;
}
@ -1659,6 +1676,12 @@ CGameHandler::CGameHandler(CVCMIServer * lobby)
CGameHandler::~CGameHandler()
{
if (battleThread)
{
//Setting battleMadeAction is needed because battleThread waits for the action to continue the main loop
battleMadeAction.setn(true);
battleThread->join();
}
delete spellEnv;
delete gs;
}
@ -2700,7 +2723,7 @@ void CGameHandler::startBattlePrimary(const CArmedInstance *army1, const CArmedI
auto battleQuery = std::make_shared<CBattleQuery>(this, gs->curB);
queries.addQuery(battleQuery);
boost::thread(&CGameHandler::runBattle, this);
this->battleThread = std::make_unique<boost::thread>(boost::thread(&CGameHandler::runBattle, this));
}
void CGameHandler::startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, bool creatureBank)
@ -5288,13 +5311,13 @@ void CGameHandler::stackTurnTrigger(const CStack *st)
}
}
bool CGameHandler::handleDamageFromObstacle(const CStack * curStack, bool stackIsMoving)
bool CGameHandler::handleDamageFromObstacle(const CStack * curStack, bool stackIsMoving, const std::set<BattleHex> & passed)
{
if(!curStack->alive())
return false;
bool containDamageFromMoat = false;
bool movementStoped = false;
for(auto & obstacle : getAllAffectedObstaclesByStack(curStack))
bool movementStopped = false;
for(auto & obstacle : getAllAffectedObstaclesByStack(curStack, passed))
{
if(obstacle->obstacleType == CObstacleInstance::SPELL_CREATED)
{
@ -5305,7 +5328,7 @@ bool CGameHandler::handleDamageFromObstacle(const CStack * curStack, bool stackI
if(!spellObstacle)
COMPLAIN_RET("Invalid obstacle instance");
if(spellObstacle->trigger)
if(spellObstacle->triggersEffects())
{
const bool oneTimeObstacle = spellObstacle->removeOnTrigger;
@ -5323,9 +5346,9 @@ bool CGameHandler::handleDamageFromObstacle(const CStack * curStack, bool stackI
ObstacleChanges changeInfo;
changeInfo.id = spellObstacle->uniqueID;
if (oneTimeObstacle)
changeInfo.operation = ObstacleChanges::EOperation::ACTIVATE_AND_REMOVE;
changeInfo.operation = ObstacleChanges::EOperation::REMOVE;
else
changeInfo.operation = ObstacleChanges::EOperation::ACTIVATE_AND_UPDATE;
changeInfo.operation = ObstacleChanges::EOperation::UPDATE;
SpellCreatedObstacle changedObstacle;
changedObstacle.uniqueID = spellObstacle->uniqueID;
@ -5369,13 +5392,13 @@ bool CGameHandler::handleDamageFromObstacle(const CStack * curStack, bool stackI
return false;
if((obstacle->stopsMovement() && stackIsMoving))
movementStoped = true;
movementStopped = true;
}
if(stackIsMoving)
return curStack->alive() && !movementStoped;
else
return curStack->alive();
return curStack->alive() && !movementStopped;
return curStack->alive();
}
void CGameHandler::handleTimeEvents()
@ -6412,7 +6435,7 @@ void CGameHandler::runBattle()
//tactic round
{
while (gs->curB->tacticDistance && !battleResult.get())
while ((lobby->state != EServerState::SHUTDOWN) && gs->curB->tacticDistance && !battleResult.get())
boost::this_thread::sleep(boost::posix_time::milliseconds(50));
}
@ -6490,7 +6513,7 @@ void CGameHandler::runBattle()
bool firstRound = true;//FIXME: why first round is -1?
//main loop
while (!battleResult.get()) //till the end of the battle ;]
while ((lobby->state != EServerState::SHUTDOWN) && !battleResult.get()) //till the end of the battle ;]
{
BattleNextRound bnr;
bnr.round = gs->curB->round + 1;
@ -6555,7 +6578,7 @@ void CGameHandler::runBattle()
};
const CStack * next = nullptr;
while((next = getNextStack()))
while((lobby->state != EServerState::SHUTDOWN) && (next = getNextStack()))
{
BattleUnitsChanged removeGhosts;
for(auto stack : curB.stacks)
@ -6734,7 +6757,7 @@ void CGameHandler::runBattle()
boost::unique_lock<boost::mutex> lock(battleMadeAction.mx);
battleMadeAction.data = false;
while (!actionWasMade())
while ((lobby->state != EServerState::SHUTDOWN) && !actionWasMade())
{
battleMadeAction.cond.wait(lock);
if (battleGetStackByID(nextId, false) != next)
@ -6790,7 +6813,8 @@ void CGameHandler::runBattle()
firstRound = false;
}
endBattle(gs->curB->tile, gs->curB->battleGetFightingHero(0), gs->curB->battleGetFightingHero(1));
if (lobby->state != EServerState::SHUTDOWN)
endBattle(gs->curB->tile, gs->curB->battleGetFightingHero(0), gs->curB->battleGetFightingHero(1));
}
bool CGameHandler::makeAutomaticAction(const CStack *stack, BattleAction &ba)

View File

@ -96,6 +96,7 @@ class CGameHandler : public IGameCallback, public CBattleInfoCallback, public En
{
CVCMIServer * lobby;
std::shared_ptr<CApplier<CBaseForGHApply>> applier;
std::unique_ptr<boost::thread> battleThread;
public:
using FireShieldInfo = std::vector<std::pair<const CStack *, int64_t>>;
//use enums as parameters, because doMove(sth, true, false, true) is not readable
@ -232,7 +233,7 @@ public:
bool makeCustomAction(BattleAction &ba);
void stackEnchantedTrigger(const CStack * stack);
void stackTurnTrigger(const CStack *stack);
bool handleDamageFromObstacle(const CStack * curStack, bool stackIsMoving = false); //checks if obstacle is land mine and handles possible consequences
bool handleDamageFromObstacle(const CStack * curStack, bool stackIsMoving = false, const std::set<BattleHex> & passed = {}); //checks if obstacle is land mine and handles possible consequences
void removeObstacle(const CObstacleInstance &obstacle);
bool queryReply( QueryID qid, const JsonNode & answer, PlayerColor player );

View File

@ -380,6 +380,9 @@ bool CGarrisonDialogQuery::blocksPack(const CPack * pack) const
if(auto upgrade = dynamic_ptr_cast<UpgradeCreature>(pack))
return !vstd::contains(ourIds, upgrade->id);
if(auto formation = dynamic_ptr_cast<SetFormation>(pack))
return !vstd::contains(ourIds, formation->hid);
return CDialogQuery::blocksPack(pack);
}

View File

@ -59,10 +59,6 @@
#include "../lib/CGameState.h"
#if defined(__GNUC__) && !defined(__UCLIBC__) && !defined(__MINGW32__) && !defined(VCMI_MOBILE)
#include <execinfo.h>
#endif
template<typename T> class CApplyOnServer;
class CBaseForServerApply
@ -999,33 +995,6 @@ ui8 CVCMIServer::getIdOfFirstUnallocatedPlayer() const
return 0;
}
#if defined(__GNUC__) && !defined(__UCLIBC__) && !defined(__MINGW32__) && !defined(VCMI_MOBILE)
void handleLinuxSignal(int sig)
{
const int STACKTRACE_SIZE = 100;
void * buffer[STACKTRACE_SIZE];
int ptrCount = backtrace(buffer, STACKTRACE_SIZE);
char * * strings;
logGlobal->error("Error: signal %d :", sig);
strings = backtrace_symbols(buffer, ptrCount);
if(strings == nullptr)
{
logGlobal->error("There are no symbols.");
}
else
{
for(int i = 0; i < ptrCount; ++i)
{
logGlobal->error(strings[i]);
}
free(strings);
}
_exit(EXIT_FAILURE);
}
#endif
static void handleCommandOptions(int argc, const char * argv[], boost::program_options::variables_map & options)
{
namespace po = boost::program_options;
@ -1101,11 +1070,6 @@ int main(int argc, const char * argv[])
// Correct working dir executable folder (not bundle folder) so we can use executable relative paths
boost::filesystem::current_path(boost::filesystem::system_complete(argv[0]).parent_path());
#endif
// Installs a sig sev segmentation violation handler
// to log stacktrace
#if defined(__GNUC__) && !defined(__UCLIBC__) && !defined(__MINGW32__) && !defined(VCMI_MOBILE)
signal(SIGSEGV, handleLinuxSignal);
#endif
#ifndef VCMI_IOS
console = new CConsoleHandler();