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

initial highscore support

This commit is contained in:
Laserlicht
2023-09-22 01:39:35 +02:00
committed by GitHub
parent ec582328b4
commit 92b0e2b400
16 changed files with 652 additions and 357 deletions

View File

@@ -37,7 +37,6 @@
"vcmi.radialWheel.moveUnit" : "Přesunout jednotky do jiného oddílu", "vcmi.radialWheel.moveUnit" : "Přesunout jednotky do jiného oddílu",
"vcmi.radialWheel.splitUnit" : "Rozdělit jednotku do jiné pozice", "vcmi.radialWheel.splitUnit" : "Rozdělit jednotku do jiné pozice",
"vcmi.mainMenu.highscoresNotImplemented" : "Omlouvám se, menu nejvyšší skóre ještě není implementováno\n",
"vcmi.mainMenu.serverConnecting" : "Připojování...", "vcmi.mainMenu.serverConnecting" : "Připojování...",
"vcmi.mainMenu.serverAddressEnter" : "Zadejte adresu:", "vcmi.mainMenu.serverAddressEnter" : "Zadejte adresu:",
"vcmi.mainMenu.serverClosing" : "Zavírání...", "vcmi.mainMenu.serverClosing" : "Zavírání...",

View File

@@ -1,375 +1,339 @@
{ {
"vcmi.adventureMap.monsterThreat.title" : "\n\nThreat: ", "vcmi.adventureMap.monsterThreat.title" : "\n\nDiscussion : ",
"vcmi.adventureMap.monsterThreat.levels.0" : "Effortless", "vcmi.adventureMap.monsterThreat.levels.0" : "Sans effort",
"vcmi.adventureMap.monsterThreat.levels.1" : "Very Weak", "vcmi.adventureMap.monsterThreat.levels.1" : "Très faible",
"vcmi.adventureMap.monsterThreat.levels.2" : "Weak", "vcmi.adventureMap.monsterThreat.levels.2" : "Faible",
"vcmi.adventureMap.monsterThreat.levels.3" : "A bit weaker", "vcmi.adventureMap.monsterThreat.levels.3" : "Un peu plus faible",
"vcmi.adventureMap.monsterThreat.levels.4" : "Equal", "vcmi.adventureMap.monsterThreat.levels.4" : "Égal",
"vcmi.adventureMap.monsterThreat.levels.5" : "A bit stronger", "vcmi.adventureMap.monsterThreat.levels.5" : "Un peu plus fort",
"vcmi.adventureMap.monsterThreat.levels.6" : "Strong", "vcmi.adventureMap.monsterThreat.levels.6" : "Fort",
"vcmi.adventureMap.monsterThreat.levels.7" : "Very Strong", "vcmi.adventureMap.monsterThreat.levels.7" : "Très fort",
"vcmi.adventureMap.monsterThreat.levels.8" : "Challenging", "vcmi.adventureMap.monsterThreat.levels.8" : "Difficile",
"vcmi.adventureMap.monsterThreat.levels.9" : "Overpowering", "vcmi.adventureMap.monsterThreat.levels.9" : "Surpuissant",
"vcmi.adventureMap.monsterThreat.levels.10" : "Deadly", "vcmi.adventureMap.monsterThreat.levels.10" : "Mortel",
"vcmi.adventureMap.monsterThreat.levels.11" : "Impossible", "vcmi.adventureMap.monsterThreat.levels.11" : "Impossible",
"vcmi.adventureMap.confirmRestartGame" : "Are you sure you want to restart the game?", "vcmi.adventureMap.confirmRestartGame" : "Êtes-vous sûr de vouloir redémarrer le jeu ?",
"vcmi.adventureMap.noTownWithMarket" : "There are no available marketplaces!", "vcmi.adventureMap.noTownWithMarket" : "Il n'y a pas de marchés disponibles !",
"vcmi.adventureMap.noTownWithTavern" : "There are no available towns with taverns!", "vcmi.adventureMap.noTownWithTavern" : "Il n'y a pas de villes disponibles avec des tavernes !",
"vcmi.adventureMap.spellUnknownProblem" : "There is an unknown problem with this spell! No more information is available.", "vcmi.adventureMap.spellUnknownProblem" : "Il y a un problème inconnu avec ce sort ! Pas plus d'informations sont disponibles.",
"vcmi.adventureMap.playerAttacked" : "Player has been attacked: %s", "vcmi.adventureMap.playerAttacked" : "Le joueur a été attaqué : %s",
"vcmi.adventureMap.moveCostDetails" : "Movement points - Cost: %TURNS turns + %POINTS points, Remaining points: %REMAINING", "vcmi.adventureMap.moveCostDetails" : "Points de mouvement - Coût : %TURNS tours + %POINTS points, Points restants : %REMAINING",
"vcmi.adventureMap.moveCostDetailsNoTurns" : "Movement points - Cost: %POINTS points, Remaining points: %REMAINING", "vcmi.adventureMap.moveCostDetailsNoTurns" : "Points de mouvement - Coût : %POINTS points, Points restants : %REMAINING",
"vcmi.capitalColors.0" : "Red", "vcmi.capitalColors.0" : "Rouge",
"vcmi.capitalColors.1" : "Blue", "vcmi.capitalColors.1" : "Bleu",
"vcmi.capitalColors.2" : "Tan", "vcmi.capitalColors.2" : "Ocre",
"vcmi.capitalColors.3" : "Green", "vcmi.capitalColors.3" : "Vert",
"vcmi.capitalColors.4" : "Orange", "vcmi.capitalColors.4" : "Orange",
"vcmi.capitalColors.5" : "Purple", "vcmi.capitalColors.5" : "Violet",
"vcmi.capitalColors.6" : "Teal", "vcmi.capitalColors.6" : "Turquoise",
"vcmi.capitalColors.7" : "Pink", "vcmi.capitalColors.7" : "Rose",
"vcmi.heroOverview.startingArmy" : "Starting Units",
"vcmi.heroOverview.warMachine" : "War Machines",
"vcmi.heroOverview.secondarySkills" : "Secondary Skills",
"vcmi.heroOverview.spells" : "Spells",
"vcmi.radialWheel.mergeSameUnit" : "Merge same creatures",
"vcmi.radialWheel.fillSingleUnit" : "Fill with single creatures",
"vcmi.radialWheel.splitSingleUnit" : "Split off single creature",
"vcmi.radialWheel.splitUnitEqually" : "Split creatures equally",
"vcmi.radialWheel.moveUnit" : "Move creatures to another army",
"vcmi.radialWheel.splitUnit" : "Split creature to another slot",
"vcmi.mainMenu.highscoresNotImplemented" : "Sorry, high scores menu is not implemented yet\n", "vcmi.mainMenu.serverConnecting" : "Connexion...",
"vcmi.mainMenu.serverConnecting" : "Connecting...", "vcmi.mainMenu.serverAddressEnter" : "Entrez l'adresse :",
"vcmi.mainMenu.serverAddressEnter" : "Enter address:", "vcmi.mainMenu.serverClosing" : "Fermeture...",
"vcmi.mainMenu.serverClosing" : "Closing...", "vcmi.mainMenu.hostTCP" : "Hôte TCP/IP jeu",
"vcmi.mainMenu.hostTCP" : "Host TCP/IP game", "vcmi.mainMenu.joinTCP" : "Rejoindre TCP/IP jeu",
"vcmi.mainMenu.joinTCP" : "Join TCP/IP game", "vcmi.mainMenu.playerName" : "Joueur",
"vcmi.mainMenu.playerName" : "Player",
"vcmi.lobby.filename" : "Filename",
"vcmi.lobby.creationDate" : "Creation date",
"vcmi.server.errors.existingProcess" : "Another VCMI server process is running. Please terminate it before starting a new game.", "vcmi.server.errors.existingProcess" : "Un autre processus de serveur VCMI est en cours d'exécution. Veuillez l'arrêter' avant de démarrer un nouveau jeu.",
"vcmi.server.errors.modsIncompatibility" : "The following mods are required to load the game:", "vcmi.server.errors.modsIncompatibility" : "Les mods suivants sont nécessaires pour charger le jeu :",
"vcmi.server.confirmReconnect" : "Do you want to reconnect to the last session?", "vcmi.server.confirmReconnect" : "Voulez-vous vous reconnecter à la dernière session ?",
"vcmi.settingsMainWindow.generalTab.hover" : "General", "vcmi.settingsMainWindow.generalTab.hover" : "Général",
"vcmi.settingsMainWindow.generalTab.help" : "Switches to General Options tab, which contains settings related to general game client behavior.", "vcmi.settingsMainWindow.generalTab.help" : "Passe à l'onglet Options générales, qui contient des paramètres liés au comportement général du client de jeu",
"vcmi.settingsMainWindow.battleTab.hover" : "Battle", "vcmi.settingsMainWindow.battleTab.hover" : "Bataille",
"vcmi.settingsMainWindow.battleTab.help" : "Switches to Battle Options tab, which allows configuring game behavior during battles.", "vcmi.settingsMainWindow.battleTab.help" : "Passe à l'onglet Options de combat, ce qui permet de configurer le comportement du jeu pendant les batailles",
"vcmi.settingsMainWindow.adventureTab.hover" : "Adventure Map", "vcmi.settingsMainWindow.adventureTab.hover" : "Carte d'aventure",
"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.settingsMainWindow.adventureTab.help" : "Passe à l'onglet Options de carte d'aventure (la carte d'aventure est la section du jeu où les joueurs peuvent contrôler les mouvements de leurs héros)",
"vcmi.systemOptions.videoGroup" : "Video Settings", "vcmi.systemOptions.videoGroup" : "Paramètres Vidéo",
"vcmi.systemOptions.audioGroup" : "Audio Settings", "vcmi.systemOptions.audioGroup" : "Paramètres Audio",
"vcmi.systemOptions.otherGroup" : "Other Settings", // unused right now "vcmi.systemOptions.otherGroup" : "Autres Paramètres", // Unused right now
"vcmi.systemOptions.townsGroup" : "Town Screen", "vcmi.systemOptions.townsGroup" : "Écran de la Ville",
"vcmi.systemOptions.fullscreenBorderless.hover" : "Fullscreen (borderless)", "vcmi.systemOptions.fullscreenBorderless.hover" : "Plein écran (sans bord)",
"vcmi.systemOptions.fullscreenBorderless.help" : "{Borderless Fullscreen}\n\nIf selected, VCMI will run in borderless fullscreen mode. In this mode, game will always use same resolution as desktop, ignoring selected resolution.", "vcmi.systemOptions.fullscreenBorderless.help" : "{Borderless Fullscreen}\n\nSi sélectionné, VCMI fonctionnera en mode plein écran sans bordure. Dans ce mode, le jeu utilisera toujours la même résolution de le bureau, ignorant la résolution sélectionnée.",
"vcmi.systemOptions.fullscreenExclusive.hover" : "Fullscreen (exclusive)", "vcmi.systemOptions.fullscreenExclusive.hover" : "Plein écran (exclusif)",
"vcmi.systemOptions.fullscreenExclusive.help" : "{Fullscreen}\n\nIf selected, VCMI will run in exclusive fullscreen mode. In this mode, game will change resolution of monitor to selected resolution.", "vcmi.systemOptions.fullscreenExclusive.help" : "{Fullscreen}\n\nSi sélectionné, VCMI s'exécutera en mode plein écran exclusif. Dans ce mode, le jeu modifiera la résolution du moniteur en résolution sélectionnée.",
"vcmi.systemOptions.resolutionButton.hover" : "Resolution: %wx%h", "vcmi.systemOptions.resolutionButton.hover" : "Résolution : %wx%h",
"vcmi.systemOptions.resolutionButton.help" : "{Select Resolution}\n\nChange in-game screen resolution.", "vcmi.systemOptions.resolutionButton.help" : "{Select Resolution}\n\nChanger la résolution d'écran dans le jeu.",
"vcmi.systemOptions.resolutionMenu.hover" : "Select Resolution", "vcmi.systemOptions.resolutionMenu.hover" : "Sélectionner la résolution",
"vcmi.systemOptions.resolutionMenu.help" : "Change in-game screen resolution.", "vcmi.systemOptions.resolutionMenu.help" : "Changer la résolution d'écran dans le jeu.",
"vcmi.systemOptions.scalingButton.hover" : "Interface Scaling: %p%", "vcmi.systemOptions.scalingButton.hover" : "Échelle d'interface : %p%",
"vcmi.systemOptions.scalingButton.help" : "{Interface Scaling}\n\nChanges scaling of in-game interface.", "vcmi.systemOptions.scalingButton.help" : "{Interface Scaling}\n\nChanger l'échelle de l'interface dans le jeu",
"vcmi.systemOptions.scalingMenu.hover" : "Select Interface Scaling", "vcmi.systemOptions.scalingMenu.hover" : "Sélectionner la mise à l'échelle de l'interface",
"vcmi.systemOptions.scalingMenu.help" : "Change in-game interface scaling.", "vcmi.systemOptions.scalingMenu.help" : "Changer la mise à l'échelle de l'interface dans le jeu.",
"vcmi.systemOptions.longTouchButton.hover" : "Long Touch Interval: %d ms", // Translation note: "ms" = "milliseconds" "vcmi.systemOptions.longTouchButton.hover" : "Intervalle de touche long : %d ms", // Translation note: "ms" = "milliseconds"
"vcmi.systemOptions.longTouchButton.help" : "{Long Touch Interval}\n\nWhen using touchscreen, popup windows will appear after touching screen for specified duration, in milliseconds.", "vcmi.systemOptions.longTouchButton.help" : "{Long Touch Interval}\n\nAu moment d'utiliser l'écran tactile, les fenêtres contextuelles apparaîtront après avoir touché l'écran pour une durée spécifiée, en millisecondes",
"vcmi.systemOptions.longTouchMenu.hover" : "Select Long Touch Interval", "vcmi.systemOptions.longTouchMenu.hover" : "Sélectionner l'intervalle de touche long",
"vcmi.systemOptions.longTouchMenu.help" : "Change duration of long touch interval.", "vcmi.systemOptions.longTouchMenu.help" : "Changer la durée de l'intervalle de touche long.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d milliseconds", "vcmi.systemOptions.longTouchMenu.entry" : "%d millisecondes",
"vcmi.systemOptions.framerateButton.hover" : "Show FPS", "vcmi.systemOptions.framerateButton.hover" : "Afficher les FPS",
"vcmi.systemOptions.framerateButton.help" : "{Show FPS}\n\nToggle the visibility of the Frames Per Second counter in the corner of the game window.", "vcmi.systemOptions.framerateButton.help" : "{Show FPS}\n\nAfficher/masquer le compteur de Frames Par Seconde dans le coin de la fenêtre du jeu",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Haptic feedback",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Haptic feedback}\n\nToggle the haptic feedback on touch inputs.",
"vcmi.adventureOptions.infoBarPick.hover" : "Show Messages in Info Panel", "vcmi.adventureOptions.infoBarPick.hover" : "Afficher les messages dans le panneau d'information",
"vcmi.adventureOptions.infoBarPick.help" : "{Show Messages in Info Panel}\n\nWhenever possible, game messages from visiting map objects will be shown in the info panel, instead of popping up in a separate window.", "vcmi.adventureOptions.infoBarPick.help" : "{Show Messages in Info Panel}\n\nAutant que possible, les messages de jeu de la visite des objets de la carte seront affichés dans le panneau d'informations, au lieu de faire apparaître dans une fenêtre séparée.",
"vcmi.adventureOptions.numericQuantities.hover" : "Numeric Creature Quantities", "vcmi.adventureOptions.numericQuantities.hover" : "Dénombrement de créatures",
"vcmi.adventureOptions.numericQuantities.help" : "{Numeric Creature Quantities}\n\nShow the approximate quantities of enemy creatures in the numeric A-B format.", "vcmi.adventureOptions.numericQuantities.help" : "{Numeric Creature Quantities}\n\nAfficher les estimation de nombre de créatures ennemies au format numérique A-B.",
"vcmi.adventureOptions.forceMovementInfo.hover" : "Always Show Movement Cost", "vcmi.adventureOptions.forceMovementInfo.hover" : "Toujours afficher le coût de mouvement",
"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.forceMovementInfo.help" : "{Always Show Movement Cost}\n\nToujours afficher les données des points de mouvement dans les informations sur la barre d'état (au lieu de les voir que pen maintenant la touche alt).",
"vcmi.adventureOptions.showGrid.hover" : "Show Grid", "vcmi.adventureOptions.showGrid.hover" : "Afficher la grille",
"vcmi.adventureOptions.showGrid.help" : "{Show Grid}\n\nShow the grid overlay, highlighting the borders between adventure map tiles.", "vcmi.adventureOptions.showGrid.help" : "{Show Grid}\n\nMontrer la superposition de la grille, mettant en évidence les frontières entre les carreaux de carte d'aventure.",
"vcmi.adventureOptions.borderScroll.hover" : "Border Scrolling", "vcmi.adventureOptions.borderScroll.hover" : "Défilement de bord",
"vcmi.adventureOptions.borderScroll.help" : "{Border Scrolling}\n\nScroll adventure map when cursor is adjacent to window edge. Can be disabled by holding down CTRL key.", "vcmi.adventureOptions.borderScroll.help" : "{Border Scrolling}\n\nFait défiler la carte aventure lorsque le curseur est sur le bord de la fenêtre. Peut être désactivé en maintenant la touche Ctrl.",
"vcmi.adventureOptions.infoBarCreatureManagement.hover" : "Info Panel Creature Management",
"vcmi.adventureOptions.infoBarCreatureManagement.help" : "{Info Panel Creature Management}\n\nAllows rearranging creatures in info panel instead of cycling between default components.",
"vcmi.adventureOptions.leftButtonDrag.hover" : "Left Click Drag Map",
"vcmi.adventureOptions.leftButtonDrag.help" : "{Left Click Drag Map}\n\nWhen enabled, moving mouse with left button pressed will drag adventure map view.",
"vcmi.adventureOptions.mapScrollSpeed1.hover": "", "vcmi.adventureOptions.mapScrollSpeed1.hover": "",
"vcmi.adventureOptions.mapScrollSpeed5.hover": "", "vcmi.adventureOptions.mapScrollSpeed5.hover": "",
"vcmi.adventureOptions.mapScrollSpeed6.hover": "", "vcmi.adventureOptions.mapScrollSpeed6.hover": "",
"vcmi.adventureOptions.mapScrollSpeed1.help": "Set the map scrolling speed to very slow.", "vcmi.adventureOptions.mapScrollSpeed1.help": "Régler la vitesse de défilement de la carte sur très lent",
"vcmi.adventureOptions.mapScrollSpeed5.help": "Set the map scrolling speed to very fast.", "vcmi.adventureOptions.mapScrollSpeed5.help": "Régler la vitesse de défilement de la carte très rapide",
"vcmi.adventureOptions.mapScrollSpeed6.help": "Set the map scrolling speed to instantaneous.", "vcmi.adventureOptions.mapScrollSpeed6.help": "Régler la vitesse de défilement de la carte sur instantanément.",
"vcmi.battleOptions.queueSizeLabel.hover": "Show Turn Order Queue", "vcmi.battleOptions.queueSizeLabel.hover": "Afficher l'ordre de fil de tour",
"vcmi.battleOptions.queueSizeNoneButton.hover": "OFF", "vcmi.battleOptions.queueSizeNoneButton.hover": "Désactivé",
"vcmi.battleOptions.queueSizeAutoButton.hover": "AUTO", "vcmi.battleOptions.queueSizeAutoButton.hover": "AUTO",
"vcmi.battleOptions.queueSizeSmallButton.hover": "SMALL", "vcmi.battleOptions.queueSizeSmallButton.hover": "PETITE",
"vcmi.battleOptions.queueSizeBigButton.hover": "BIG", "vcmi.battleOptions.queueSizeBigButton.hover": "GRANDE",
"vcmi.battleOptions.queueSizeNoneButton.help": "Do not display Turn Order Queue.", "vcmi.battleOptions.queueSizeNoneButton.help": "Ne pas afficher l'ordre de fil de tour",
"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.queueSizeAutoButton.help": "Ajuster automatiquement la taille de l'ordre de fil de tour en fonction de la résolution du jeu (la PETITE taille est utilisée lorsque vous jouez au jeu sur une hauteur de résolution inférieure à 700 pixels, la GRANDE taille est utilisée au sinon)",
"vcmi.battleOptions.queueSizeSmallButton.help": "Sets turn order queue size to SMALL.", "vcmi.battleOptions.queueSizeSmallButton.help": "Régler la taille de l'ordre de fil de tour sur PETITE",
"vcmi.battleOptions.queueSizeBigButton.help": "Sets turn order queue size to BIG (not supported if game resolution height is less than 700 pixels).", "vcmi.battleOptions.queueSizeBigButton.help": "Régler la taille de l'ordre de fil de tour à GRANDE (non prise en charge si la hauteur de la résolution du jeu est inférieure à 700 pixels)",
"vcmi.battleOptions.animationsSpeed1.hover": "", "vcmi.battleOptions.animationsSpeed1.hover": "",
"vcmi.battleOptions.animationsSpeed5.hover": "", "vcmi.battleOptions.animationsSpeed5.hover": "",
"vcmi.battleOptions.animationsSpeed6.hover": "", "vcmi.battleOptions.animationsSpeed6.hover": "",
"vcmi.battleOptions.animationsSpeed1.help": "Set animation speed to very slow.", "vcmi.battleOptions.animationsSpeed1.help": "Régler la vitesse d'animation très lente",
"vcmi.battleOptions.animationsSpeed5.help": "Set animation speed to very fast.", "vcmi.battleOptions.animationsSpeed5.help": "Régler la vitesse d'animation très rapide",
"vcmi.battleOptions.animationsSpeed6.help": "Set animation speed to instantaneous.", "vcmi.battleOptions.animationsSpeed6.help": "Régler la vitesse d'animation sur instantané",
"vcmi.battleOptions.movementHighlightOnHover.hover": "Movement Highlight on Hover", "vcmi.battleOptions.movementHighlightOnHover.hover": "Mise en surbrillance du mouvement au survol",
"vcmi.battleOptions.movementHighlightOnHover.help": "{Movement Highlight on Hover}\n\nHighlight unit's movement range when you hover over it.", "vcmi.battleOptions.movementHighlightOnHover.help": "{Movement Highlight on Hover}\n\nMettre en surbrillance la plage de mouvement de l'unité lorsque vous la survolez.",
"vcmi.battleOptions.rangeLimitHighlightOnHover.hover": "Show range limits for shooters", "vcmi.battleOptions.rangeLimitHighlightOnHover.hover": "Afficher les limites de portée pour les tireurs",
"vcmi.battleOptions.rangeLimitHighlightOnHover.help": "{Show range limits for shooters on Hover}\n\nShow shooter's range limits when you hover over it.", "vcmi.battleOptions.rangeLimitHighlightOnHover.help": "{Show range limits for shooters on Hover}\n\nAfficher les limites de portée du tireur lorsque vous le survolez.",
"vcmi.battleOptions.showStickyHeroInfoWindows.hover": "Show heroes statistics windows", "vcmi.battleOptions.skipBattleIntroMusic.hover": "Ignorer la musique d'introduction",
"vcmi.battleOptions.showStickyHeroInfoWindows.help": "{Show heroes statistics windows}\n\nPermanently toggle on heroes statistics windows that show primary stats and spell points.", "vcmi.battleOptions.skipBattleIntroMusic.help": "{Skip Intro Music}\n\nAutoriser les actions pendant la musique d'intro qui joue au début de chaque bataille",
"vcmi.battleOptions.skipBattleIntroMusic.hover": "Skip Intro Music", "vcmi.battleWindow.pressKeyToSkipIntro" : "Appuyez sur n'importe quelle touche pour commencer la bataille immédiatement",
"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" : "Attaque %CREATURE (%DAMAGE).",
"vcmi.battleWindow.damageEstimation.melee" : "Attack %CREATURE (%DAMAGE).", "vcmi.battleWindow.damageEstimation.meleeKills" : "Attaque %CREATURE (%DAMAGE, %KILLS).",
"vcmi.battleWindow.damageEstimation.meleeKills" : "Attack %CREATURE (%DAMAGE, %KILLS).", "vcmi.battleWindow.damageEstimation.ranged" : "Tir sur %CREATURE (%SHOTS, %DAMAGE).",
"vcmi.battleWindow.damageEstimation.ranged" : "Shoot %CREATURE (%SHOTS, %DAMAGE).", "vcmi.battleWindow.damageEstimation.rangedKills" : "Tir sur %CREATURE (%SHOTS, %DAMAGE, %KILLS).",
"vcmi.battleWindow.damageEstimation.rangedKills" : "Shoot %CREATURE (%SHOTS, %DAMAGE, %KILLS).", "vcmi.battleWindow.damageEstimation.shots" : "%d tirs restants",
"vcmi.battleWindow.damageEstimation.shots" : "%d shots left", "vcmi.battleWindow.damageEstimation.shots.1" : "%d tir restant",
"vcmi.battleWindow.damageEstimation.shots.1" : "%d shot left", "vcmi.battleWindow.damageEstimation.damage" : "%d dégâts",
"vcmi.battleWindow.damageEstimation.damage" : "%d damage", "vcmi.battleWindow.damageEstimation.damage.1" : "%d dégâts",
"vcmi.battleWindow.damageEstimation.damage.1" : "%d damage", "vcmi.battleWindow.damageEstimation.kills" : "%d va mourir",
"vcmi.battleWindow.damageEstimation.kills" : "%d will perish", "vcmi.battleWindow.damageEstimation.kills.1" : "%d va mourir",
"vcmi.battleWindow.damageEstimation.kills.1" : "%d will perish",
"vcmi.battleResultsWindow.applyResultsLabel" : "Apply battle result", "vcmi.battleResultsWindow.applyResultsLabel" : "Appliquer le résultat de la bataille",
"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Show Available Creatures", "vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Afficher les créatures disponibles",
"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.availableCreaturesAsDwellingLabel.help" : "{Show Available Creatures}\n\nAfficher le nombre de créatures disponibles au recrutement au lieu de leur croissance dans le résumé de la ville (coin inférieur gauche de l'écran de la ville).",
"vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Show Weekly Growth of Creatures", "vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Afficher la croissance hebdomadaire des créatures",
"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.creatureGrowthAsDwellingLabel.help" : "{Show Weekly Growth of Creatures}\n\nAfficher la croissance hebdomadaire des créatures au lieu de la quantité disponible dans le résumé de la ville (coin inférieur gauche de l'écran de la ville).",
"vcmi.otherOptions.compactTownCreatureInfo.hover": "Compact Creature Info", "vcmi.otherOptions.compactTownCreatureInfo.hover": "Infos compactes sur la créature",
"vcmi.otherOptions.compactTownCreatureInfo.help": "{Compact Creature Info}\n\nShow smaller information for town creatures in town summary (bottom-left corner of town screen).", "vcmi.otherOptions.compactTownCreatureInfo.help": "{Compact Creature Info}\n\nAfficher des informations plus petites pour les créatures de la ville dans le résumé de la ville (coin inférieur gauche de l'écran de la ville).",
"vcmi.townHall.missingBase" : "Base building %s must be built first", "vcmi.townHall.missingBase" : "Le bâtiment de base %s doit être construit avant",
"vcmi.townHall.noCreaturesToRecruit" : "There are no creatures to recruit!", "vcmi.townHall.noCreaturesToRecruit" : "Il n'y a aucune créature à recruter !",
"vcmi.townHall.greetingManaVortex" : "As you near the %s your body is filled with new energy. You have doubled your normal spell points.", "vcmi.townHall.greetingManaVortex" : "Alors que vous approchez du %s, votre corps est rempli d'une nouvelle énergie. Vous avez doublé vos points de sort normaux.",
"vcmi.townHall.greetingKnowledge" : "You study the glyphs on the %s and gain insight into the workings of various magics (+1 Knowledge).", "vcmi.townHall.greetingKnowledge" : "Vous étudiez les glyphes sur le %s et découvrez le fonctionnement de diverses magies (+1 Connaissance).",
"vcmi.townHall.greetingSpellPower" : "The %s teaches you new ways to focus your magical powers (+1 Power).", "vcmi.townHall.greetingSpellPower" : "Le %s vous apprend de nouvelles façons de concentrer vos pouvoirs magiques (+1 Pouvoir).",
"vcmi.townHall.greetingExperience" : "A visit to the %s teaches you many new skills (+1000 Experience).", "vcmi.townHall.greetingExperience" : "Une visite au %s vous apprend de nombreuses nouvelles compétences (+1000 Expérience).",
"vcmi.townHall.greetingAttack" : "Some time spent at the %s allows you to learn more effective combat skills (+1 Attack Skill).", "vcmi.townHall.greetingAttack" : "Un peu de temps passé au %s vous permet d'apprendre des compétences de combat plus efficaces (+1 compétence d'attaque).",
"vcmi.townHall.greetingDefence" : "Spending time in the %s, the experienced warriors therein teach you additional defensive skills (+1 Defense).", "vcmi.townHall.greetingDefence" : "En passant du temps dans le %s, les guerriers expérimentés qui s'y trouvent vous enseignent des compétences défensives supplémentaires (+1 Défense).",
"vcmi.townHall.hasNotProduced" : "The %s has not produced anything yet.", "vcmi.townHall.hasNotProduced" : "Le %s n'a encore rien produit.",
"vcmi.townHall.hasProduced" : "The %s produced %d %s this week.", "vcmi.townHall.hasProduced" : "Le %s a produit %d %s cette semaine.",
"vcmi.townHall.greetingCustomBonus" : "%s gives you +%d %s%s", "vcmi.townHall.greetingCustomBonus" : "%s vous offre +%d %s%s",
"vcmi.townHall.greetingCustomUntil" : " until next battle.", "vcmi.townHall.greetingCustomUntil" : " jusqu'à la prochaine bataille.",
"vcmi.townHall.greetingInTownMagicWell" : "%s has restored your spell points to maximum.", "vcmi.townHall.greetingInTownMagicWell" : "%s a restauré vos points de sort au maximum.",
"vcmi.logicalExpressions.anyOf" : "Any of the following:", "vcmi.logicalExpressions.anyOf" : "L'un des éléments suivants :",
"vcmi.logicalExpressions.allOf" : "All of the following:", "vcmi.logicalExpressions.allOf" : "Tous les éléments suivants :",
"vcmi.logicalExpressions.noneOf" : "None of the following:", "vcmi.logicalExpressions.noneOf" : "Aucun des éléments suivants :",
"vcmi.heroWindow.openCommander.hover" : "Open commander info window", "vcmi.heroWindow.openCommander.hover" : "Ouvrir la fenêtre d'informations du commandant",
"vcmi.heroWindow.openCommander.help" : "Shows details about the commander of this hero.", "vcmi.heroWindow.openCommander.help" : "Affiche des détails sur le commandant de ce héros",
"vcmi.heroWindow.openBackpack.hover" : "Open artifact backpack window",
"vcmi.heroWindow.openBackpack.help" : "Opens window that allows easier artifact backpack management.",
"vcmi.commanderWindow.artifactMessage" : "Do you want to return this artifact to the hero?", "vcmi.commanderWindow.artifactMessage" : "Voulez-vous rendre cet artefact au héros ?",
"vcmi.creatureWindow.showBonuses.hover" : "Switch to bonuses view", "vcmi.creatureWindow.showBonuses.hover" : "Passer en vue bonus",
"vcmi.creatureWindow.showBonuses.help" : "Display all active bonuses of the commander.", "vcmi.creatureWindow.showBonuses.help" : "Afficher tous les bonus actifs du commandant",
"vcmi.creatureWindow.showSkills.hover" : "Switch to skills view", "vcmi.creatureWindow.showSkills.hover" : "Passer à la vue des compétences",
"vcmi.creatureWindow.showSkills.help" : "Display all learned skills of the commander.", "vcmi.creatureWindow.showSkills.help" : "Afficher toutes les compétences apprises du commandant",
"vcmi.creatureWindow.returnArtifact.hover" : "Return artifact", "vcmi.creatureWindow.returnArtifact.hover" : "Remettre l'artefact",
"vcmi.creatureWindow.returnArtifact.help" : "Click this button to return the artifact to the hero's backpack.", "vcmi.creatureWindow.returnArtifact.help" : "Cliquez sur ce bouton pour remettre l'artefact dans le sac à dos du héros",
"vcmi.questLog.hideComplete.hover" : "Hide complete quests", "vcmi.questLog.hideComplete.hover" : "Masquer les quêtes terminées",
"vcmi.questLog.hideComplete.help" : "Hide all completed quests.", "vcmi.questLog.hideComplete.help" : "Masquer toutes les quêtes terminées",
"vcmi.randomMapTab.widgets.randomTemplate" : "(Random)",
"vcmi.randomMapTab.widgets.templateLabel" : "Template",
"vcmi.randomMapTab.widgets.teamAlignmentsButton" : "Setup...",
"vcmi.randomMapTab.widgets.teamAlignmentsLabel" : "Team Alignments",
"vcmi.randomMapTab.widgets.roadTypesLabel" : "Road Types",
"vcmi.optionsTab.widgets.chessFieldBase.help" : "{Extra timer}\n\nStarts counting down when the {turn timer} reaches zero. It is set only once at the beginning of the game. When this timer reaches zero, the player's turn ends.",
"vcmi.optionsTab.widgets.chessFieldTurn.help" : "{Turn timer}\n\nStarts counting down when the player starts their turn on the adventure map. It is reset to its initial value at the start of each turn. Any unused turn time will be added to the {Extra timer} if it is in use.",
"vcmi.optionsTab.widgets.chessFieldBattle.help" : "{Battle timer}\n\nCounts down during battles when the {stack timer} reaches zero. It is reset to its initial value at the start of each battle. If the timer reaches zero, the currently active stack will defend.",
"vcmi.optionsTab.widgets.chessFieldCreature.help" : "{Stack timer}\n\nStarts counting down when the player is selecting an action for the current stack during battle. It resets to its initial value after the stack's action is completed.",
"vcmi.optionsTab.widgets.labelTimer" : "Timer",
"vcmi.optionsTab.widgets.timerModeSwitch.classic" : "Classic timer",
"vcmi.optionsTab.widgets.timerModeSwitch.chess" : "Chess timer",
"vcmi.randomMapTab.widgets.templateLabel" : "Modèle",
"vcmi.randomMapTab.widgets.teamAlignmentsButton" : "Configuration...",
"vcmi.randomMapTab.widgets.teamAlignmentsLabel" : "Alignements d'équipe",
"vcmi.randomMapTab.widgets.roadTypesLabel" : "Types de routes",
// Custom victory conditions for H3 campaigns and HotA maps // Custom victory conditions for H3 campaigns and HotA maps
"vcmi.map.victoryCondition.daysPassed.toOthers" : "The enemy has managed to survive till this day. Victory is theirs!", "vcmi.map.victoryCondition.daysPassed.toOthers" : "L'ennemi a réussi à survivre jusqu'à ce jour. La victoire est à eux !",
"vcmi.map.victoryCondition.daysPassed.toSelf" : "Congratulations! You have managed to survive. Victory is yours!", "vcmi.map.victoryCondition.daysPassed.toSelf" : "Félicitations ! Vous avez réussi à survivre. La victoire est à vous !",
"vcmi.map.victoryCondition.eliminateMonsters.toOthers" : "The enemy has defeated all of the monsters plaguing this land and claims victory!", "vcmi.map.victoryCondition.eliminateMonsters.toOthers" : "L'ennemi a vaincu tous les monstres qui sévissent sur cette terre et revendique la victoire !",
"vcmi.map.victoryCondition.eliminateMonsters.toSelf" : "Congratulations! You have defeated all of the monsters plaguing this land and can claim victory!", "vcmi.map.victoryCondition.eliminateMonsters.toSelf" : "Félicitations ! Vous avez vaincu tous les monstres qui affligent ce pays et vous pouvez revendiquer la victoire !",
"vcmi.map.victoryCondition.collectArtifacts.message" : "Acquire Three Artifacts", "vcmi.map.victoryCondition.collectArtifacts.message" : "Acquérir trois artefacts",
"vcmi.map.victoryCondition.angelicAlliance.toSelf" : "Congratulations! All your enemies have been defeated and you have Angelic Alliance! Victory is yours!", "vcmi.map.victoryCondition.angelicAlliance.toSelf" : "Félicitations ! Tous vos ennemis ont été vaincus et vous avez l'alliance angélique ! La victoire est à vous !",
"vcmi.map.victoryCondition.angelicAlliance.message" : "Defeat All Enemies and create Angelic Alliance", "vcmi.map.victoryCondition.angelicAlliance.message" : "Vaincre tous les ennemis et créer une alliance angélique",
// few strings from WoG used by vcmi // 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.description" : D é t a i l s d e P i l e d ' E x p é r i e n c e «\n\nType de créature ................ : %s\nRang d'expérience ............... : %s (%i)\nPoints d'expérience ............. : %i\nPoints d'XP au rang suivant ..... : %i\nExpérience maximum par bataille . : %i%% (%i)\nNb de créatures dans la pile .... : %i\nMaximum de nouvelles recrues\n sans perdre le rang actuel ..... : %i\nMultiplicateur d'expérience ..... : %.2f\nMultiplicateur d'amélioration ... : %.2f\nExpérience après le rang 10 ..... : %i\nMaximum de Nouvelles Recrues pour\n rester au Rang 10 si\n l'Expérience Maximum ........... : %i",
"vcmi.stackExperience.rank.0" : "Basic", "vcmi.stackExperience.rank.0" : "Basique",
"vcmi.stackExperience.rank.1" : "Novice", "vcmi.stackExperience.rank.1" : "Novice",
"vcmi.stackExperience.rank.2" : "Trained", "vcmi.stackExperience.rank.2" : "Formé",
"vcmi.stackExperience.rank.3" : "Skilled", "vcmi.stackExperience.rank.3" : "Qualifié",
"vcmi.stackExperience.rank.4" : "Proven", "vcmi.stackExperience.rank.4" : "Éprouvé",
"vcmi.stackExperience.rank.5" : "Veteran", "vcmi.stackExperience.rank.5" : "Vétéran",
"vcmi.stackExperience.rank.6" : "Adept", "vcmi.stackExperience.rank.6" : "Adepte",
"vcmi.stackExperience.rank.7" : "Expert", "vcmi.stackExperience.rank.7" : "Expert",
"vcmi.stackExperience.rank.8" : "Elite", "vcmi.stackExperience.rank.8" : "Élite",
"vcmi.stackExperience.rank.9" : "Master", "vcmi.stackExperience.rank.9" : "Maître",
"vcmi.stackExperience.rank.10" : "Ace", "vcmi.stackExperience.rank.10" : "As",
"core.bonus.ADDITIONAL_ATTACK.name": "Double Strike", "core.bonus.ADDITIONAL_ATTACK.name": "Double frappe",
"core.bonus.ADDITIONAL_ATTACK.description": "Attacks twice", "core.bonus.ADDITIONAL_ATTACK.description": "Attaque deux fois",
"core.bonus.ADDITIONAL_RETALIATION.name": "Additional retaliations", "core.bonus.ADDITIONAL_RETALIATION.name": "Représailles supplémentaires",
"core.bonus.ADDITIONAL_RETALIATION.description": "May retaliate ${val} extra times", "core.bonus.ADDITIONAL_RETALIATION.description": "Peut riposter ${val} fois de plus",
"core.bonus.AIR_IMMUNITY.name": "Air immunity", "core.bonus.AIR_IMMUNITY.name": "Immunité aérienne",
"core.bonus.AIR_IMMUNITY.description": "Immune to all spells from the school of Air magic", "core.bonus.AIR_IMMUNITY.description": "Immunisé contre tous les sorts de l'école de magie de l'Air",
"core.bonus.ATTACKS_ALL_ADJACENT.name": "Attack all around", "core.bonus.ATTACKS_ALL_ADJACENT.name": "Attaque tout autour",
"core.bonus.ATTACKS_ALL_ADJACENT.description": "Attacks all adjacent enemies", "core.bonus.ATTACKS_ALL_ADJACENT.description": "Attaque tous les ennemis adjacents",
"core.bonus.BLOCKS_RETALIATION.name": "No retaliation", "core.bonus.BLOCKS_RETALIATION.name": "Pas de représailles",
"core.bonus.BLOCKS_RETALIATION.description": "Enemy cannot retaliate", "core.bonus.BLOCKS_RETALIATION.description": "L'ennemi ne peut pas riposter",
"core.bonus.BLOCKS_RANGED_RETALIATION.name": "No ranged retaliation", "core.bonus.BLOCKS_RANGED_RETALIATION.name": "Pas de représailles à distance",
"core.bonus.BLOCKS_RANGED_RETALIATION.description": "Enemy cannot retaliate by using a ranged attack", "core.bonus.BLOCKS_RANGED_RETALIATION.description": "L'ennemi ne peut pas riposter en utilisant une attaque à distance",
"core.bonus.CATAPULT.name": "Catapult", "core.bonus.CATAPULT.name": "Catapulte",
"core.bonus.CATAPULT.description": "Attacks siege walls", "core.bonus.CATAPULT.description": "Attaque les murs de siège",
"core.bonus.CHANGES_SPELL_COST_FOR_ALLY.name": "Reduce Casting Cost (${val})", "core.bonus.CHANGES_SPELL_COST_FOR_ALLY.name": "Réduire le coût de lancement (${val})",
"core.bonus.CHANGES_SPELL_COST_FOR_ALLY.description": "Reduces the spellcasting cost for the hero by ${val}", "core.bonus.CHANGES_SPELL_COST_FOR_ALLY.description": "Réduit le coût d'incantation du héros de ${val}",
"core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.name": "Magic Damper (${val})", "core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.name": "Amortisseur magique (${val})",
"core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.description": "Increases spellcasting cost of enemy spells by ${val}", "core.bonus.CHANGES_SPELL_COST_FOR_ENEMY.description": "Augmente le coût d'incantation des sorts ennemis de ${val}",
"core.bonus.CHARGE_IMMUNITY.name": "Immune to Charge", "core.bonus.CHARGE_IMMUNITY.name": "Immunisé contre la charge",
"core.bonus.CHARGE_IMMUNITY.description": "Immune to Cavalier's and Champion's Charge", "core.bonus.CHARGE_IMMUNITY.description": "Immunisé contre la charge du cavalier et du champion",
"core.bonus.DARKNESS.name": "Darkness cover", "core.bonus.DARKNESS.name": "Couverture de ténèbres",
"core.bonus.DARKNESS.description": "Creates a shroud of darkness with a ${val} radius", "core.bonus.DARKNESS.description": "Crée un linceul de ténèbres avec un rayon de ${val}",
"core.bonus.DEATH_STARE.name": "Death Stare (${val}%)", "core.bonus.DEATH_STARE.name": "Regard mortel (${val}%)",
"core.bonus.DEATH_STARE.description": "Has a ${val}% chance to kill a single creature", "core.bonus.DEATH_STARE.description": "A ${val}% de chances de tuer une seule créature",
"core.bonus.DEFENSIVE_STANCE.name": "Defense Bonus", "core.bonus.DEFENSIVE_STANCE.name": "Bonus de défense",
"core.bonus.DEFENSIVE_STANCE.description": "+${val} Defense when defending", "core.bonus.DEFENSIVE_STANCE.description": "+${val} Défense en défense",
"core.bonus.DESTRUCTION.name": "Destruction", "core.bonus.DESTRUCTION.name": "Destruction",
"core.bonus.DESTRUCTION.description": "Has ${val}% chance to kill extra units after attack", "core.bonus.DESTRUCTION.description": "A ${val} % de chances de tuer des unités supplémentaires après l'attaque",
"core.bonus.DOUBLE_DAMAGE_CHANCE.name": "Death Blow", "core.bonus.DOUBLE_DAMAGE_CHANCE.name": "Coup mortel",
"core.bonus.DOUBLE_DAMAGE_CHANCE.description": "Has a ${val}% chance of dealing double base damage when attacking", "core.bonus.DOUBLE_DAMAGE_CHANCE.description": "A ${val}% de chances d'infliger des dégâts de base doublés en attaquant",
"core.bonus.DRAGON_NATURE.name": "Dragon", "core.bonus.DRAGON_NATURE.name": "Dragon",
"core.bonus.DRAGON_NATURE.description": "Creature has a Dragon Nature", "core.bonus.DRAGON_NATURE.description": "La créature a une nature de dragon",
"core.bonus.EARTH_IMMUNITY.name": "Earth immunity", "core.bonus.EARTH_IMMUNITY.name": "Immunité terrestre",
"core.bonus.EARTH_IMMUNITY.description": "Immune to all spells from the school of Earth magic", "core.bonus.EARTH_IMMUNITY.description": "Immunisé contre tous les sorts de l'école de magie de la Terre",
"core.bonus.ENCHANTER.name": "Enchanter", "core.bonus.ENCHANTER.name": "Enchanteur",
"core.bonus.ENCHANTER.description": "Can cast mass ${subtype.spell} every turn", "core.bonus.ENCHANTER.description": "Peut lancer en masse ${subtype.spell} à chaque tour",
"core.bonus.ENCHANTED.name": "Enchanted", "core.bonus.ENCHANTED.name": "Enchanté",
"core.bonus.ENCHANTED.description": "Affected by permanent ${subtype.spell}", "core.bonus.ENCHANTED.description": "Affecté par ${subtype.spell} permanent",
"core.bonus.ENEMY_DEFENCE_REDUCTION.name": "Ignore Defense (${val}%)", "core.bonus.ENEMY_DEFENCE_REDUCTION.name": "Ignorer la défense (${val}%)",
"core.bonus.ENEMY_DEFENCE_REDUCTION.description": "When attacking, ${val}% of the defender's defense is ignored", "core.bonus.ENEMY_DEFENCE_REDUCTION.description": "Lors de l'attaque, ${val}% de la défense du défenseur est ignorée",
"core.bonus.FIRE_IMMUNITY.name": "Fire immunity", "core.bonus.FIRE_IMMUNITY.name": "Immunité au feu",
"core.bonus.FIRE_IMMUNITY.description": "Immune to all spells from the school of Fire magic", "core.bonus.FIRE_IMMUNITY.description": "Immunisé contre tous les sorts de l'école de magie du Feu",
"core.bonus.FIRE_SHIELD.name": "Fire Shield (${val}%)", "core.bonus.FIRE_SHIELD.name": "Bouclier de feu (${val}%)",
"core.bonus.FIRE_SHIELD.description": "Reflects part of melee damage", "core.bonus.FIRE_SHIELD.description": "Reflète une partie des dégâts de mêlée",
"core.bonus.FIRST_STRIKE.name": "First Strike", "core.bonus.FIRST_STRIKE.name": "Premier coup",
"core.bonus.FIRST_STRIKE.description": "This creature retaliates before being attacked", "core.bonus.FIRST_STRIKE.description": "Cette créature riposte avant d'être attaquée",
"core.bonus.FEAR.name": "Fear", "core.bonus.FEAR.name": "Peur",
"core.bonus.FEAR.description": "Causes Fear on an enemy stack", "core.bonus.FEAR.description": "Provoque la peur sur une pile ennemie",
"core.bonus.FEARLESS.name": "Fearless", "core.bonus.FEARLESS.name": "Intrépide",
"core.bonus.FEARLESS.description": "Immune to Fear ability", "core.bonus.FEARLESS.description": "Immunité à la peur",
"core.bonus.FLYING.name": "Fly", "core.bonus.FLYING.name": "Vol",
"core.bonus.FLYING.description": "Flies when moving (ignores obstacles)", "core.bonus.FLYING.description": "Vole en se déplaçant (ignore les obstacles)",
"core.bonus.FREE_SHOOTING.name": "Shoot Close", "core.bonus.FREE_SHOOTING.name": "Tirer de près",
"core.bonus.FREE_SHOOTING.description": "Can use ranged attacks at melee range", "core.bonus.FREE_SHOOTING.description": "Peut utiliser des attaques à distance au corps à corps",
"core.bonus.GARGOYLE.name": "Gargoyle", "core.bonus.GARGOYLE.name": "Gargouille",
"core.bonus.GARGOYLE.description": "Cannot be raised or healed", "core.bonus.GARGOYLE.description": "Ne peut pas être réanimé ou soigné",
"core.bonus.GENERAL_DAMAGE_REDUCTION.name": "Reduce Damage (${val}%)", "core.bonus.GENERAL_DAMAGE_REDUCTION.name": "Réduit les dégâts (${val}%)",
"core.bonus.GENERAL_DAMAGE_REDUCTION.description": "Reduces physical damage from ranged or melee attacks", "core.bonus.GENERAL_DAMAGE_REDUCTION.description": "Réduit les dégâts physiques des attaques à distance ou de mêlée",
"core.bonus.HATE.name": "Hates ${subtype.creature}", "core.bonus.HATE.name": "teste ${subtype.creature}",
"core.bonus.HATE.description": "Does ${val}% more damage to ${subtype.creature}", "core.bonus.HATE.description": "Inflige ${val} % de dégâts supplémentaires à ${subtype.creature}",
"core.bonus.HEALER.name": "Healer", "core.bonus.HEALER.name": "Guérisseur",
"core.bonus.HEALER.description": "Heals allied units", "core.bonus.HEALER.description": "Soigne les unités alliées",
"core.bonus.HP_REGENERATION.name": "Regeneration", "core.bonus.HP_REGENERATION.name": "Régénération",
"core.bonus.HP_REGENERATION.description": "Heals ${val} hit points every round", "core.bonus.HP_REGENERATION.description": "Soigne ${val} points de vie à chaque tour",
"core.bonus.JOUSTING.name": "Champion charge", "core.bonus.JOUSTING.name": "Charge de champion",
"core.bonus.JOUSTING.description": "+${val}% damage for each hex travelled", "core.bonus.JOUSTING.description": "+${val}% de dégâts pour chaque hexagone parcouru",
"core.bonus.KING.name": "King", "core.bonus.KING.name": "Roi",
"core.bonus.KING.description": "Vulnerable to SLAYER level ${val} or higher", "core.bonus.KING.description": "Vulnérable au niveau POURFENDEUR ${val} ou supérieur",
"core.bonus.LEVEL_SPELL_IMMUNITY.name": "Spell immunity 1-${val}", "core.bonus.LEVEL_SPELL_IMMUNITY.name": "Immunité aux sorts 1-${val}",
"core.bonus.LEVEL_SPELL_IMMUNITY.description": "Immune to spells of levels 1-${val}", "core.bonus.LEVEL_SPELL_IMMUNITY.description": "Immunisé aux sorts de niveaux 1-${val}",
"core.bonus.LIMITED_SHOOTING_RANGE.name" : "Limited shooting range", "core.bonus.LIMITED_SHOOTING_RANGE.name" : "Portée de tir limitée",
"core.bonus.LIMITED_SHOOTING_RANGE.description" : "Unable to target units farther than ${val} hexes", "core.bonus.LIMITED_SHOOTING_RANGE.description" : "Impossible de cibler des unités plus loin que ${val} hexagones",
"core.bonus.LIFE_DRAIN.name": "Drain life (${val}%)", "core.bonus.LIFE_DRAIN.name": "Durée de vie du drain (${val}%)",
"core.bonus.LIFE_DRAIN.description": "Drains ${val}% of damage dealt", "core.bonus.LIFE_DRAIN.description": "Draine ${val}% des dégâts infligés",
"core.bonus.MANA_CHANNELING.name": "Magic Channel ${val}%", "core.bonus.MANA_CHANNELING.name": "Chaîne magique ${val}%",
"core.bonus.MANA_CHANNELING.description": "Gives your hero ${val}% of the mana spent by the enemy", "core.bonus.MANA_CHANNELING.description": "Donne à votre héros ${val}% du mana pensé par l'ennemi",
"core.bonus.MANA_DRAIN.name": "Mana Drain", "core.bonus.MANA_DRAIN.name": "Drain de mana",
"core.bonus.MANA_DRAIN.description": "Drains ${val} mana every turn", "core.bonus.MANA_DRAIN.description": "Draine ${val} mana à chaque tour",
"core.bonus.MAGIC_MIRROR.name": "Magic Mirror (${val}%)", "core.bonus.MAGIC_MIRROR.name": "Miroir magique (${val}%)",
"core.bonus.MAGIC_MIRROR.description": "Has a ${val}% chance to redirect an offensive spell to an enemy unit", "core.bonus.MAGIC_MIRROR.description": "A ${val} % de chances de rediriger un sort offensif vers une unité ennemie",
"core.bonus.MAGIC_RESISTANCE.name": "Magic Resistance (${val}%)", "core.bonus.MAGIC_RESISTANCE.name": "Résistance magique (${val}%)",
"core.bonus.MAGIC_RESISTANCE.description": "Has a ${val}% chance to resist an enemy spell", "core.bonus.MAGIC_RESISTANCE.description": "A ${val}% de chances de résister à un sort ennemi",
"core.bonus.MIND_IMMUNITY.name": "Mind Spell Immunity", "core.bonus.MIND_IMMUNITY.name": "Immunité contre les sorts de l'esprit",
"core.bonus.MIND_IMMUNITY.description": "Immune to Mind-type spells", "core.bonus.MIND_IMMUNITY.description": "Immunisé contre les sorts de type Mental",
"core.bonus.NO_DISTANCE_PENALTY.name": "No distance penalty", "core.bonus.NO_DISTANCE_PENALTY.name": "Aucune pénalité de distance",
"core.bonus.NO_DISTANCE_PENALTY.description": "Does full damage at any distance", "core.bonus.NO_DISTANCE_PENALTY.description": "Inflige des dégâts complets à n'importe quelle distance",
"core.bonus.NO_MELEE_PENALTY.name": "No melee penalty", "core.bonus.NO_MELEE_PENALTY.name": "Aucune pénalité de mêlée",
"core.bonus.NO_MELEE_PENALTY.description": "Creature has no Melee Penalty", "core.bonus.NO_MELEE_PENALTY.description": "La créature n'a pas de pénalité de mêlée",
"core.bonus.NO_MORALE.name": "Neutral Morale", "core.bonus.NO_MORALE.name": "Moral neutre",
"core.bonus.NO_MORALE.description": "Creature is immune to morale effects", "core.bonus.NO_MORALE.description": "La créature est immunisée contre les effets de moral",
"core.bonus.NO_WALL_PENALTY.name": "No wall penalty", "core.bonus.NO_WALL_PENALTY.name": "Aucune pénalité de mur",
"core.bonus.NO_WALL_PENALTY.description": "Full damage during siege", "core.bonus.NO_WALL_PENALTY.description": "Dégâts complets pendant le siège",
"core.bonus.NON_LIVING.name": "Non living", "core.bonus.NON_LIVING.name": "Non vivant",
"core.bonus.NON_LIVING.description": "Immunity to many effects", "core.bonus.NON_LIVING.description": "Immunité à de nombreux effets",
"core.bonus.RANDOM_SPELLCASTER.name": "Random spellcaster", "core.bonus.RANDOM_SPELLCASTER.name": "Lanceur de sorts aléatoire",
"core.bonus.RANDOM_SPELLCASTER.description": "Can cast random spell", "core.bonus.RANDOM_SPELLCASTER.description": "Peut lancer un sort aléatoire",
"core.bonus.RANGED_RETALIATION.name": "Ranged retaliation", "core.bonus.RANGED_RETALIATION.name": "Représailles à distance",
"core.bonus.RANGED_RETALIATION.description": "Can perform ranged counterattack", "core.bonus.RANGED_RETALIATION.description": "Peut effectuer une contre-attaque à distance",
"core.bonus.RECEPTIVE.name": "Receptive", "core.bonus.RECEPTIVE.name": "Réceptif",
"core.bonus.RECEPTIVE.description": "No Immunity to Friendly Spells", "core.bonus.RECEPTIVE.description": "Pas d'immunité aux sorts amicaux",
"core.bonus.REBIRTH.name": "Rebirth (${val}%)", "core.bonus.REBIRTH.name": "Renaissance (${val}%)",
"core.bonus.REBIRTH.description": "${val}% of stack will rise after death", "core.bonus.REBIRTH.description": "${val}% de la pile augmentera après la mort",
"core.bonus.RETURN_AFTER_STRIKE.name": "Attack and Return", "core.bonus.RETURN_AFTER_STRIKE.name": "Attaque et retour",
"core.bonus.RETURN_AFTER_STRIKE.description": "Returns after melee attack", "core.bonus.RETURN_AFTER_STRIKE.description": "Revient après une attaque au corps à corps",
"core.bonus.SHOOTER.name": "Ranged", "core.bonus.SHOOTER.name": "Distance",
"core.bonus.SHOOTER.description": "Creature can shoot", "core.bonus.SHOOTER.description": "La créature peut tirer",
"core.bonus.SHOOTS_ALL_ADJACENT.name": "Shoot all around", "core.bonus.SHOOTS_ALL_ADJACENT.name": "Tirer tout autour",
"core.bonus.SHOOTS_ALL_ADJACENT.description": "This creature's ranged attacks strike all targets in a small area", "core.bonus.SHOOTS_ALL_ADJACENT.description": "Les attaques à distance de cette créature touchent toutes les cibles dans une petite zone",
"core.bonus.SOUL_STEAL.name": "Soul Steal", "core.bonus.SOUL_STEAL.name": "Vol d'âme",
"core.bonus.SOUL_STEAL.description": "Gains ${val} new creatures for each enemy killed", "core.bonus.SOUL_STEAL.description": "Gagne ${val} nouvelles créatures pour chaque ennemi tué",
"core.bonus.SPELLCASTER.name": "Spellcaster", "core.bonus.SPELLCASTER.name": "Lanceur de sorts",
"core.bonus.SPELLCASTER.description": "Can cast ${subtype.spell}", "core.bonus.SPELLCASTER.description": "Peut lancer ${subtype.spell}",
"core.bonus.SPELL_AFTER_ATTACK.name": "Cast After Attack", "core.bonus.SPELL_AFTER_ATTACK.name": "Lancer après l'attaque",
"core.bonus.SPELL_AFTER_ATTACK.description": "Has a ${val}% chance to cast ${subtype.spell} after it attacks", "core.bonus.SPELL_AFTER_ATTACK.description": "A ${val}% de chances de lancer ${subtype.spell} après avoir attaqué",
"core.bonus.SPELL_BEFORE_ATTACK.name": "Cast Before Attack", "core.bonus.SPELL_BEFORE_ATTACK.name": "Lancer avant l'attaque",
"core.bonus.SPELL_BEFORE_ATTACK.description": "Has a ${val}% chance to cast ${subtype.spell} before it attacks", "core.bonus.SPELL_BEFORE_ATTACK.description": "A ${val}% de chances de lancer ${subtype.spell} avant qu'il n'attaque",
"core.bonus.SPELL_DAMAGE_REDUCTION.name": "Spell Resistance", "core.bonus.SPELL_DAMAGE_REDUCTION.name": "Résistance aux sorts",
"core.bonus.SPELL_DAMAGE_REDUCTION.description": "Damage from spells reduced by ${val}%.", "core.bonus.SPELL_DAMAGE_REDUCTION.description": "Dégâts des sorts réduits de ${val}%.",
"core.bonus.SPELL_IMMUNITY.name": "Spell immunity", "core.bonus.SPELL_IMMUNITY.name": "Immunité aux sorts",
"core.bonus.SPELL_IMMUNITY.description": "Immune to ${subtype.spell}", "core.bonus.SPELL_IMMUNITY.description": "Immunisé contre ${subtype.spell}",
"core.bonus.SPELL_LIKE_ATTACK.name": "Spell-like attack", "core.bonus.SPELL_LIKE_ATTACK.name": "Attaque semblable à un sort",
"core.bonus.SPELL_LIKE_ATTACK.description": "Attacks with ${subtype.spell}", "core.bonus.SPELL_LIKE_ATTACK.description": "Attaque avec ${subtype.spell}",
"core.bonus.SPELL_RESISTANCE_AURA.name": "Aura of Resistance", "core.bonus.SPELL_RESISTANCE_AURA.name": "Aura de résistance",
"core.bonus.SPELL_RESISTANCE_AURA.description": "Nearby stacks get ${val}% magic resistance", "core.bonus.SPELL_RESISTANCE_AURA.description": "Les piles à proximité obtiennent ${val}% de résistance magique",
"core.bonus.SUMMON_GUARDIANS.name": "Summon guardians", "core.bonus.SUMMON_GUARDIANS.name": "Invoquer des gardiens",
"core.bonus.SUMMON_GUARDIANS.description": "At the start of battle summons ${subtype.creature} (${val}%)", "core.bonus.SUMMON_GUARDIANS.description": "Au début de la bataille, invoque ${subtype.creature} (${val}%)",
"core.bonus.SYNERGY_TARGET.name": "Synergizable", "core.bonus.SYNERGY_TARGET.name": "Synergique",
"core.bonus.SYNERGY_TARGET.description": "This creature is vulnerable to synergy effect", "core.bonus.SYNERGY_TARGET.description": "Cette créature est vulnérable à l'effet de synergie",
"core.bonus.TWO_HEX_ATTACK_BREATH.name": "Breath", "core.bonus.TWO_HEX_ATTACK_BREATH.name": "Souffle",
"core.bonus.TWO_HEX_ATTACK_BREATH.description": "Breath Attack (2-hex range)", "core.bonus.TWO_HEX_ATTACK_BREATH.description": "Attaque de souffle (portée de 2 hexagones)",
"core.bonus.THREE_HEADED_ATTACK.name": "Three-headed attack", "core.bonus.THREE_HEADED_ATTACK.name": "Attaque à trois têtes",
"core.bonus.THREE_HEADED_ATTACK.description": "Attacks three adjacent units", "core.bonus.THREE_HEADED_ATTACK.description": "Attaque trois unités adjacentes",
"core.bonus.TRANSMUTATION.name": "Transmutation", "core.bonus.TRANSMUTATION.name": "Transmutation",
"core.bonus.TRANSMUTATION.description": "${val}% chance to transform attacked unit to a different type", "core.bonus.TRANSMUTATION.description": "${val}% de chances de transformer l'unité attaquée en un type différent",
"core.bonus.UNDEAD.name": "Undead", "core.bonus.UNDEAD.name": "Morts-vivants",
"core.bonus.UNDEAD.description": "Creature is Undead", "core.bonus.UNDEAD.description": "La créature est un mort-vivant",
"core.bonus.UNLIMITED_RETALIATIONS.name": "Unlimited retaliations", "core.bonus.UNLIMITED_RETALIATIONS.name": "Représailles illimitées",
"core.bonus.UNLIMITED_RETALIATIONS.description": "Can retaliate against an unlimited number of attacks", "core.bonus.UNLIMITED_RETALIATIONS.description": "Peut riposter contre un nombre illimité d'attaques",
"core.bonus.WATER_IMMUNITY.name": "Water immunity", "core.bonus.WATER_IMMUNITY.name": "Immunité à l'eau",
"core.bonus.WATER_IMMUNITY.description": "Immune to all spells from the school of Water magic", "core.bonus.WATER_IMMUNITY.description": "Immunisé contre tous les sorts de l'école de magie de l'Eau",
"core.bonus.WIDE_BREATH.name": "Wide breath", "core.bonus.WIDE_BREATH.name": "Large souffle",
"core.bonus.WIDE_BREATH.description": "Wide breath attack (multiple hexes)" "core.bonus.WIDE_BREATH.description": "Attaque à souffle large (plusieurs hexagones)"
} }

View File

@@ -30,7 +30,6 @@
"vcmi.capitalColors.6" : "Turquoise", "vcmi.capitalColors.6" : "Turquoise",
"vcmi.capitalColors.7" : "Rose", "vcmi.capitalColors.7" : "Rose",
"vcmi.mainMenu.highscoresNotImplemented" : "Désolé, le menu des meilleurs scores n'est pas encore implémenté\n",
"vcmi.mainMenu.serverConnecting" : "Connexion...", "vcmi.mainMenu.serverConnecting" : "Connexion...",
"vcmi.mainMenu.serverAddressEnter" : "Entrez l'adresse :", "vcmi.mainMenu.serverAddressEnter" : "Entrez l'adresse :",
"vcmi.mainMenu.serverClosing" : "Fermeture...", "vcmi.mainMenu.serverClosing" : "Fermeture...",

View File

@@ -41,7 +41,6 @@
"vcmi.radialWheel.moveUnit" : "Verschieben der Kreatur in andere Armee", "vcmi.radialWheel.moveUnit" : "Verschieben der Kreatur in andere Armee",
"vcmi.radialWheel.splitUnit" : "Aufsplitten der Kreatur in anderen Slot", "vcmi.radialWheel.splitUnit" : "Aufsplitten der Kreatur in anderen Slot",
"vcmi.mainMenu.highscoresNotImplemented" : "Die Highscores sind aktuell noch nicht implementiert\n",
"vcmi.mainMenu.serverConnecting" : "Verbinde...", "vcmi.mainMenu.serverConnecting" : "Verbinde...",
"vcmi.mainMenu.serverAddressEnter" : "Addresse eingeben:", "vcmi.mainMenu.serverAddressEnter" : "Addresse eingeben:",
"vcmi.mainMenu.serverClosing" : "Trenne...", "vcmi.mainMenu.serverClosing" : "Trenne...",

View File

@@ -36,7 +36,6 @@
"vcmi.radialWheel.moveUnit" : "Przenieś stworzenia do innej armii", "vcmi.radialWheel.moveUnit" : "Przenieś stworzenia do innej armii",
"vcmi.radialWheel.splitUnit" : "Podziel jednostkę do wybranego miejsca", "vcmi.radialWheel.splitUnit" : "Podziel jednostkę do wybranego miejsca",
"vcmi.mainMenu.highscoresNotImplemented" : "Przepraszamy, najlepsze wyniki nie zostały jeszcze zaimplementowane\n",
"vcmi.mainMenu.serverConnecting" : "Łączenie...", "vcmi.mainMenu.serverConnecting" : "Łączenie...",
"vcmi.mainMenu.serverAddressEnter" : "Wprowadź adres:", "vcmi.mainMenu.serverAddressEnter" : "Wprowadź adres:",
"vcmi.mainMenu.serverClosing" : "Zamykanie...", "vcmi.mainMenu.serverClosing" : "Zamykanie...",

View File

@@ -37,7 +37,6 @@
"vcmi.radialWheel.moveUnit" : "Перемістити істоту до іншої армії", "vcmi.radialWheel.moveUnit" : "Перемістити істоту до іншої армії",
"vcmi.radialWheel.splitUnit" : "Розділити істоту в інший слот", "vcmi.radialWheel.splitUnit" : "Розділити істоту в інший слот",
"vcmi.mainMenu.highscoresNotImplemented" : "Вибачте, таблицю рекордів ще не реалізовано\n",
"vcmi.mainMenu.serverConnecting" : "Підключення...", "vcmi.mainMenu.serverConnecting" : "Підключення...",
"vcmi.mainMenu.serverAddressEnter" : "Вкажіть адресу:", "vcmi.mainMenu.serverAddressEnter" : "Вкажіть адресу:",
"vcmi.mainMenu.serverClosing" : "Завершення...", "vcmi.mainMenu.serverClosing" : "Завершення...",

View File

@@ -59,6 +59,7 @@ set(client_SRCS
mainmenu/CMainMenu.cpp mainmenu/CMainMenu.cpp
mainmenu/CPrologEpilogVideo.cpp mainmenu/CPrologEpilogVideo.cpp
mainmenu/CreditsScreen.cpp mainmenu/CreditsScreen.cpp
mainmenu/CHighScoreScreen.cpp
mapView/MapRenderer.cpp mapView/MapRenderer.cpp
mapView/MapRendererContext.cpp mapView/MapRendererContext.cpp
@@ -213,6 +214,7 @@ set(client_HEADERS
mainmenu/CMainMenu.h mainmenu/CMainMenu.h
mainmenu/CPrologEpilogVideo.h mainmenu/CPrologEpilogVideo.h
mainmenu/CreditsScreen.h mainmenu/CreditsScreen.h
mainmenu/CHighScoreScreen.h
mapView/IMapRendererContext.h mapView/IMapRendererContext.h
mapView/IMapRendererObserver.h mapView/IMapRendererObserver.h

View File

@@ -198,6 +198,8 @@
<Unit filename="mainmenu/CPrologEpilogVideo.h" /> <Unit filename="mainmenu/CPrologEpilogVideo.h" />
<Unit filename="mainmenu/CreditsScreen.cpp" /> <Unit filename="mainmenu/CreditsScreen.cpp" />
<Unit filename="mainmenu/CreditsScreen.h" /> <Unit filename="mainmenu/CreditsScreen.h" />
<Unit filename="mainmenu/CHighScoreScreen.cpp" />
<Unit filename="mainmenu/CHighScoreScreen.h" />
<Unit filename="mapHandler.cpp" /> <Unit filename="mapHandler.cpp" />
<Unit filename="mapHandler.h" /> <Unit filename="mapHandler.h" />
<Unit filename="resource.h" /> <Unit filename="resource.h" />

View File

@@ -217,6 +217,7 @@
<ClCompile Include="mainmenu\CMainMenu.cpp" /> <ClCompile Include="mainmenu\CMainMenu.cpp" />
<ClCompile Include="mainmenu\CPrologEpilogVideo.cpp" /> <ClCompile Include="mainmenu\CPrologEpilogVideo.cpp" />
<ClCompile Include="mainmenu\CreditsScreen.cpp" /> <ClCompile Include="mainmenu\CreditsScreen.cpp" />
<ClCompile Include="mainmenu\CHighScoreScreen.cpp" />
<ClCompile Include="mapHandler.cpp" /> <ClCompile Include="mapHandler.cpp" />
<ClCompile Include="NetPacksClient.cpp" /> <ClCompile Include="NetPacksClient.cpp" />
<ClCompile Include="NetPacksLobbyClient.cpp" /> <ClCompile Include="NetPacksLobbyClient.cpp" />
@@ -286,6 +287,7 @@
<ClInclude Include="mainmenu\CMainMenu.h" /> <ClInclude Include="mainmenu\CMainMenu.h" />
<ClInclude Include="mainmenu\CPrologEpilogVideo.h" /> <ClInclude Include="mainmenu\CPrologEpilogVideo.h" />
<ClInclude Include="mainmenu\CreditsScreen.h" /> <ClInclude Include="mainmenu\CreditsScreen.h" />
<ClInclude Include="mainmenu\CHighScoreScreen.h" />
<ClInclude Include="mapHandler.h" /> <ClInclude Include="mapHandler.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
<ClInclude Include="SDLRWwrapper.h" /> <ClInclude Include="SDLRWwrapper.h" />

View File

@@ -132,6 +132,7 @@
<ClCompile Include="mainmenu\CMainMenu.cpp" /> <ClCompile Include="mainmenu\CMainMenu.cpp" />
<ClCompile Include="mainmenu\CPrologEpilogVideo.cpp" /> <ClCompile Include="mainmenu\CPrologEpilogVideo.cpp" />
<ClCompile Include="mainmenu\CreditsScreen.cpp" /> <ClCompile Include="mainmenu\CreditsScreen.cpp" />
<ClCompile Include="mainmenu\CHighScoreScreen.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="VCMI_client.rc" /> <ResourceCompile Include="VCMI_client.rc" />
@@ -290,5 +291,6 @@
<ClInclude Include="mainmenu\CMainMenu.h" /> <ClInclude Include="mainmenu\CMainMenu.h" />
<ClInclude Include="mainmenu\CPrologEpilogVideo.h" /> <ClInclude Include="mainmenu\CPrologEpilogVideo.h" />
<ClInclude Include="mainmenu\CreditsScreen.h" /> <ClInclude Include="mainmenu\CreditsScreen.h" />
<ClInclude Include="mainmenu\CHighScoreScreen.h" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -0,0 +1,161 @@
/*
* CHighScoreScreen.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "CHighScoreScreen.h"
#include "../gui/CGuiHandler.h"
#include "../widgets/TextControls.h"
#include "../widgets/Buttons.h"
#include "../widgets/Images.h"
#include "../windows/InfoWindows.h"
#include "../render/Canvas.h"
#include "../CGameInfo.h"
#include "../../lib/CGeneralTextHandler.h"
#include "../../lib/CConfigHandler.h"
#include "../../lib/CCreatureHandler.h"
#include "../../lib/constants/EntityIdentifiers.h"
CHighScoreScreen::CHighScoreScreen()
: CWindowObject(BORDERED)
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
pos = center(Rect(0, 0, 800, 600));
updateShadow();
addHighScores();
addButtons();
// TODO: remove; only for testing
for (int i = 0; i < 11; i++)
{
Settings entry = persistentStorage.write["highscore"]["campaign"][std::to_string(i)]["player"];
entry->String() = "test";
Settings entry1 = persistentStorage.write["highscore"]["campaign"][std::to_string(i)]["campaign"];
entry1->String() = "test";
Settings entry2 = persistentStorage.write["highscore"]["campaign"][std::to_string(i)]["points"];
entry2->Integer() = 100;
Settings entry3 = persistentStorage.write["highscore"]["standard"][std::to_string(i)]["player"];
entry3->String() = "test";
Settings entry4 = persistentStorage.write["highscore"]["standard"][std::to_string(i)]["land"];
entry4->String() = "test";
Settings entry5 = persistentStorage.write["highscore"]["standard"][std::to_string(i)]["days"];
entry5->Integer() = 123;
Settings entry6 = persistentStorage.write["highscore"]["standard"][std::to_string(i)]["points"];
entry6->Integer() = 100;
}
}
void CHighScoreScreen::addButtons()
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
buttons.clear();
buttons.push_back(std::make_shared<CButton>(Point(31, 113), AnimationPath::builtin("HISCCAM.DEF"), CButton::tooltip(), [&](){ buttonCampaginClick(); }));
buttons.push_back(std::make_shared<CButton>(Point(31, 345), AnimationPath::builtin("HISCSTA.DEF"), CButton::tooltip(), [&](){ buttonStandardClick(); }));
buttons.push_back(std::make_shared<CButton>(Point(726, 113), AnimationPath::builtin("HISCRES.DEF"), CButton::tooltip(), [&](){ buttonResetClick(); }));
buttons.push_back(std::make_shared<CButton>(Point(726, 345), AnimationPath::builtin("HISCEXT.DEF"), CButton::tooltip(), [&](){ buttonExitClick(); }));
}
void CHighScoreScreen::addHighScores()
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
background = std::make_shared<CPicture>(ImagePath::builtin(highscorepage == HighScorePage::STANDARD ? "HISCORE" : "HISCORE2"));
texts.clear();
static const JsonNode configCreatures(JsonPath::builtin("CONFIG/highscoreCreatures.json"));
auto creatures = configCreatures["creatures"].Vector();
for(auto & creature : creatures) {
images.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("CPRSMALL"), (*CGI->creh)[CreatureID::decode(creature["creature"].String())]->getIconIndex(), 0, 10, 10));
}
// Header
texts.push_back(std::make_shared<CLabel>(115, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.433")));
texts.push_back(std::make_shared<CLabel>(220, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.434")));
if(highscorepage == HighScorePage::STANDARD)
{
texts.push_back(std::make_shared<CLabel>(400, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.435")));
texts.push_back(std::make_shared<CLabel>(555, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.436")));
texts.push_back(std::make_shared<CLabel>(625, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.75")));
}
else
{
texts.push_back(std::make_shared<CLabel>(410, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.672")));
texts.push_back(std::make_shared<CLabel>(590, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.75")));
}
// Content
int y = 65;
auto & data = persistentStorage["highscore"][highscorepage == HighScorePage::STANDARD ? "standard" : "campaign"];
for (int i = 0; i < 11; i++)
{
auto & curData = data[std::to_string(i)];
texts.push_back(std::make_shared<CLabel>(115, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(i)));
texts.push_back(std::make_shared<CLabel>(220, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, curData["player"].String()));
if(highscorepage == HighScorePage::STANDARD)
{
texts.push_back(std::make_shared<CLabel>(400, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, curData["land"].String()));
texts.push_back(std::make_shared<CLabel>(555, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(curData["days"].Integer())));
texts.push_back(std::make_shared<CLabel>(625, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(curData["points"].Integer())));
}
else
{
texts.push_back(std::make_shared<CLabel>(410, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, curData["campaign"].String()));
texts.push_back(std::make_shared<CLabel>(590, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(curData["points"].Integer())));
}
}
}
void CHighScoreScreen::buttonCampaginClick()
{
highscorepage = HighScorePage::CAMPAIGN;
addHighScores();
addButtons();
redraw();
}
void CHighScoreScreen::buttonStandardClick()
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
highscorepage = HighScorePage::STANDARD;
addHighScores();
addButtons();
redraw();
}
void CHighScoreScreen::buttonResetClick()
{
CInfoWindow::showYesNoDialog(
CGI->generaltexth->allTexts[666],
{},
[this]()
{
Settings entry = persistentStorage.write["highscore"];
entry->clear();
addHighScores();
addButtons();
redraw();
},
0
);
}
void CHighScoreScreen::buttonExitClick()
{
close();
}

View File

@@ -0,0 +1,37 @@
/*
* CHighScoreScreen.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
#include "../windows/CWindowObject.h"
class CButton;
class CLabel;
class CAnimImage;
class CHighScoreScreen : public CWindowObject
{
enum HighScorePage { STANDARD, CAMPAIGN };
void addButtons();
void addHighScores();
void buttonCampaginClick();
void buttonStandardClick();
void buttonResetClick();
void buttonExitClick();
HighScorePage highscorepage = HighScorePage::STANDARD;
std::shared_ptr<CPicture> background;
std::vector<std::shared_ptr<CButton>> buttons;
std::vector<std::shared_ptr<CLabel>> texts;
std::vector<std::shared_ptr<CAnimImage>> images;
public:
CHighScoreScreen();
};

View File

@@ -12,6 +12,7 @@
#include "CCampaignScreen.h" #include "CCampaignScreen.h"
#include "CreditsScreen.h" #include "CreditsScreen.h"
#include "CHighScoreScreen.h"
#include "../lobby/CBonusSelection.h" #include "../lobby/CBonusSelection.h"
#include "../lobby/CSelectionBase.h" #include "../lobby/CSelectionBase.h"
@@ -210,7 +211,7 @@ static std::function<void()> genCommand(CMenuScreen * menu, std::vector<std::str
break; break;
case 5: //highscores case 5: //highscores
{ {
return std::bind(CInfoWindow::showInfoDialog, CGI->generaltexth->translate("vcmi.mainMenu.highscoresNotImplemented"), std::vector<std::shared_ptr<CComponent>>(), PlayerColor(1)); return std::bind(CMainMenu::openHighScoreScreen);
} }
} }
} }
@@ -389,6 +390,12 @@ void CMainMenu::startTutorial()
CSH->startMapAfterConnection(mapInfo); CSH->startMapAfterConnection(mapInfo);
} }
void CMainMenu::openHighScoreScreen()
{
GH.windows().createAndPushWindow<CHighScoreScreen>();
return;
}
std::shared_ptr<CMainMenu> CMainMenu::create() std::shared_ptr<CMainMenu> CMainMenu::create()
{ {
if(!CMM) if(!CMM)

View File

@@ -152,6 +152,7 @@ public:
static void openCampaignLobby(const std::string & campaignFileName, std::string campaignSet = ""); static void openCampaignLobby(const std::string & campaignFileName, std::string campaignSet = "");
static void openCampaignLobby(std::shared_ptr<CampaignState> campaign); static void openCampaignLobby(std::shared_ptr<CampaignState> campaign);
static void startTutorial(); static void startTutorial();
static void openHighScoreScreen();
void openCampaignScreen(std::string name); void openCampaignScreen(std::string name);
static std::shared_ptr<CMainMenu> create(); static std::shared_ptr<CMainMenu> create();

View File

@@ -0,0 +1,122 @@
{
"creatures": [
{ "min" : 1, "max" : 4, "creature": "core:imp" },
{ "min" : 5, "max" : 8, "creature": "core:gremlin" },
{ "min" : 9, "max" : 12, "creature": "core:gnoll" },
{ "min" : 13, "max" : 16, "creature": "core:troglodyte" },
{ "min" : 17, "max" : 20, "creature": "core:familiar" },
{ "min" : 21, "max" : 24, "creature": "core:skeleton" },
{ "min" : 25, "max" : 28, "creature": "core:goblin" },
{ "min" : 29, "max" : 32, "creature": "core:masterGremlin" },
{ "min" : 33, "max" : 36, "creature": "core:hobgoblin" },
{ "min" : 37, "max" : 40, "creature": "core:pikeman" },
{ "min" : 41, "max" : 44, "creature": "core:infernoTroglodyte" },
{ "min" : 45, "max" : 48, "creature": "core:skeletonWarrior" },
{ "min" : 49, "max" : 52, "creature": "core:gnollMarauder" },
{ "min" : 53, "max" : 56, "creature": "core:walkingDead" },
{ "min" : 57, "max" : 60, "creature": "core:centaur" },
{ "min" : 61, "max" : 64, "creature": "core:herberdier" },
{ "min" : 65, "max" : 68, "creature": "core:archer" },
{ "min" : 69, "max" : 72, "creature": "core:lizardman" },
{ "min" : 73, "max" : 76, "creature": "core:zombie" },
{ "min" : 77, "max" : 80, "creature": "core:wolfRider" },
{ "min" : 81, "max" : 84, "creature": "core:centaurCaptian" },
{ "min" : 85, "max" : 88, "creature": "core:dwarf" },
{ "min" : 89, "max" : 92, "creature": "core:harpy" },
{ "min" : 93, "max" : 96, "creature": "core:lizardWarrior" },
{ "min" : 97, "max" : 100, "creature": "core:gog" },
{ "min" : 101, "max" : 104, "creature": "core:stoneGargoyle" },
{ "min" : 105, "max" : 108, "creature": "core:masksman" },
{ "min" : 109, "max" : 112, "creature": "core:orc" },
{ "min" : 113, "max" : 116, "creature": "core:obsidianGargoyle" },
{ "min" : 117, "max" : 120, "creature": "core:wofRaider" },
{ "min" : 121, "max" : 124, "creature": "core:battleDwarf" },
{ "min" : 125, "max" : 128, "creature": "core:elf" },
{ "min" : 129, "max" : 132, "creature": "core:harpyHag" },
{ "min" : 133, "max" : 136, "creature": "core:magog" },
{ "min" : 137, "max" : 140, "creature": "core:orcChieftain" },
{ "min" : 141, "max" : 144, "creature": "core:stoneGolem" },
{ "min" : 145, "max" : 148, "creature": "core:wight" },
{ "min" : 149, "max" : 152, "creature": "core:serpentFly" },
{ "min" : 153, "max" : 156, "creature": "core:dragonFly" },
{ "min" : 157, "max" : 160, "creature": "core:wraith" },
{ "min" : 161, "max" : 164, "creature": "core:waterElemental" },
{ "min" : 165, "max" : 168, "creature": "core:earthElemental" },
{ "min" : 169, "max" : 172, "creature": "core:grandElf" },
{ "min" : 173, "max" : 176, "creature": "core:beholder" },
{ "min" : 177, "max" : 180, "creature": "core:fireElemental" },
{ "min" : 181, "max" : 184, "creature": "core:griffin" },
{ "min" : 185, "max" : 187, "creature": "core:airElemental" },
{ "min" : 188, "max" : 190, "creature": "core:hellHound" },
{ "min" : 191, "max" : 193, "creature": "core:evilEye" },
{ "min" : 194, "max" : 196, "creature": "core:cerberus" },
{ "min" : 197, "max" : 199, "creature": "core:ironGolem" },
{ "min" : 200, "max" : 202, "creature": "core:orge" },
{ "min" : 203, "max" : 205, "creature": "core:swordman" },
{ "min" : 206, "max" : 208, "creature": "core:demon" },
{ "min" : 209, "max" : 211, "creature": "core:royalGriffin" },
{ "min" : 212, "max" : 214, "creature": "core:hornedDemon" },
{ "min" : 215, "max" : 217, "creature": "core:monk" },
{ "min" : 218, "max" : 220, "creature": "core:dendroidGuard" },
{ "min" : 221, "max" : 223, "creature": "core:medusa" },
{ "min" : 224, "max" : 226, "creature": "core:pegasus" },
{ "min" : 227, "max" : 229, "creature": "core:silverPegasus" },
{ "min" : 230, "max" : 232, "creature": "core:basilisk" },
{ "min" : 233, "max" : 235, "creature": "core:vampire" },
{ "min" : 236, "max" : 238, "creature": "core:mage" },
{ "min" : 239, "max" : 241, "creature": "core:medusaQueen" },
{ "min" : 242, "max" : 244, "creature": "core:crusider" },
{ "min" : 245, "max" : 247, "creature": "core:goldGolem" },
{ "min" : 248, "max" : 250, "creature": "core:orgeMage" },
{ "min" : 251, "max" : 253, "creature": "core:archMage" },
{ "min" : 254, "max" : 256, "creature": "core:greaterBasilisk" },
{ "min" : 257, "max" : 259, "creature": "core:zealot" },
{ "min" : 260, "max" : 262, "creature": "core:pitFiend" },
{ "min" : 263, "max" : 265, "creature": "core:diamondGolem" },
{ "min" : 266, "max" : 268, "creature": "core:vampireLord" },
{ "min" : 269, "max" : 271, "creature": "core:dendroidSolider" },
{ "min" : 272, "max" : 274, "creature": "core:minotaur" },
{ "min" : 275, "max" : 277, "creature": "core:lich" },
{ "min" : 278, "max" : 280, "creature": "core:genie" },
{ "min" : 281, "max" : 283, "creature": "core:gorgon" },
{ "min" : 284, "max" : 286, "creature": "core:masterGenie" },
{ "min" : 287, "max" : 289, "creature": "core:roc" },
{ "min" : 290, "max" : 292, "creature": "core:mightyGorgon" },
{ "min" : 293, "max" : 295, "creature": "core:minotaurKing" },
{ "min" : 296, "max" : 298, "creature": "core:powerLich" },
{ "min" : 299, "max" : 301, "creature": "core:thunderbird" },
{ "min" : 302, "max" : 304, "creature": "core:pitLord" },
{ "min" : 305, "max" : 307, "creature": "core:cyclops" },
{ "min" : 308, "max" : 310, "creature": "core:wyvern" },
{ "min" : 311, "max" : 313, "creature": "core:cyclopsKing" },
{ "min" : 314, "max" : 316, "creature": "core:wyvernMonarch" },
{ "min" : 317, "max" : 319, "creature": "core:manticore" },
{ "min" : 320, "max" : 322, "creature": "core:scorpicore" },
{ "min" : 323, "max" : 325, "creature": "core:efreeti" },
{ "min" : 326, "max" : 328, "creature": "core:unicorn" },
{ "min" : 329, "max" : 331, "creature": "core:efreetSultan" },
{ "min" : 332, "max" : 334, "creature": "core:cavalier" },
{ "min" : 335, "max" : 337, "creature": "core:naga" },
{ "min" : 338, "max" : 340, "creature": "core:warUnicorn" },
{ "min" : 341, "max" : 343, "creature": "core:blackKnight" },
{ "min" : 344, "max" : 346, "creature": "core:champion" },
{ "min" : 347, "max" : 349, "creature": "core:dreadKnight" },
{ "min" : 350, "max" : 352, "creature": "core:nagaQueen" },
{ "min" : 353, "max" : 355, "creature": "core:behemoth" },
{ "min" : 356, "max" : 358, "creature": "core:boneDragon" },
{ "min" : 359, "max" : 361, "creature": "core:giant" },
{ "min" : 362, "max" : 364, "creature": "core:hydra" },
{ "min" : 365, "max" : 367, "creature": "core:ghostDragon" },
{ "min" : 368, "max" : 370, "creature": "core:redDragon" },
{ "min" : 371, "max" : 373, "creature": "core:greenDragon" },
{ "min" : 374, "max" : 376, "creature": "core:angle" },
{ "min" : 377, "max" : 379, "creature": "core:devil" },
{ "min" : 380, "max" : 382, "creature": "core:chaosHydra" },
{ "min" : 383, "max" : 385, "creature": "core:ancientBehemoth" },
{ "min" : 386, "max" : 388, "creature": "core:archDevil" },
{ "min" : 389, "max" : 391, "creature": "core:titan" },
{ "min" : 392, "max" : 394, "creature": "core:goldDragon" },
{ "min" : 395, "max" : 397, "creature": "core:blackDragon" },
{ "min" : 398, "max" : 400, "creature": "core:archAngle " }
]
}

View File

@@ -204,8 +204,8 @@ class HeroTypeID : public Identifier<HeroTypeID>
public: public:
using Identifier<HeroTypeID>::Identifier; using Identifier<HeroTypeID>::Identifier;
///json serialization helpers ///json serialization helpers
static si32 decode(const std::string & identifier); DLL_LINKAGE static si32 decode(const std::string & identifier);
static std::string encode(const si32 index); DLL_LINKAGE static std::string encode(const si32 index);
static std::string entityType(); static std::string entityType();
DLL_LINKAGE static const HeroTypeID NONE; DLL_LINKAGE static const HeroTypeID NONE;
@@ -248,8 +248,8 @@ public:
std::string toString() const; std::string toString() const;
static si32 decode(const std::string& identifier); DLL_LINKAGE static si32 decode(const std::string& identifier);
static std::string encode(const si32 index); DLL_LINKAGE static std::string encode(const si32 index);
static std::string entityType(); static std::string entityType();
}; };
@@ -333,8 +333,8 @@ public:
static const FactionID CONFLUX; static const FactionID CONFLUX;
static const FactionID NEUTRAL; static const FactionID NEUTRAL;
static si32 decode(const std::string& identifier); DLL_LINKAGE static si32 decode(const std::string& identifier);
static std::string encode(const si32 index); DLL_LINKAGE static std::string encode(const si32 index);
static std::string entityType(); static std::string entityType();
}; };
@@ -603,8 +603,8 @@ public:
static_assert (AFTER_LAST == BACKPACK_START, "incorrect number of artifact slots"); static_assert (AFTER_LAST == BACKPACK_START, "incorrect number of artifact slots");
static si32 decode(const std::string & identifier); DLL_LINKAGE static si32 decode(const std::string & identifier);
static std::string encode(const si32 index); DLL_LINKAGE static std::string encode(const si32 index);
}; };
class ArtifactPosition : public IdentifierWithEnum<ArtifactPosition, ArtifactPositionBase> class ArtifactPosition : public IdentifierWithEnum<ArtifactPosition, ArtifactPositionBase>
@@ -643,8 +643,8 @@ public:
using IdentifierWithEnum<ArtifactID, ArtifactIDBase>::IdentifierWithEnum; using IdentifierWithEnum<ArtifactID, ArtifactIDBase>::IdentifierWithEnum;
///json serialization helpers ///json serialization helpers
static si32 decode(const std::string & identifier); DLL_LINKAGE static si32 decode(const std::string & identifier);
static std::string encode(const si32 index); DLL_LINKAGE static std::string encode(const si32 index);
static std::string entityType(); static std::string entityType();
}; };
@@ -683,8 +683,8 @@ public:
using IdentifierWithEnum<CreatureID, CreatureIDBase>::IdentifierWithEnum; using IdentifierWithEnum<CreatureID, CreatureIDBase>::IdentifierWithEnum;
///json serialization helpers ///json serialization helpers
static si32 decode(const std::string & identifier); DLL_LINKAGE static si32 decode(const std::string & identifier);
static std::string encode(const si32 index); DLL_LINKAGE static std::string encode(const si32 index);
static std::string entityType(); static std::string entityType();
}; };
@@ -801,8 +801,8 @@ public:
using IdentifierWithEnum<SpellID, SpellIDBase>::IdentifierWithEnum; using IdentifierWithEnum<SpellID, SpellIDBase>::IdentifierWithEnum;
///json serialization helpers ///json serialization helpers
static si32 decode(const std::string & identifier); DLL_LINKAGE static si32 decode(const std::string & identifier);
static std::string encode(const si32 index); DLL_LINKAGE static std::string encode(const si32 index);
static std::string entityType(); static std::string entityType();
}; };
@@ -855,8 +855,8 @@ class TerrainId : public IdentifierWithEnum<TerrainId, TerrainIdBase>
public: public:
using IdentifierWithEnum<TerrainId, TerrainIdBase>::IdentifierWithEnum; using IdentifierWithEnum<TerrainId, TerrainIdBase>::IdentifierWithEnum;
static si32 decode(const std::string & identifier); DLL_LINKAGE static si32 decode(const std::string & identifier);
static std::string encode(const si32 index); DLL_LINKAGE static std::string encode(const si32 index);
static std::string entityType(); static std::string entityType();
}; };