diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f9cb954 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +# do not export git related things +.gitattributes export-ignore +.gitignore export-ignore +.mailmap export-ignore + +# formatting +astyle_flare.sh export-ignore + +# related to coding and testing +.travis.yml export-ignore +qt.xml export-ignore + +# do not export the language recreation script +mods/default/languages/regenerate_po.sh export-ignore +mods/default/languages/xgettext.py export-ignore + +# regenerating the wiki pages +extract_xml.sh export-ignore +wiki.xslt export-ignore +regenerate_wiki_attributepage.sh export-ignore + +# the script to generate tar balls +distribution/create_release_tarball.sh export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c3b7e58 --- /dev/null +++ b/.gitignore @@ -0,0 +1,62 @@ +/flare +/flare.exe +/CMakeFiles/ +/CMakeCache.txt +/Makefile +/cmake_install.cmake +/install_manifest.txt +/build/ +/build-debug/ +/build-release/ +/config/ +/saves/ +# ignore also vim swap files +.*.sw* +/flare.desktop +gmon.out + +# ignore copy-on-write backup files +*~ + +# a copy of the CMakeLists.txt generated by QtCreator: +/CMakeLists.txt.user +/Flare.cbp + +# performance and benchmarking items +/perf.data + +# from astyle: +*.orig + +# from regenerate_wiki_attributepage.sh +/Attribute-Reference.md + +# android stuff +/flare-android-project/.gradle +/flare-android-project/.idea +/flare-android-project/build +/flare-android-project/app/build +/flare-android-project/app/release +/flare-android-project/app/app.iml +/flare-android-project/local.properties +/flare-android-project/app/src/main/libs +/flare-android-project/app/src/main/obj +/flare-android-project/app/src/main/jni/SDL2 +/flare-android-project/app/src/main/jni/SDL2_image +/flare-android-project/app/src/main/jni/SDL2_mixer +/flare-android-project/app/src/main/jni/SDL2_ttf + +# os x +.DS_Store + +# qt creator +*.autosave + +# emscripten output +emscripten/ +a.out.js +a.out.wasm + +# visual studio and its cmake +.vs/ +CMakeSettings.json diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..25ef94b --- /dev/null +++ b/.mailmap @@ -0,0 +1,23 @@ +# Proper Name Commit Name +Clint Bellanger clintbellanger +Clint Bellanger unknown +Clint Bellanger unknown +Thane Brimhall Thane Brimhall +Thane Brimhall Thane Brimhall +Thane Brimhall Thane Brimhall +Justin Jacobs Justin Jacobs +Matthew Krohn makrohn +Stefan Beller stefanbeller +Stefan Beller +Stefan Beller +Igor Paliychuk igor +Igor Paliychuk igor Paliychuk +Chris Oelmueller Chris Oelmueller +Manuel A. Fernandez Montecelo Manuel A. Fernandez Montecelo +Adrián Chaves Fernández (Gallaecio) Adrian Chavez Fernandez (Gallaecio) +Adrián Chaves Fernández (Gallaecio) Adrian Chaves Fernandez +Henrik Andersson Henrik Andersson +Christoph J. Thompson Christoph +blazindragon DRAGON +Morel Bérenger bmorel + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..1b83369 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +language: cpp +compiler: + - gcc + - clang +before_install: + # - yes | sudo add-apt-repository ppa:zoogie/sdl2-snapshots + - sudo apt-get clean -qq + - sudo apt-get update -qq + - sudo apt-get install -qq libegl1-mesa-dev libgles2-mesa-dev libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev cppcheck +script: cmake . && make +after_script: cppcheck --quiet --verbose --enable=all `git ls-files src/\*.cpp` +notifications: + irc: + channels: + - "irc.freenode.org#flarerpg" + on_success: always + on_failure: always + use_notice: true + skip_join: true + template: + - "%{repository} (%{commit}) : %{message} %{build_url}" diff --git a/CMakeLists.txt b/CMakeLists.txt index 81e948b..c12a624 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,35 +2,53 @@ cmake_minimum_required (VERSION 2.6) Set (PACKAGE "FLARE") -Set (VERSION "1.09.01") +Set (VERSION "1.11") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") +# can't use add_compile_options here. Seems to have something to do with add_compile_options appending it after the "-O3 -DNDEBUG" flags +if (MINGW AND CMAKE_BUILD_TYPE STREQUAL "Release") + set(CMAKE_CXX_FLAGS_RELEASE "-Wl,-subsystem,windows ${CMAKE_CXX_FLAGS_RELEASE}") +endif() + # Default definitions -if (NOT MSVC) - set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wunused -Wshadow -Woverloaded-virtual -Wunreachable-code -Wconversion -Wno-sign-conversion -Wformat-security ${CMAKE_CXX_FLAGS}") - set(CMAKE_CXX_FLAGS "-fno-math-errno -fno-exceptions ${CMAKE_CXX_FLAGS}") - set(CMAKE_CXX_FLAGS "-std=c++98 ${CMAKE_CXX_FLAGS}") -else (NOT MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) - add_definitions(-D_CRT_SECURE_NO_DEPRECATE) - add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) -endif (NOT MSVC) - -if(CMAKE_BUILD_TYPE STREQUAL "Release") - set(CMAKE_CXX_FLAGS_RELEASE "-O2 -g0") - if(MINGW) - set(CMAKE_CXX_FLAGS_RELEASE "-Wl,-subsystem,windows ${CMAKE_CXX_FLAGS_RELEASE}") - endif() -elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") -elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") - set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -g0") -elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -pg") - set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-pg") - set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "-pg") - set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "-pg") +if (MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + add_definitions(-D_CRT_SECURE_NO_DEPRECATE) + add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) +else () + add_compile_options( + -Wall -Wextra -Wunused -Wshadow -Woverloaded-virtual -Wunreachable-code -Wconversion -Wno-sign-conversion -Wformat-security + -fno-math-errno -fno-exceptions + -std=c++98 + ) +endif () + +add_compile_options( + "$<$:-O2>" + "$<$:-g0>" + + "$<$:-O2>" + "$<$:-g>" + + "$<$:-Os>" + "$<$:-g0>" + + "$<$:-O0>" + "$<$:-g3>" + "$<$:-pg>" +) + +# Not supported by CMake 3.12! +# Travis uses this version so we have to stick to modifying the strings... +# add_link_options( +# "$<$:-pg>" +# ) + +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-pg ${CMAKE_EXE_LINKER_FLAGS_DEBUG}") + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "-pg ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}") + set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "-pg ${CMAKE_MODULE_LINKER_FLAGS_DEBUG}") endif() set(BINDIR "games" CACHE STRING "Directory from CMAKE_INSTALL_PREFIX where game executable will be installed.") @@ -94,32 +112,30 @@ # Sources Set (FLARE_SOURCES - ./src/BehaviorAlly.cpp - ./src/Entity.cpp ./src/Animation.cpp + ./src/AnimationMedia.cpp ./src/AnimationManager.cpp ./src/AnimationSet.cpp ./src/AStarContainer.cpp ./src/AStarNode.cpp ./src/Avatar.cpp - ./src/BehaviorStandard.cpp + ./src/Camera.cpp ./src/CampaignManager.cpp ./src/CombatText.cpp ./src/CursorManager.cpp ./src/DeviceList.cpp ./src/EffectManager.cpp - ./src/Enemy.cpp - ./src/EnemyBehavior.cpp ./src/EnemyGroupManager.cpp - ./src/EnemyManager.cpp ./src/EngineSettings.cpp + ./src/Entity.cpp + ./src/EntityBehavior.cpp + ./src/EntityManager.cpp ./src/EventManager.cpp ./src/FileParser.cpp ./src/FontEngine.cpp ./src/GameSlotPreview.cpp ./src/GameState.cpp - ./src/GameStateConfigBase.cpp - ./src/GameStateConfigDesktop.cpp + ./src/GameStateConfig.cpp ./src/GameStateCutscene.cpp ./src/GameStateTitle.cpp ./src/GameStateLoad.cpp @@ -144,16 +160,19 @@ ./src/MenuActiveEffects.cpp ./src/MenuBook.cpp ./src/MenuCharacter.cpp + ./src/MenuConfig.cpp ./src/MenuConfirm.cpp ./src/MenuDevConsole.cpp ./src/MenuEnemy.cpp ./src/MenuExit.cpp + ./src/MenuGameOver.cpp ./src/MenuHUDLog.cpp ./src/MenuInventory.cpp ./src/MenuItemStorage.cpp ./src/MenuLog.cpp ./src/MenuManager.cpp ./src/MenuMiniMap.cpp + ./src/MenuMovementType.cpp ./src/MenuNumPicker.cpp ./src/MenuPowers.cpp ./src/MenuStash.cpp @@ -173,7 +192,7 @@ ./src/SDLSoftwareRenderDevice.cpp ./src/SDLSoundManager.cpp ./src/SDLHardwareRenderDevice.cpp - ./src/SDLFontEngine.cpp + ./src/SDLFontEngine.cpp ./src/Settings.cpp ./src/SharedGameResources.cpp ./src/SharedResources.cpp @@ -192,47 +211,46 @@ ./src/Widget.cpp ./src/WidgetCheckBox.cpp ./src/WidgetButton.cpp + ./src/WidgetHorizontalList.cpp ./src/WidgetInput.cpp - ./src/WidgetLabel.cpp - ./src/WidgetListBox.cpp + ./src/WidgetLabel.cpp + ./src/WidgetListBox.cpp ./src/WidgetLog.cpp ./src/WidgetScrollBar.cpp ./src/WidgetScrollBox.cpp ./src/WidgetSlider.cpp ./src/WidgetSlot.cpp - ./src/WidgetTabControl.cpp + ./src/WidgetTabControl.cpp ./src/WidgetTooltip.cpp ./src/main.cpp ) Set (FLARE_HEADERS - ./src/BehaviorAlly.h - ./src/Entity.h ./src/Animation.h + ./src/AnimationMedia.h ./src/AnimationManager.h ./src/AnimationSet.h ./src/AStarContainer.h ./src/AStarNode.h ./src/Avatar.h - ./src/BehaviorStandard.h + ./src/Camera.h ./src/CampaignManager.h ./src/CombatText.h ./src/CommonIncludes.h ./src/CursorManager.h ./src/DeviceList.h ./src/EffectManager.h - ./src/Enemy.h - ./src/EnemyBehavior.h ./src/EnemyGroupManager.h - ./src/EnemyManager.h ./src/EngineSettings.h + ./src/Entity.h + ./src/EntityBehavior.h + ./src/EntityManager.h ./src/EventManager.h ./src/FileParser.h ./src/FontEngine.h ./src/GameSlotPreview.h ./src/GameState.h - ./src/GameStateConfigBase.h - ./src/GameStateConfigDesktop.h + ./src/GameStateConfig.h ./src/GameStateCutscene.h ./src/GameStateTitle.h ./src/GameStateLoad.h @@ -257,16 +275,19 @@ ./src/MenuActiveEffects.h ./src/MenuBook.h ./src/MenuCharacter.h + ./src/MenuConfig.h ./src/MenuConfirm.h ./src/MenuDevConsole.h ./src/MenuEnemy.h ./src/MenuExit.h + ./src/MenuGameOver.h ./src/MenuHUDLog.h ./src/MenuInventory.h ./src/MenuItemStorage.h ./src/MenuLog.h ./src/MenuManager.h ./src/MenuMiniMap.h + ./src/MenuMovementType.h ./src/MenuNumPicker.h ./src/MenuPowers.h ./src/MenuStash.h @@ -305,31 +326,32 @@ ./src/Widget.h ./src/WidgetCheckBox.h ./src/WidgetButton.h + ./src/WidgetHorizontalList.h ./src/WidgetInput.h - ./src/WidgetLabel.h - ./src/WidgetListBox.h + ./src/WidgetLabel.h + ./src/WidgetListBox.h ./src/WidgetLog.h ./src/WidgetScrollBar.h ./src/WidgetScrollBox.h ./src/WidgetSlider.h ./src/WidgetSlot.h - ./src/WidgetTabControl.h + ./src/WidgetTabControl.h ./src/WidgetTooltip.h ) # Add icon and file info to executable for Windows systems IF (WIN32) - SET(FLARE_SOURCES - ${FLARE_SOURCES} - ./src/Flare.rc - ) + SET(FLARE_SOURCES + ${FLARE_SOURCES} + ./src/Flare.rc + ) ENDIF (WIN32) Add_Executable (flare ${FLARE_SOURCES} ${FLARE_HEADERS}) # libSDLMain comes with libSDL if needed on certain platforms If (NOT SDL2MAIN_LIBRARY) - Set (SDL2MAIN_LIBRARY "") + Set (SDL2MAIN_LIBRARY "") EndIf (NOT SDL2MAIN_LIBRARY) Target_Link_Libraries (flare ${CMAKE_LD_FLAGS} ${SDL2_LIBRARY} ${SDL2IMAGE_LIBRARY} ${SDL2MIXER_LIBRARY} ${SDL2TTF_LIBRARY} ${SDL2MAIN_LIBRARY}) @@ -337,19 +359,19 @@ # installing to the proper places install(PROGRAMS - ${CMAKE_CURRENT_BINARY_DIR}/flare - DESTINATION ${BINDIR}) + ${CMAKE_CURRENT_BINARY_DIR}/flare + DESTINATION ${BINDIR}) install(DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}/mods" - DESTINATION ${DATADIR}) + "${CMAKE_CURRENT_SOURCE_DIR}/mods" + DESTINATION ${DATADIR}) install(FILES - "${CMAKE_CURRENT_SOURCE_DIR}/distribution/flare.man" - DESTINATION ${MANDIR}/man6 - RENAME flare.6) + "${CMAKE_CURRENT_SOURCE_DIR}/distribution/flare.man" + DESTINATION ${MANDIR}/man6 + RENAME flare.6) install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/flare.desktop" - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) + "${CMAKE_CURRENT_BINARY_DIR}/flare.desktop" + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) install(FILES - "${CMAKE_CURRENT_SOURCE_DIR}/distribution/flare_logo.svg" - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps - RENAME flare.svg) + "${CMAKE_CURRENT_SOURCE_DIR}/distribution/flare_logo.svg" + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps + RENAME flare.svg) diff --git a/CREDITS.engine.txt b/CREDITS.engine.txt index 3974016..02172cd 100644 --- a/CREDITS.engine.txt +++ b/CREDITS.engine.txt @@ -6,6 +6,7 @@ Anton Golov | http://jesyspa.blogspot.com/ Artur "Zear" Rojek blazindragon +bloodhero Bonbadil Chris Oelmueller Clint Bellanger | http://clintbellanger.net @@ -24,6 +25,7 @@ Matthew Krohn | https://github.com/makrohn Nojan Pavel Kirpichyov "Cheshire" +r-a-cristian-93 runtime-x86 Ryan Dansie | https://github.com/RyanDansie Stefan Beller | https://github.com/stefanbeller @@ -42,24 +44,26 @@ (be) Belarussian by Mikhail Karalevich (bg) Bulgarian by Emil -(ca) Catalan by Marc Tormo i Bochaca +(ca) Catalan by Marc Tormo i Bochaca and Maria Cano (cs) Czech by Nikita Vanku (Zaraka), hark34 (de) German by Thomas 'CruzR' Glamsch, Chris Oelmueller, Janet Hunt, Stefan Beller, and Wuzzy2 (el) Greek by Yannis Anthymidis, Michael Papageorgiou, and Nea Retrogamer (es) Spanish by Juan Pablo 'morris989' Tamayo, Carlos Sanchez, Diego J. Romero López, and Eric R (fi) Finnish by Timo Sievänen -(fr) French by Quentin 'acieroid' Stievenart, Bonbadil, Morgan Strauss, and Christoph J. Thompson +(fr) French by Quentin 'acieroid' Stievenart, Bonbadil, Morgan Strauss, Christoph J. Thompson, syl_, and Christophe Nemo (gd) Scottish Gaelic by GunChleoc (gl) Galacian by Adrian Chaves Fernandez (Gallaecio) +(hu) Hungarian by bzt (it) Italian by Giovanni Dalla Torre, Gianfranco Del Borrello, Stefano Peris, Andrea Ranaldi, MOB2, and Fabio Loli +(ko) Korean by bnk159hair (ja) Japanese by Paul Wortmann, sujiniku -(nb) Norwegian Bokmal by Hans Joachim Desserud +(nb) Norwegian Bokmal by Hans Joachim Desserud, Elias Nykrem (nl) Dutch by Bas Doodeman -(pl) Polish by Paweł Puszczyński +(pl) Polish by Paweł Puszczyński, Błażej Pęksyk, and Grzegorz Szymaszek (pt) Portuguese by Rui (pt_BR) Brazilian Portuguese by Vicente Monteiro -(ru) Russian by Sergey Basalaev, Evgen Pavlov, and Ademaro -(sk) Slovak by Miro Jánošík +(ru) Russian by Sergey Basalaev, Evgen Pavlov, Ademaro, and Andrey Kapitonov +(sk) Slovak by Miro Jánošík, MiroslavR (sv) Swedish by Andreas Berheim Brudin (uk) Ukrainian by Igor Paliychuk, Denis Lysenko, Микола Франчук, Sergiy Borodych (vi) Vietnamese by Nguyễn Gia Phong diff --git a/INSTALL.engine.md b/INSTALL.engine.md index a378ea1..b7a9a13 100644 --- a/INSTALL.engine.md +++ b/INSTALL.engine.md @@ -105,6 +105,36 @@ ### Windows +#### MSYS2 / MinGW + +We use [MSYS2](https://www.msys2.org/) as our official development environment on Windows. + +``` +# install the build environment with SDL2 libraries +# 32-bit +pacman -S git mingw-w64-i686-SDL2 mingw-w64-i686-SDL2_image mingw-w64-i686-SDL2_mixer mingw-w64-i686-SDL2_ttf mingw-w64-i686-cmake mingw-w64-i686-gcc mingw-w64-i686-make +# 64-bit +pacman -S git mingw-w64-x86_64-SDL2 mingw-w64-x86_64-SDL2_image mingw-w64-x86_64-SDL2_mixer mingw-w64-x86_64-SDL2_ttf mingw-w64-x86_64-cmake mingw-w64-x86_64-gcc mingw-w64-x86_64-make + +git clone https://github.com/flareteam/flare-engine.git +cd flare-engine +cmake . -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" +mingw32-make +``` + +If you want a debug build, simply replace `Release` with `Debug` as the CMake build type. + +It is highly recommended that you add `C:\msys64\mingw32\bin` (or `C:\msys64\mingw64\bin` for 64-bit) to your Windows PATH variable for running flare.exe outside of the MSYS environment. + +To obtain and use the game files, continue from the previous set of commands: + +``` +cd ../ +git clone https://github.com/flareteam/flare-game.git +cd flare-game +cp -r mods/* ../flare-engine/mods/ +``` + #### Microsoft Visual C++ If you want to build flare under Microsoft Visual C++, @@ -113,6 +143,22 @@ [dirent.h]: https://github.com/tronkko/dirent +To get SDL2 [vcpkg](https://github.com/Microsoft/vcpkg) can be used. Its an elegant solution to manage C/C++ dependencies +in a central place. + +Use Windows PowerShell or Git Bash and change to a directory where you want to store the dependencies: +```bash +#get the vcpkg code +git clone https://github.com/Microsoft/vcpkg.git +cd vcpkg +#bootstrap vcpkg +./bootstrap-vcpkg.bat +#install the dependencies (for 64bit builds, you can use x86-windows triplet instead if you want 32bit) +./vcpkg install sdl2:x64-windows sdl2-image:x64-windows sdl2-mixer:x64-windows sdl2-ttf:x64-windows +``` +After that the dependencies have been downloaded and build. You can use them in your cmake projects by adding the path of the + toolchain file to your cmake configuration command line options: `-DCMAKE_TOOLCHAIN_FILE=[vcpkg root]\scripts\buildsystems\vcpkg.cmake` + ## Install Flare system-wide @@ -143,6 +189,8 @@ ``` **Windows** plus [MinGW]: + +(Note: Due to an [issue](https://github.com/flareteam/flare-engine/issues/1723#issuecomment-511621267) with compilers that aren't VC++, it is recommended to use SDL\_image 2.0.4) ``` g++ -I C:\MinGW\include\SDL src\*.cpp -o flare.exe -lmingw32 -lSDLmain -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf diff --git a/README.engine.md b/README.engine.md index c169256..498fcb2 100644 --- a/README.engine.md +++ b/README.engine.md @@ -70,6 +70,10 @@ ### Windows %APPDATA%\flare\config config\ +### Linux (Snap) + $HOME/snap/flare-rpg/current/.config/flare/ +### Linux (Flatpak) + $HOME/.var/app/org.flarerpg.Flare/config/flare/ Here you can enable fullscreen, change the game resolution, enable mouse-move, and change keybindings. The settings files are created the first time you run Flare. @@ -85,6 +89,11 @@ ### Windows %APPDATA%\flare\userdata userdata\ +### Linux (Snap) + $HOME/snap/flare-rpg/current/.local/share/flare/ +### Linux (Flatpak) + $HOME/.var/app/org.flarerpg.Flare/data/flare/ + If permissions are correct, the game is automatically saved when you exit. In addition, there is a `mods` directory in this location, which can be used to override system-wide mods. @@ -102,3 +111,4 @@ | `--mods` | Starts the game with only these mods enabled. | `--load-slot` | Loads a save slot by numerical index. | `--load-script` | Execute's a script upon loading a saved game. The script path is mod-relative. +| `--safe-video` | Launches with the minimum video settings. diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index cc67712..72829e9 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,4 +1,216 @@ -Flare v1.10 (WIP) +Flare v1.12 (WIP) + +Engine features: + +* NPC interactions are now canceled when the player is attacked. 'combat_aborts_npc_interact' has been added to engine/misc.txt to control this setting. +* Added 'bar_fill_offset' and 'bar_fill_size' to MenuStatBar and MenuEnemy properties. +* Added support for fading out combat text. See the 'fade_duration' property in engine/combat.txt. +* Added 'save_oncutscene' property to engine/misc.txt. Saving before a cutscene was previously controlled with 'save_onload', which caused issues with cutscenes when set to false. +* Added 'save_anywhere' property to engine/misc.txt. This allows for saving via the pause menu. (m7600) +* Added display of enemies, allies, NPCs, and intermap teleport events to the minimap. +* Added support for defining the colors of tiles and entities on the minimap. +* Added 'show_on_minimap' event component. Currently, this only applies to intermap teleport events. +* Added 'show_on_minimap' property to NPCs. +* Properties that take an alignment can now be aligned to the menu frame. +* Support multiple images in animation definitions. (bloodhero) +* Expanded slot widget configuration in engine/widget_settings.txt. Quantity text color can be changed, as well as label settings for displaying hotkeys. +* Re-implemented displaying hotkeys on action bar slots. +* Support for 'item:quantity' syntax for Event properties: 'requires_item', 'requires_not_item', 'remove_item', and 'reward_item'. +* Added 'show_randomize' property to new game menu configuration. +* Added 'disable_equip_slots' property for passive powers. +* 'Block' powers can now use post_power to trigger a power when taking damage. +* Power descriptions are now displayed in action bar tooltips. This can be controlled with the 'tooltip_length' property in menus/actionbar.txt. +* A dialog box is now displayed instead of a log message when the player dies, giving the options to exit or respawn (if applicable). +* Added movement input type dialog box. It is displayed for new players to easily select between keyboard, mouse, and joystick movement. +* Added '--safe-video' command line option. For troubleshooting purposes, this feature is displayed as an option when starting after a potential crash. +* The 'categories' property has been extended to the player character. The Power property 'target_categories' can now be used for the player as a result. +* The ability to stash quest items can now be controlled with the 'no_stash' property. +* Added a button for opening the pause/configuration menu as part of the minimap. +* Added 'script' property to items. This removes the need to create a power in order to execute a script via activating an item. +* Player 'melee_range' is now configurable in engine/stats.txt. +* Added comparison tooltips for items. These can be disabled in the Interface settings. (r-a-cristian-93, Justin Jacobs) +* Added 'parallax_layers' property to Events. This functions exactly like the Map property of the same name. +* Added 'visible' and 'visible_when_locked' to powers and upgrades in power trees. +* Added 'requires_status' and 'requires_not_status' to powers and upgrades in power trees. 'visible_requires_status' and 'visible_requires_not_status' have been marked as deprecated. +* Added 'on_interact' as a possible value for Event types. Essentially the same as 'on_trigger', except the event can ONLY be activated through the hotspot. +* Support an arbitrary number of Stash tabs. Each tab has a display name and an 'is_private' flag. +* Added 'save_onstash' property to engine/misc.txt, so it is now possible to disable the automatic save when modifying stash contents. +* The player's last used Stash tab is now remembered across sessions. +* Added the ability for NPCs to join the player's party. (Igor Paliychuk) + +Engine fixes: + +* Fix memory leak of tab control in stash menu (MiroslavR) +* Fixed stat bars not having any fill when the value they were representing was non-zero. Now they will always show at least 1 pixel of the bar's fill graphics. +* Fixed a bug where the game window could be resized below the minimum size after exiting fullscreen mode. +* Removed the default resolution scaling when virtual_heights is undefined. +* Improved performance when checking map event hotspots. +* Fix Windows-style paths with backslashes not working on non-Windows systems. +* Prevent allies counting as attack targets when using mouse movement. +* Fix needing to press the 'Cancel' key twice to exit the vendor menu. +* Fix unintended key presses being registered when quitting the game via an OS keyboard shortcut. +* Fix divide-by-zero crash when using the dev HUD with a game that uses orthogonal rendering. +* Fixed a memory leak in Loot copy constructor. +* Fixed 'resist_percent' property of engine/combat.txt not working when targets had 100% resistance. +* Support attack_speed effects with a magnitude less than 100%. +* Fixed bug where dead entities could steal HP/MP. +* Fix broken parsing of engine/default_keybindings.txt. +* Fix Effect animations not being synced properly in some cases. +* Removed hard-coded restrictions on using items from the inventory. Now any item that has a power and is not equipment can be used. +* Fix crash when fonts are missing. The engine will try to fall back to the next available font for the current language. +* Background color when using sdl_hardware renderer no longer fills entire window, instead only filling the drawing surface as it should. +* Fix crash when loading a cutscene from a book event. +* Fix infinite transformation loop when dying in a transformed state that was activated by a passive power. +* Fix bug where the player wasn't returned to their normal state after dying in a transformed state. +* Prevent combat text from overlapping. +* Improved performance when handling many status effects. +* Improved performance when an entity is repeatedly unable to find a path to thier target. +* Fix bug where killing an enemy with return damage would not set defeat status or reward XP/loot. +* Fix check of item requirements when a power requires an item but doesn't consume it. +* Fix 'respec' events to no longer remove item-based powers from the action bar. +* Fix log message when gaining more than one level at once. +* Fixed excessive memory usage when using Items, ItemSets, and Powers with high-value IDs. +* Fix bug where power upgrades that didn't require power points would not automatically upgrade if other requirements were met. +* Fix infinite loop bug when a power's list of upgrades contains the base power ID. +* Fix infinite loop bug when locking power upgrades. +* The executable directory is now used when trying to find PATH_DATA on Linux. (r-a-cristian-93) +* Fix 'corpse_timeout' in engine/misc.txt being parsed incorrectly (r-a-cristian-93) +* Reworked camera speed curve to prevent graphical "wiggle" during slow movement. +* Fix missing effect description text in power tooltips when using built-in types. +* Fix static events not executing on the same frame as on_load events. +* Fix parsing bug in power trees that would save base power properties to an upgrade power. +* Fix on_load events with requires_class not working in maps/spawn.txt +* Fix timing of Effects so that the first "tick" happens immediately. +* Fix "Press button to use" prompt no showing up for some items. + +Game updates: + +* New graphics for HP and MP status bars +* Reworked art for the Cleave power +* Cleave power radius reduced to closer match its artwork +* Reduced the strength and radius of Rakk's freeze attack +* Fixed the Goblin Thief being able to steal potions from a Summoned Zombie +* Reduced the hitbox for spike traps +* Greatly reduced the damage for spike traps in the Underworld. In exchange, the traps now inflict bleeding. +* Overall reduced drop rates for alchemy items +* Added animations for immunity and ice-based slow status effects +* Redesigned the Family Crypt map and quest +* Redesigned the Torture Chambers map and quest (again) +* Mortar & Pestle can now be placed on the action bar + +Translation updates: + +* Belarusian (be) update (Zmicer Turok) +* Catalan (ca) update (Maria Cano) +* German (de) update (Wuzzy2) +* Spanish (es) update (Agustin Ferrario) +* Basque (eu) by aitzkora +* French (fr) update (leø, Christophe Nemo) +* Scottish Gaelic (gd) update (GunChleoc) +* Hungarian (hu) update (litoll) +* Korean (ko) by Kor_OfenTHource (team members: bnk159hair, kangdonghun1230, HunSeongPark and paparad0x) +* Norwegian (nb) update (Elias Nykrem) +* Polish (pl) update (Błażej Pęksyk, Grzegorz Szymaszek) +* Portuguese (pt) update (Rui) +* Russian (ru) update (Igor Polyakov) +* Slovak (sk) update (MiroslavR) +* Ukranian (uk) update (Sergiy Borodych) +* Vietnamese (vi) update (Nguyễn Gia Phong) +* Chinese (zh) update (dumaosen, sakura09123) + + + +Flare v1.11 (http://flarerpg.org/index.php/2019/07/27/flare-1-11/) + +Engine features: + +* Players now have their own private stash in addition to the shared stash. +* Expanded the 'no_stash' Item variable to account for having multiple stashes. + +Engine fixes: + +* Fix bug where items could be dragged from the vendor window and dropped in the opposite vendor tab. +* Fix bug that caused item max_quantity to be reset when attempting to append an item definition. +* Fix bug where Powers with 'replace_by_effect' would still use properties from the parent power, such as animation state. + +Game updates: + +* Items that couldn't be stashed in the last update can now be put in the private stash. +* Salted Field: moved chest to the south end of the map to prevent easy farming. + +Translation updates: + +* Belarusian (be) update (Zmicer Turok) +* German (de) update (Wuzzy2) +* Hungarian (hu) by bzt +* Ukranian (uk) update (Igor Paliychuk) + + + +Flare v1.10 (http://flarerpg.org/index.php/2019/05/17/flare-1-10/) + +Engine features: + +* The configuration menu has been redesigned and is now used as the pause menu. +* The interface features from version 1.09 have been reverted due to being accessible from the pause menu. +* Added an Interface option to disable showing hidden entity markers. +* Support floating point values for loot drop chance values. +* Add 'hide_timeout' option to stat bar configuration to support auto-hiding. (Leszek Cimała) +* Added an Interface option to disable stat bar auto-hiding globally. +* Add 'no_stash' property to item definitions to prevent items from being placed in the stash. +* Add low HP notification system. (Leszek Cimała) +* Add ability to change the minimap zoom level by clicking on the minimap. + +Engine fixes: + +* Fixed event activation being tied to distance to the camera position. It is now correctly tied to distance from the player. +* Mouse movement and mouse aim now calculate direction relative to the player instead of relative to the screen. +* Fixed enemy AI so that enemies can now enter combat if a hero ally is in their proximity. +* Fix --data-path command line flag on Windows. +* Fixed dialog not being available if it lacked a topic. +* Fixed loot drop rate bonus having no effect when loot drop chance was too low. +* Fix bug where the wrong requirements were checked for passive powers that had been granted bonus points. +* Items that can't be stashed are now dropped on the ground upon opening the stash. +* Prevent re-binding the primary Main1 binding, which could break many interactions. +* Removed the ability to re-bind the Ctrl, Shift, Alt, and Delete keys, since they correspond to specific keyboard keys. +* Fix crash when trying to load a mod that contained 'engine/default_keybindings.txt'. (nwtour) +* Display XP stat bar value as relative to current level instead of total XP. (Leszek Cimała) +* Fix key bindings not working when switched to a non-US keyboard layout. (nwtour) +* Fix segfault when NPC filename is invalid. +* Fix inventory tooltips covering books when using no mouse. +* Fix navigation of dialog menu when using no mouse. +* Fix upgrading powers when using no mouse. +* When using the sdl_hardware renderer on Windows, OpenGL will now be used instead of Direct3D. This fixes the loss of some textures when resizing the window. +* Fixed the "level up" string to represent the ability to allocate multiple stat points. Also note if Power points can be allocated. +* Refactored 'requires_hpmp_state' for Powers to check against both stats at once. See the attribute reference for syntax changes. +* Greatly improved performance of loot tooltips. +* Fix bug where high item find chance prevented the player from finding currency. + +Game updates: + +* Fixed an oversight that allowed easy farming of the Torture Chambers boss and loot chests. +* Made it so that potions and scrolls can not be stashed. This fixes an exploit where players could utilize a low level character to get these items for cheap. +* Added new attack and interact cursors. +* Added sound effect and cursors for indicating low health. + +Translation updates: + +* Belarusian (be) update (Zmicer Turok) +* Brazilian Portuguese (pt_BR) update (Vinicius Rech) +* Catalan (ca) update (Marc Tormo i Bochaca) +* German (de) update (Fyrenic) +* Spanish (es) update (Agustin Ferrario) +* French (fr) update (syl_) +* Scottish Gaelic (gd) update (GunChleoc) +* Japanese (ja) update (sujiniku) +* Portuguese (pt) update (Rui) +* Russian (ru) update (Andrey Kapitonov, Igor Paliychuk, nwtour) +* Ukranian (uk) update (Igor Paliychuk) +* Chinese (zh) update (dumaosen, neverwin) + + + +Flare v1.09.01 (http://flarerpg.org/index.php/2018/12/12/flare-1-09-01/) Engine fixes: diff --git a/astyle_flare.sh b/astyle_flare.sh new file mode 100755 index 0000000..5431de5 --- /dev/null +++ b/astyle_flare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +astyle -S -T4 --style=java -y src/*.[cpp,h] + diff --git a/distribution/Flare.ico b/distribution/Flare.ico index 5a202ed..d627df0 100644 Binary files a/distribution/Flare.ico and b/distribution/Flare.ico differ diff --git a/distribution/create_release_tarball.sh b/distribution/create_release_tarball.sh new file mode 100755 index 0000000..6c6bd8d --- /dev/null +++ b/distribution/create_release_tarball.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# get the name from the git tag: +name=$(git describe --tags) +# go into the root of the repository +cd $(git rev-parse --show-toplevel) + +# create the tarball +filename=flare-engine-${name}.tar.gz +git archive --format=tar.gz --prefix=flare-engine-${name}/ HEAD > ${filename} + +echo "Released to $(git rev-parse --show-toplevel)/${filename}" diff --git a/distribution/emscripten_template.html b/distribution/emscripten_template.html index 7802532..70b9852 100644 --- a/distribution/emscripten_template.html +++ b/distribution/emscripten_template.html @@ -27,6 +27,9 @@ #loadingDiv { text-align: center; + font-family: monospace; + font-weight: bold; + font-size: 150%; } @@ -46,6 +49,18 @@ var e = document.getElementById('loadingDiv'); e.style.visibility = 'hidden'; }, + setStatus: function(text) { + var e = document.getElementById('loadingDiv'); + if (text.search("Downloading data...") != -1) { + var download_str = text.split("(")[1].split(")")[0]; + var download_progress = parseInt(download_str.split("/")[0]); + var download_total = parseInt(download_str.split("/")[1]); + e.innerHTML = "Downloading data... " + Math.round((download_progress / download_total) * 100) + "%"; + } + else { + e.innerHTML = text; + } + }, canvas: (function() { var canvas = document.getElementById('canvas'); return canvas; @@ -55,7 +70,7 @@ diff --git a/distribution/flare_logo_icon.png b/distribution/flare_logo_icon.png new file mode 100644 index 0000000..760fe16 Binary files /dev/null and b/distribution/flare_logo_icon.png differ diff --git a/distribution/flare_logo_icon.svg b/distribution/flare_logo_icon.svg new file mode 100644 index 0000000..b5ff79c --- /dev/null +++ b/distribution/flare_logo_icon.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/distribution/macos/create_iconset.sh b/distribution/macos/create_iconset.sh new file mode 100755 index 0000000..9fed4ab --- /dev/null +++ b/distribution/macos/create_iconset.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# requires: Inkscape + +mkdir -p "flare.iconset" +cd "flare.iconset" + +sizes=(1024 512 256 128 64 32) + +for size in ${sizes[@]}; do + /Applications/Inkscape.app/Contents/MacOS/inkscape -w ${size} -h ${size} -o "icon_${size}x${size}.png" "../../flare_logo_icon.svg" + let half=size/2 + cp "icon_${size}x${size}.png" "icon_${half}x${half}@2x.png" +done + +cd ../ +iconutil -c icns "flare.iconset" +rm -rf "flare.iconset" diff --git a/distribution/macos/flare.icns b/distribution/macos/flare.icns new file mode 100644 index 0000000..11c898a Binary files /dev/null and b/distribution/macos/flare.icns differ diff --git a/distribution/nsis_script.nsi b/distribution/nsis_script.nsi index f88e6d7..47592e5 100644 --- a/distribution/nsis_script.nsi +++ b/distribution/nsis_script.nsi @@ -76,6 +76,30 @@ !insertmacro MUI_LANGUAGE "English" ;-------------------------------- +; The "" makes the section hidden. +Section "" SecUninstallPrevious + + Call UninstallPrevious + +SectionEnd + +Function UninstallPrevious + + ; Check for uninstaller. + ReadRegStr $R0 HKLM "SOFTWARE\Flare" "Install_Dir" + + ${If} $R0 == "" + Goto Done + ${EndIf} + + DetailPrint "Removing previous installation." + + ; Run the uninstaller silently. + ExecWait '"$R0\uninstall.exe /S"' + + Done: + +FunctionEnd ; The stuff to install Section "Flare engine" SecEngine @@ -173,6 +197,7 @@ Delete "$INSTDIR\README.engine.md" Delete "$INSTDIR\README.md" Delete "$INSTDIR\RELEASE_NOTES.txt" + Delete "$INSTDIR\LICENSE.txt" Delete "$INSTDIR\*.dll" Delete "$INSTDIR\uninstall.exe" RMDir /r "$INSTDIR\mods\" diff --git a/docs/attribute-reference.html b/docs/attribute-reference.html index cc6b6de..4d1223e 100644 --- a/docs/attribute-reference.html +++ b/docs/attribute-reference.html @@ -70,7 +70,7 @@

predefined_string, same as a string, but uses a value defined elsewhere

-

alignment, defined as: ["topleft", "top", "topright", "left", "center", "right", "bottomleft", "bottom", "bottomright"]

+

alignment, defined as: ["topleft", "top", "topright", "left", "center", "right", "bottomleft", "bottom", "bottomright", "frame_topleft", "frame_top", "frame_topright", "frame_left", "frame_center", "frame_right", "frame_bottomleft", "frame_bottom", "frame_bottomright"]

direction, defined as: ["N", "NE", "E", "SE", "S", "SW", "W", "NW", int]. If defined as an integer, the value must be between 0-7 inclusive.

@@ -78,7 +78,7 @@

label, defined as: "hidden" or int, int, ["left", "right", "center"], ["top", "center", "bottom"], string : X, Y, Justify, Vertical Align, Font style. The font style can be any style defined in engine/font_settings.txt.

-

loot, defined as: filename or ["currency", item_id], ["fixed", int], int, int : Item, Drop chance, Min quantity, Max quantity. There is a limitation when defining as part of a list(…): filenames can only be used in the first list element.

+

loot, defined as: filename or ["currency", item_id], ["fixed", float], int, int : Item, Drop chance, Min quantity, Max quantity. There is a limitation when defining as part of a list(…): filenames can only be used in the first list element.

version, defined as: a string of three numbers, separated by dots (e.g. “1.2.03”)

@@ -89,7 +89,7 @@

Description of animations in animations/

-

image | filename | Filename of sprite-sheet image.

+

image | filename, string : Filename, ID | Filename of sprite-sheet image along with an identifier string. The identifier string may be omitted if there is only a single image.

render_size | int, int : Width, Height | Width and height of animation.

@@ -111,7 +111,7 @@

animation.active_frame | [list(int), "all"] | A list of frames marked as “active”. Also, “all” can be used to mark all frames as active.

-

animation.frame | int, int, int, int, int, int, int, int : Index, Direction, X, Y, Width, Height, X offset, Y offset | A single frame of a compressed animation.

+

animation.frame | int, int, int, int, int, int, int, int, string : Index, Direction, X, Y, Width, Height, X offset, Y offset, Image ID | A single frame of a compressed animation. The image ID may be omitted, in which case the first available image will be used.


@@ -143,6 +143,8 @@

offset | int | The vertical offset for the combat text’s starting position.

+

fade_duration | duration | How long the combat text will spend fading out in ‘ms’ or ’s'.

+

CursorManager

@@ -157,6 +159,14 @@

attack | filename | Filename of an image for the cursor when attacking enemies.

+

lowhp_normal | filename | Filename of an image for the normal cursor when health is low.

+ +

lowhp_interact | filename | Filename of an image for the object interaction cursor when health is low.

+ +

lowhp_talk | filename | Filename of an image for the NPC interaction cursor when health is low.

+ +

lowhp_attack | filename | Filename of an image for the cursor when attacking enemies and health is low.

+

EnemyGroupManager

@@ -207,6 +217,12 @@

save_pos_onexit | bool | If the game gets saved on exiting, store the player’s current position instead of the map spawn position.

+

save_oncutscene | bool | Saves the game when triggering any cutscene via an Event.

+ +

save_onstash | [bool, "private", "shared"] | Saves the game when changing the contents of a stash. The default is true (i.e. save when using both stash types). Use caution with the values “private” and false, since not saving shared stashes exposes an item duplication exploit.

+ +

save_anywhere | bool | Saves the game when using a button.

+

camera_speed | float | Modifies how fast the camera moves to recenter on the player. Larger values mean a slower camera. Default value is 10.

save_buyback | bool | Saves the vendor buyback stock whenever the game is saved.

@@ -215,6 +231,8 @@

sfx_unable_to_cast | filename | Sound to play when the player lacks the MP to cast a power.

+

combat_aborts_npc_interact | bool | If true, the NPC dialog and vendor menus will be closed if the player is attacked.

+

EngineSettings: Resolution

@@ -251,11 +269,11 @@

Description of engine/combat.txt

-

absorb_percent | int, int : Minimum, Maximum | Limits the percentage of damage that can be absorbed.

- -

resist_percent | int, int : Minimum, Maximum | Limits the percentage of damage that can be resisted.

- -

block_percent | int, int : Minimum, Maximum | Limits the percentage of damage that can be blocked.

+

absorb_percent | int, int : Minimum, Maximum | Limits the percentage of damage that can be absorbed. A max value less than 100 will ensure that the target always takes at least 1 damage from non-elemental attacks.

+ +

resist_percent | int, int : Minimum, Maximum | Limits the percentage of damage that can be resisted. A max value less than 100 will ensure that the target always takes at least 1 damage from elemental attacks.

+ +

block_percent | int, int : Minimum, Maximum | Limits the percentage of damage that can be absorbed when the target is in the ‘block’ animation state. A max value less than 100 will ensure that the target always takes at least 1 damage from non-elemental attacks.

avoidance_percent | int, int : Minimum, Maximum | Limits the percentage chance that damage will be avoided.

@@ -429,10 +447,20 @@

slot.quantity_label | label | Setting for the slot quantity text.

+

slot.quantity_color | color | Text color for the slot quantity text.

+

slot.quantity_bg_color | color, int : Color, Alpha | If a slot has a quantity, a rectangle filled with this color will be placed beneath the text.

+

slot.hotkey_label | label | Setting for the slot hotkey text.

+ +

slot.hotkey_color | color | Text color for the slot hotkey text.

+ +

slot.hotkey_bg_color | color, int : Color, Alpha | If a slot has a hotkey, a rectangle filled with this color will be placed beneath the text.

+

listbox.text_margin | int, int : Left margin, Right margin | The pixel margin to leave on the left and right sides of listbox element text.

+

horizontal_list.text_width | int | The pixel width of the text area that displays the currently selected item. Default is 150 pixels;

+

EngineSettings: XP table

@@ -449,7 +477,7 @@

event.type | string | (IGNORED BY ENGINE) The “type” field, as used by Tiled and other mapping tools.

-

event.activate | ["on_trigger", "on_load", "on_leave", "on_mapexit", "on_clear", "static"] | Set the state in which the event will be activated (map events only).

+

event.activate | ["on_trigger", "on_interact", "on_load", "on_leave", "on_mapexit", "on_clear", "static"] | Set the state in which the event will be activated (map events only). on_trigger = the player is standing in the event area or the player interacts with the hotspot. on_interact = the player ineracts with the hotspot. on_mapexit = as the player leaves the map. on_leave = as the player steps outside of an event area they were previously inside of. on_load = as the player enters a map. on_clear = all of the enemies on a map have been defeated. static = constantly, every frame.

event.location | rectangle | Defines the location area for the event.

@@ -463,7 +491,7 @@

event.tooltip | string | Tooltip for event

-

event.power_path | ["hero", point] | Event power path

+

event.power_path | int, int, ["hero", point] : Source X, Source Y, Destination | Path that an event power will take.

event.power_damage | int, int : Min, Max | Range of power damage

@@ -497,9 +525,9 @@

event.requires_not_currency | int | Event requires no more than this much currency

-

event.requires_item | list(item_id) | Event requires specific item (not equipped)

- -

event.requires_not_item | list(item_id) | Event requires not having a specific item (not equipped)

+

event.requires_item | list(item_id) | Event requires specific item (not equipped). Quantity can be specified by appending “ Q” to the item_id, where Q is an integer.

+ +

event.requires_not_item | list(item_id) | Event requires not having a specific item (not equipped). Quantity can be specified by appending “ Q” to the item_id, where Q is an integer.

event.requires_class | predefined_string | Event requires this base class

@@ -511,13 +539,15 @@

event.remove_currency | int | Removes specified amount of currency from hero inventory

-

event.remove_item | list(item_id) | Removes specified item from hero inventory

+

event.remove_item | list(item_id) | Removes specified item from hero inventory. Quantity can be specified by appending “ Q” to the item_id, where Q is an integer.

event.reward_xp | int | Reward hero with specified amount of experience points.

event.reward_currency | int | Reward hero with specified amount of currency.

-

event.reward_item | item_id, int : Item, Quantity | Reward hero with y number of item x.

+

event.reward_item | (list(item_id) | Reward hero with a specified item. Quantity can be specified by appending “ Q” to the item_id, where Q is an integer. To maintain backwards compatibility, the quantity must be defined for at least the first item in the list in order to use this syntax.

+ +

event.reward_item | item_id, int : Item, Quantity | Reward hero with y number of item x. NOTE This syntax is maintained for backwards compatibility. It is recommended to use the above syntax instead.

event.reward_loot | list(loot) | Reward hero with random loot.

@@ -549,6 +579,10 @@

event.respec | ["xp", "stats", "powers"], bool : Respec mode, Ignore class defaults | Resets various aspects of the character’s progression. Resetting “xp” also resets “stats”. Resetting “stats” also resets “powers”.

+

event.show_on_minimap | bool | If true, this event will be shown on the minimap if it is the appropriate type (e.g. an intermap teleport).

+ +

event.parallax_layers | filename | Filename of a parallax layers definition to load.

+

EventManager: Random Map List

@@ -595,15 +629,577 @@
-

GameStateConfigBase

+

Cutscene

+ +

Description of cutscenes in cutscenes/

+ +

caption_margins | float, float : X margin, Y margin | Percentage-based margins for the caption text based on screen size

+ +

caption_background | color, int : Color, Alpha | Color (RGBA) of the caption area background.

+ +

vscroll_speed | float | The speed at which elements will scroll in ‘vscroll’ scenes.

+ +

menu_backgrounds | bool | This cutscene will use a random fullscreen background image, like the title screen does

+ +

music | filename | The music file that will play during this cutscene.

+ +

scene.caption | string | A caption that will be shown.

+ +

scene.image | filename, int : Filename, Scaling type | Filename of an image that will be shown. The scaling type is a value between 0-2, corresponding to none, fit height, fit screen.

+ +

scene.pause | duration | Pause before next component in ‘ms’ or ’s'. A value of ‘-1’ may be used to pause indefinitely.

+ +

scene.soundfx | filename | Filename of a sound that will be played

+ +

vscroll.text | string | A single, non-wrapping line of text.

+ +

vscroll.image | filename | Filename of an image that will be shown.

+ +

vscroll.separator | int | Places an invisible gap of a specified height between elements.

+ +
+ +

GameStateLoad

+ +

Description of menus/gameload.txt

+ +

button_new | int, int, alignment : X, Y, Alignment | Position of the “New Game” button.

+ +

button_load | int, int, alignment : X, Y, Alignment | Position of the “Load Game” button.

+ +

button_delete | int, int, alignment : X, Y, Alignment | Position of the “Delete Save” button.

+ +

button_exit | int, int, alignment : X, Y, Alignment | Position of the “Exit to Title” button.

+ +

portrait | rectangle | Position and dimensions of the portrait image.

+ +

gameslot | rectangle | Position and dimensions of the first game slot.

+ +

name | label | The label for the hero’s name. Position is relative to game slot position.

+ +

level | label | The label for the hero’s level. Position is relative to game slot position.

+ +

class | label | The label for the hero’s class. Position is relative to game slot position.

+ +

map | label | The label for the hero’s current location. Position is relative to game slot position.

+ +

slot_number | label | The label for the save slot index. Position is relative to game slot position.

+ +

loading_label | label | The label for the “Entering game world…”/“Loading saved game…” text.

+ +

sprite | point | Position for the avatar preview image in each slot

+ +

visible_slots | int | The maximum numbers of visible save slots.

+ +

text_trim_boundary | int | The position of the right-side boundary where text will be shortened with an ellipsis. Position is relative to game slot position.

+ +
+ +

GameStateNew: Layout

+ +

Description of menus/gamenew.txt

+ +

button_prev | int, int, alignment : X, Y, Alignment | Position of button to choose the previous preset hero.

+ +

button_next | int, int, alignment : X, Y, Alignment | Position of button to choose the next preset hero.

+ +

button_exit | int, int, alignment : X, Y, Alignment | Position of “Cancel” button.

+ +

button_create | int, int, alignment : X, Y, Alignment | Position of “Create” button.

+ +

button_permadeath | int, int, alignment : X, Y, Alignment | Position of checkbox for toggling permadeath.

+ +

button_randomize | int, int, alignment : X, Y, Alignment | Position of the “Randomize” button.

+ +

name_input | int, int, alignment : X, Y, Alignment | Position of the hero name textbox.

+ +

portrait_label | label | Label for the “Choose a Portrait” text.

+ +

name_label | label | Label for the “Choose a Name” text.

+ +

permadeath_label | label | Label for the “Permadeath?” text.

+ +

classlist_label | label | Label for the “Choose a Class” text.

+ +

classlist_height | int | Number of visible rows for the class list widget.

+ +

portrait | rectangle | Position and dimensions of the portrait image.

+ +

class_list | int, int, alignment : X, Y, Alignment | Position of the class list.

+ +

show_classlist | bool | Allows hiding the class list.

+ +

show_randomize | bool | Toggles the visibility of the “Randomize” button.

+ +

random_option | bool | Initially picks a random character option (aka portrait/name).

+ +

random_class | bool | Initially picks a random character class.

+ +
+ +

GameStateNew: Hero options

+ +

Description of engine/hero_options.txt

+ +

option | int, string, string, filename, string : Index, Base, Head, Portrait, Name | A default body, head, portrait, and name for a hero.

+ +
+ +

GameStatePlay: Titles

+ +

Description of engine/titles.txt

+ +

title.title | string | The displayed title.

+ +

title.level | int | Requires level.

+ +

title.power | power_id | Requires power.

+ +

title.requires_status | list(string) | Requires status.

+ +

title.requires_not_status | list(string) | Requires not status.

+ +

title.primary_stat | predefined_string, predefined_string : Primary stat, Lesser primary stat | Required primary stat(s). The lesser stat is optional.

+ +
+ +

GameStateTitle

+ +

Description of menus/gametitle.txt

+ +

logo | filename, int, int, alignment : Image file, X, Y, Alignment | Filename and position of the main logo image.

+ +

play_pos | int, int, alignment : X, Y, Alignment | Position of the “Play Game” button.

+ +

config_pos | int, int, alignment : X, Y, Alignment | Position of the “Configuration” button.

+ +

credits_pos | int, int, alignment : X, Y, Alignment | Position of the “Credits” button.

+ +

exit_pos | int, int, alignment : X, Y, Alignment | Position of the “Exit Game” button.

+ +
+ +

GameSwitcher: Default music

+ +

Description of engine/default_music.txt

+ +

music | filename | Filename of a music file to play during game states that don’t already have music.

+ +
+ +

GameSwitcher: Background images

+ +

Description of engine/menu_backgrounds.txt

+ +

background | repeatable(filename) | Filename of a background image to be added to the pool of random menu backgrounds

+ +
+ +

GameSwitcher: FPS counter

+ +

Description of menus/fps.txt

+ +

position | int, int, alignment : X, Y, Alignment | Position of the fps counter.

+ +

color | color | Color of the fps counter text.

+ +
+ +

IconManager

+ +

Description of engine/icons.txt

+ +

icon_set | repeatable(icon_id, filename) : First ID, Image file | Defines an icon graphics file to load, as well as the index of the first icon.

+ +

text_offset | point | A pixel offset from the top-left to place item quantity text on icons.

+ +
+ +

InputState: Default Keybindings

+ +

Description of engine/default_keybindings.txt. Use -1 for no binding. Keyboard values can be any of the key names listed in the SDL docs. Mouse values are in the format mouse_0. Joystick buttons are in the format joy_0. Joystick axis are in the format axis_0- or axis_0+.

+ +

default.cancel | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Cancel”.

+ +

default.accept | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Accept”.

+ +

default.up | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Up”.

+ +

default.down | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Down”.

+ +

default.left | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Left”.

+ +

default.right | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Right”.

+ +

default.bar1 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar1”.

+ +

default.bar2 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar2”.

+ +

default.bar3 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar3”.

+ +

default.bar4 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar4”.

+ +

default.bar5 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar5”.

+ +

default.bar6 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar6”.

+ +

default.bar7 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar7”.

+ +

default.bar8 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar8”.

+ +

default.bar9 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar9”.

+ +

default.bar0 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar0”.

+ +

default.main1 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Main1”.

+ +

default.main2 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Main2”.

+ +

default.character | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Character”.

+ +

default.inventory | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Inventory”.

+ +

default.powers | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Powers”.

+ +

default.log | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Log”.

+ +

default.ctrl | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Ctrl”.

+ +

default.shift | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Shift”.

+ +

default.alt | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Alt”.

+ +

default.delete | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Delete”.

+ +

default.actionbar | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Actionbar Accept”.

+ +

default.actionbar_back | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Actionbar Left”.

+ +

default.actionbar_forward | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Actionbar Right”.

+ +

default.actionbar_use | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Actionbar Use”.

+ +

default.developer_menu | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Developer Menu”.

+ +
+ +

ItemManager: Items

+ +

Description about the class and it usage, items/items.txt…

+ +

id | item_id | An uniq id of the item used as reference from other classes.

+ +

name | string | Item name displayed on long and short tooltips.

+ +

flavor | string | A description of the item.

+ +

level | int | The item’s level. Has no gameplay impact. (Deprecated?)

+ +

icon | icon_id | An id for the icon to display for this item.

+ +

book | filename | A book file to open when this item is activated.

+ +

book_is_readable | bool | If true, “read” is displayed in the tooltip instead of “use”. Defaults to true.

+ +

quality | predefined_string | Item quality matching an id in items/qualities.txt

+ +

item_type | predefined_string | Equipment slot matching an id in items/types.txt

+ +

equip_flags | list(predefined_string) | A comma separated list of flags to set when this item is equipped. See engine/equip_flags.txt.

+ +

dmg | predefined_string, int, int : Damage type, Min, Max | Defines the item’s base damage type and range. Max may be ommitted and will default to Min.

+ +

abs | int, int : Min, Max | Defines the item absorb value, if only min is specified the absorb value is fixed.

+ +

requires_level | int | The hero’s level must match or exceed this value in order to equip this item.

+ +

requires_stat | repeatable(predefined_string, int) : Primary stat name, Value | Make item require specific stat level ex. requires_stat=physical,6 will require hero to have level 6 in physical stats

+ +

requires_class | predefined_string | The hero’s base class (engine/classes.txt) must match for this item to be equipped.

+ +

bonus | repeatable(predefined_string, int) : Stat name, Value | Adds a bonus to the item by stat name, example bonus=hp, 50

+ +

bonus_power_level | repeatable(power_id, int) : Base power, Bonus levels | Grants bonus levels to a given base power.

+ +

soundfx | filename | Sound effect filename to play for the specific item.

+ +

gfx | filename | Filename of an animation set to display when the item is equipped.

+ +

loot_animation | repeatable(filename, int, int) : Loot image, Min quantity, Max quantity | Specifies the loot animation file for the item. The max quantity, or both quantity values, may be omitted.

+ +

power | power_id | Adds a specific power to the item which makes it usable as a power and can be placed in action bar.

+ +

replace_power | repeatable(int, int) : Old power, New power | Replaces the old power id with the new power id in the action bar when equipped.

+ +

power_desc | string | A string describing the additional power.

+ +

price | int | The amount of currency the item costs, if set to 0 the item cannot be sold.

+ +

price_per_level | int | Additional price for each player level above 1

+ +

price_sell | int | The amount of currency the item is sold for, if set to 0 the sell prices is prices*vendor_ratio.

+ +

max_quantity | int | Max item count per stack.

+ +

pickup_status | string | Set a campaign status when item is picked up, this is used for quest items.

+ +

stepfx | predefined_string | Sound effect when walking, this applies only to armors.

+ +

disable_slots | list(predefined_string) | A comma separated list of equip slot types to disable when this item is equipped.

+ +

quest_item | bool | If true, this item is a quest item and can not be dropped or sold. The item also can’t be stashed, unless the no_stash property is set to something other than “all”.

+ +

no_stash | ["ignore", "private", "shared", "all"] | If not set to ‘ignore’, this item will not be able to be put in the corresponding stash.

+ +

item.script | filename | Loads and executes a script file when the item is activated from the player’s inventory.

+ +
+ +

ItemManager: Types

+ +

Definition of a item types, items/types.txt…

+ +

type.id | string | Item type identifier.

+ +

type.name | string | Item type name.

+ +
+ +

ItemManager: Qualities

+ +

Definition of a item qualities, items/types.txt…

+ +

quality.id | string | Item quality identifier.

+ +

quality.name | string | Item quality name.

+ +

quality.color | color | Item quality color.

+ +

quality.overlay_icon | icon_id | The icon to be used as an overlay.

+ +
+ +

ItemManager: Sets

+ +

Definition of a item sets, items/sets.txt…

+ +

id | int | A uniq id for the item set.

+ +

name | string | Name of the item set.

+ +

items | list(item_id) | List of item id’s that is part of the set.

+ +

color | color | A specific of color for the set.

+ +

bonus | repeatable(int, string, int) : Required set item count, Stat name, Value | Bonus to append to items in the set.

+ +

bonus_power_level | repeatable(int, power_id, int) : Required set item count, Base power, Bonus levels | Grants bonus levels to a given base power.

+ +
+ +

Map

+ +

Description of maps/

+ +

title | string | Title of map

+ +

width | int | Width of map

+ +

height | int | Height of map

+ +

tileset | filename | Filename of a tileset definition to use for map

+ +

music | filename | Filename of background music to use for map

+ +

hero_pos | point | The player will spawn in this location if no point was previously given.

+ +

parallax_layers | filename | Filename of a parallax layers definition.

+ +

background_color | color, int : Color, alpha | Background color for the map.

+ +

tilewidth | int | Inherited from Tiled map file. Unused by engine.

+ +

tileheight | int | Inherited from Tiled map file. Unused by engine.

+ +

layer.type | string | Map layer type.

+ +

layer.format | string | Format for map layer, must be ‘dec’

+ +

layer.data | raw | Raw map layer data

+ +

enemygroup.type | string | (IGNORED BY ENGINE) The “type” field, as used by Tiled and other mapping tools.

+ +

enemygroup.category | predefined_string | The category of enemies that will spawn in this group.

+ +

enemygroup.level | int, int : Min, Max | Defines the level range of enemies in group. If only one number is given, it’s the exact level.

+ +

enemygroup.location | rectangle | Location area for enemygroup

+ +

enemygroup.number | int, int : Min, Max | Defines the range of enemies in group. If only one number is given, it’s the exact amount.

+ +

enemygroup.chance | int | Percentage of chance

+ +

enemygroup.direction | direction | Direction that enemies will initially face.

+ +

enemygroup.waypoints | list(point) | Enemy waypoints; single enemy only; negates wander_radius

+ +

enemygroup.wander_radius | int | The radius (in tiles) that an enemy will wander around randomly; negates waypoints

+ +

enemygroup.requires_status | list(string) | Status required for loading enemies

+ +

enemygroup.requires_not_status | list(string) | Status required to be missing for loading enemies

+ +

enemygroup.invincible_requires_status | list(string) | Enemies in this group are invincible to hero attacks when these statuses are set.

+ +

enemygroup.invincible_requires_not_status | list(string) | Enemies in this group are invincible to hero attacks when these statuses are not set.

+ +

npc.type | string | (IGNORED BY ENGINE) The “type” field, as used by Tiled and other mapping tools.

+ +

npc.filename | string | Filename of an NPC definition.

+ +

npc.requires_status | list(string) | Status required for NPC load. There can be multiple states, separated by comma

+ +

npc.requires_not_status | list(string) | Status required to be missing for NPC load. There can be multiple states, separated by comma

+ +

npc.location | point | Location of NPC

+ +
+ +

MapParallax

+ +

Description of maps/parallax/

+ +

layer.image | filename | Image file to use as a scrolling background.

+ +

layer.speed | float | Speed at which the background will move relative to the camera.

+ +

layer.fixed_speed | float, float : X speed, Y speed | Speed at which the background will move independent of the camera movement.

+ +

layer.map_layer | string | The tile map layer that this parallax layer will be rendered on top of.

+ +
+ +

MenuActionBar

+ +

Description of menus/actionbar.txt

+ +

slot | repeatable(int, int, int, bool) : Index, X, Y, Locked | Index (max 10) and position for power slot. If a slot is locked, its Power can’t be changed by the player.

+ +

slot_M1 | point, bool : Position, Locked | Position for the primary action slot. If the slot is locked, its Power can’t be changed by the player.

+ +

slot_M2 | point, bool : Position Locked | Position for the secondary action slot. If the slot is locked, its Power can’t be changed by the player.

+ +

char_menu | point | Position for the Character menu button.

+ +

inv_menu | point | Position for the Inventory menu button.

+ +

powers_menu | point | Position for the Powers menu button.

+ +

log_menu | point | Position for the Log menu button.

+ +

tooltip_length | ["short", "long_menu", "long_all"] | The length of power descriptions in tooltips. ‘short’ will display only the power name. ‘long_menu’ (the default setting) will display full tooltips, but only for powers that are in the Powers menu. ‘long_all’ will display full tooltips for all powers.

+ +
+ +

MenuActiveEffects

+ +

Description of menus/activeeffects.txt

+ +

vertical | bool | True is vertical orientation; False is horizontal orientation.

+ +
+ +

MenuBook

+ +

Description of books in books/

+ +

close | point | Position of the close button.

+ +

background | filename | Filename for the background image.

+ +

image.image_pos | point | Position of the image.

+ +

image.image | filename | Filename of the image.

+ +

image_icon | icon_id | Use an icon as the image instead of a file.

+ +

image.requires_status | list(string) | Image requires these campaign statuses in order to be visible.

+ +

image.requires_not_status | list(string) | Image must not have any of these campaign statuses in order to be visible.

+ +

text.text_pos | int, int, int, ["left", "center", "right"] : X, Y, Width, Text justify | Position of the text.

+ +

text.text_font | color, string : Font color, Font style | Font color and style.

+ +

text.shadow | bool | If true, the text will have a black shadow like the text labels in various menus.

+ +

text.text | string | The text to be displayed.

+ +

text.requires_status | list(string) | Text requires these campaign statuses in order to be visible.

+ +

text.requires_not_status | list(string) | Text must not have any of these campaign statuses in order to be visible.

+ +

button.button_pos | point | Position of the button.

+ +

button.button_image | filename | Image file to use for this button. Default is the normal menu button.

+ +

button.text | string | Optional text label for the button.

+ +

book.${EVENT_COMPONENT} | Event components to execute when the button is clicked. See the definitions in EventManager for possible attributes. |

+ +

event_open.${EVENT_COMPONENT} | Event components to execute when the book is opened. See the definitions in EventManager for possible attributes. |

+ +

event_close.${EVENT_COMPONENT} | Event components to execute when the book is closed. See the definitions in EventManager for possible attributes. |

+ +
+ +

MenuCharacter

+ +

Description of menus/character.txt

+ +

close | point | Position of the close button.

+ +

label_title | label | Position of the “Character” text.

+ +

upgrade_primary | predefined_string, point : Primary stat name, Button position | Position of the button used to add a stat point to this primary stat.

+ +

statlist | point | Position of the scrollbox containing non-primary stats.

+ +

statlist_rows | int | The height of the statlist in rows.

+ +

statlist_scrollbar_offset | int | Right margin in pixels for the statlist’s scrollbar.

+ +

label_name | label | Position of the “Name” text.

+ +

label_level | label | Position of the “Level” text.

+ +

label_primary | predefined_string, label : Primary stat name, Text positioning | Position of the text label for this primary stat.

+ +

name | rectangle | Position of the player’s name and dimensions of the tooltip hotspot.

+ +

level | rectangle | Position of the player’s level and dimensions of the tooltip hotspot.

+ +

primary | predefined_string, rectangle : Primary stat name, Hotspot position | Position of this primary stat value display and dimensions of its tooltip hotspot.

+ +

unspent | label | Position of the label showing the number of unspent stat points.

+ +

show_resists | bool | Hide the elemental “Resistance” stats in the statlist if set to false.

+ +

show_stat | predefined_string, bool : Stat name / Damage type, Visible | Hide the matching stat or damage type min/max in the statlist if set to false.

+ +

name_max_width | int | The maxiumum width, in pixels, that the character name can occupy until it is abbreviated.

+ +
+ +

MenuConfig

Description of menus/config.txt

-

button_ok | int, int, alignment : X, Y, Alignment | Position of the “OK” button.

- -

button_defaults | int, int, alignment : X, Y, Alignment | Position of the “Defaults” button.

- -

button_cancel | int, int, alignment : X, Y, Alignment | Position of the “Cancel” button.

+

button_ok | int, int, alignment : X, Y, Alignment | Position of the “OK” button. Not used in the pause menu.

+ +

button_defaults | int, int, alignment : X, Y, Alignment | Position of the “Defaults” button. Not used in the pause menu.

+ +

button_cancel | int, int, alignment : X, Y, Alignment | Position of the “Cancel” button. Not used in the pause menu.

listbox_scrollbar_offset | int | Horizontal offset from the right of listboxes (mods, languages, etc) to place the scrollbar.

@@ -611,24 +1207,6 @@

tab_offset | point | Offset for the row of tabs.

-

music_volume | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Music Volume” slider relative to the frame.

- -

sound_volume | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Sound Volume” slider relative to the frame.

- -

language | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Language” list box relative to the frame.

- -

language_height | int | Number of visible rows for the “Language” list box.

- -

show_fps | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Show FPS” checkbox relative to the frame.

- -

colorblind | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Colorblind Mode” checkbox relative to the frame.

- -

hardware_cursor | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Hardware mouse cursor” checkbox relative to the frame.

- -

dev_mode | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Developer Mode” checkbox relative to the frame.

- -

subtitles | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Subtitles” checkbox relative to the frame.

-

activemods | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Active Mods” list box relative to the frame.

activemods_height | int | Number of visible rows for the “Active Mods” list box.

@@ -645,952 +1223,350 @@

inactivemods_activate | point | Position of the “Enable” button relative to the frame.

-
- -

GameStateConfigDesktop

- -

Description of menus/config.txt

- -

renderer | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Renderer” list box relative to the frame.

- -

renderer_height | int | Number of visible rows for the “Renderer” list box.

- -

fullscreen | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Full Screen Mode” checkbox relative to the frame.

- -

mouse_move | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Move hero using mouse” checkbox relative to the frame.

- -

hwsurface | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Hardware surfaces” checkbox relative to the frame.

- -

vsync | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “V-Sync” checkbox relative to the frame.

- -

texture_filter | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Texture Filtering” checkbox relative to the frame.

- -

dpi_scaling | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “DPI scaling” checkbox relative to the frame.

- -

parallax_layers | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Parallax Layers” checkbox relative to the frame.

- -

change_gamma | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Allow changing gamma” checkbox relative to the frame.

- -

gamma | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Gamma” slider relative to the frame.

- -

enable_joystick | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Use joystick” checkbox relative to the frame.

- -

joystick_device | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Joystick” list box relative to the frame.

- -

joystick_device_height | int | Number of visible rows for the “Joystick” list box.

- -

mouse_aim | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Mouse aim” checkbox relative to the frame.

- -

no_mouse | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Do not use mouse” checkbox relative to the frame.

- -

mouse_move_swap | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Swap mouse movement button” checkbox relative to the frame.

- -

mouse_move_attack | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Attack with mouse movement” checkbox relative to the frame.

- -

joystick_deadzone | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Joystick Deadzone” slider relative to the frame.

- -

secondary_offset | point | Offset of the second (and third) columns of keybinds.

- -

keybinds_bg_color | color | Background color for the keybindings scrollbox.

- -

keybinds_bg_alpha | int | Alpha value for the keybindings scrollbox background color.

-

scrollpane | rectangle | Position of the keybinding scrollbox relative to the frame.

-

scrollpane_contents | int | The vertical size of the keybinding scrollbox’s contents.

- -

cancel | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Cancel” keybind relative to the keybinding scrollbox.

- -

accept | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Accept” keybind relative to the keybinding scrollbox.

- -

up | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Up” keybind relative to the keybinding scrollbox.

- -

down | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Down” keybind relative to the keybinding scrollbox.

- -

left | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Left” keybind relative to the keybinding scrollbox.

- -

right | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Right” keybind relative to the keybinding scrollbox.

- -

bar1 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar1” keybind relative to the keybinding scrollbox.

- -

bar2 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar2” keybind relative to the keybinding scrollbox.

- -

bar3 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar3” keybind relative to the keybinding scrollbox.

- -

bar4 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar4” keybind relative to the keybinding scrollbox.

- -

bar5 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar5” keybind relative to the keybinding scrollbox.

- -

bar6 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar6” keybind relative to the keybinding scrollbox.

- -

bar7 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar7” keybind relative to the keybinding scrollbox.

- -

Bar8 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar8” keybind relative to the keybinding scrollbox.

- -

bar9 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar9” keybind relative to the keybinding scrollbox.

- -

bar0 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Bar0” keybind relative to the keybinding scrollbox.

- -

main1 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Main1” keybind relative to the keybinding scrollbox.

- -

main2 | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Main2” keybind relative to the keybinding scrollbox.

- -

character | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Character” keybind relative to the keybinding scrollbox.

- -

inventory | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Inventory” keybind relative to the keybinding scrollbox.

- -

powers | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Powers” keybind relative to the keybinding scrollbox.

- -

log | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Log” keybind relative to the keybinding scrollbox.

- -

ctrl | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Ctrl” keybind relative to the keybinding scrollbox.

- -

shift | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Shift” keybind relative to the keybinding scrollbox.

- -

alt | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Alt” keybind relative to the keybinding scrollbox.

- -

delete | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Delete” keybind relative to the keybinding scrollbox.

- -

actionbar | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “ActionBar Accept” keybind relative to the keybinding scrollbox.

- -

actionbar_back | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “ActionBar Left” keybind relative to the keybinding scrollbox.

- -

actionbar_forward | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “ActionBar Right” keybind relative to the keybinding scrollbox.

- -

actionbar_use | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “ActionBar Use” keybind relative to the keybinding scrollbox.

- -

developer_menu | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Developer Menu” keybind relative to the keybinding scrollbox.

- -
- -

Cutscene

- -

Description of cutscenes in cutscenes/

- -

caption_margins | float, float : X margin, Y margin | Percentage-based margins for the caption text based on screen size

- -

caption_background | color, int : Color, Alpha | Color (RGBA) of the caption area background.

- -

vscroll_speed | float | The speed at which elements will scroll in ‘vscroll’ scenes.

- -

menu_backgrounds | bool | This cutscene will use a random fullscreen background image, like the title screen does

- -

music | filename | The music file that will play during this cutscene.

- -

scene.caption | string | A caption that will be shown.

- -

scene.image | filename, int : Filename, Scaling type | Filename of an image that will be shown. The scaling type is a value between 0-2, corresponding to none, fit height, fit screen.

- -

scene.pause | duration | Pause before next component in ‘ms’ or ’s'. A value of ‘-1’ may be used to pause indefinitely.

- -

scene.soundfx | filename | Filename of a sound that will be played

- -

vscroll.text | string | A single, non-wrapping line of text.

- -

vscroll.image | filename | Filename of an image that will be shown.

- -

vscroll.separator | int | Places an invisible gap of a specified height between elements.

- -
- -

GameStateLoad

- -

Description of menus/gameload.txt

- -

button_new | int, int, alignment : X, Y, Alignment | Position of the “New Game” button.

- -

button_load | int, int, alignment : X, Y, Alignment | Position of the “Load Game” button.

- -

button_delete | int, int, alignment : X, Y, Alignment | Position of the “Delete Save” button.

- -

button_exit | int, int, alignment : X, Y, Alignment | Position of the “Exit to Title” button.

- -

portrait | rectangle | Position and dimensions of the portrait image.

- -

gameslot | rectangle | Position and dimensions of the first game slot.

- -

name | label | The label for the hero’s name. Position is relative to game slot position.

- -

level | label | The label for the hero’s level. Position is relative to game slot position.

- -

class | label | The label for the hero’s class. Position is relative to game slot position.

- -

map | label | The label for the hero’s current location. Position is relative to game slot position.

- -

slot_number | label | The label for the save slot index. Position is relative to game slot position.

- -

loading_label | label | The label for the “Entering game world…”/“Loading saved game…” text.

- -

sprite | point | Position for the avatar preview image in each slot

- -

visible_slots | int | The maximum numbers of visible save slots.

- -

text_trim_boundary | int | The position of the right-side boundary where text will be shortened with an ellipsis. Position is relative to game slot position.

- -
- -

GameStateNew: Layout

- -

Description of menus/gamenew.txt

- -

button_prev | int, int, alignment : X, Y, Alignment | Position of button to choose the previous preset hero.

- -

button_next | int, int, alignment : X, Y, Alignment | Position of button to choose the next preset hero.

- -

button_exit | int, int, alignment : X, Y, Alignment | Position of “Cancel” button.

- -

button_create | int, int, alignment : X, Y, Alignment | Position of “Create” button.

- -

button_permadeath | int, int, alignment : X, Y, Alignment | Position of checkbox for toggling permadeath.

- -

bytton_randomize | int, int, alignment : X, Y, Alignment | Position of the “Randomize” button.

- -

name_input | int, int, alignment : X, Y, Alignment | Position of the hero name textbox.

- -

portrait_label | label | Label for the “Choose a Portrait” text.

- -

name_label | label | Label for the “Choose a Name” text.

- -

permadeath_label | label | Label for the “Permadeath?” text.

- -

classlist_label | label | Label for the “Choose a Class” text.

- -

classlist_height | int | Number of visible rows for the class list widget.

- -

portrait | rectangle | Position and dimensions of the portrait image.

- -

class_list | int, int, alignment : X, Y, Alignment | Position of the class list.

- -

show_classlist | bool | Allows hiding the class list.

- -

random_option | bool | Initially picks a random character option (aka portrait/name).

- -

random_class | bool | Initially picks a random character class.

- -
- -

GameStateNew: Hero options

- -

Description of engine/hero_options.txt

- -

option | int, string, string, filename, string : Index, Base, Head, Portrait, Name | A default body, head, portrait, and name for a hero.

- -
- -

GameStatePlay: Titles

- -

Description of engine/titles.txt

- -

title.title | string | The displayed title.

- -

title.level | int | Requires level.

- -

title.power | power_id | Requires power.

- -

title.requires_status | list(string) | Requires status.

- -

title.requires_not_status | list(string) | Requires not status.

- -

title.primary_stat | predefined_string, predefined_string : Primary stat, Lesser primary stat | Required primary stat(s). The lesser stat is optional.

- -
- -

GameStateTitle

- -

Description of menus/gametitle.txt

- -

logo | filename, int, int, alignment : Image file, X, Y, Alignment | Filename and position of the main logo image.

- -

play_pos | int, int, alignment : X, Y, Alignment | Position of the “Play Game” button.

- -

config_pos | int, int, alignment : X, Y, Alignment | Position of the “Configuration” button.

- -

credits_pos | int, int, alignment : X, Y, Alignment | Position of the “Credits” button.

- -

exit_pos | int, int, alignment : X, Y, Alignment | Position of the “Exit Game” button.

- -
- -

GameSwitcher: Default music

- -

Description of engine/default_music.txt

- -

music | filename | Filename of a music file to play during game states that don’t already have music.

- -
- -

GameSwitcher: Background images

- -

Description of engine/menu_backgrounds.txt

- -

background | repeatable(filename) | Filename of a background image to be added to the pool of random menu backgrounds

- -
- -

GameSwitcher: FPS counter

- -

Description of menus/fps.txt

- -

position | int, int, alignment : X, Y, Alignment | Position of the fps counter.

- -

color | color | Color of the fps counter text.

- -
- -

IconManager

- -

Description of engine/icons.txt

- -

icon_set | repeatable(icon_id, filename) : First ID, Image file | Defines an icon graphics file to load, as well as the index of the first icon.

- -

text_offset | point | A pixel offset from the top-left to place item quantity text on icons.

- -
- -

InputState: Default Keybindings

- -

Description of engine/default_keybindings.txt. Use -1 for no binding. Keyboard values can be any of the key names listed in the SDL docs. Mouse values are in the format mouse_0. Joystick buttons are in the format joy_0. Joystick axis are in the format axis_0- or axis_0+.

- -

default.cancel | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Cancel”.

- -

default.accept | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Accept”.

- -

default.up | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Up”.

- -

default.down | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Down”.

- -

default.left | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Left”.

- -

default.right | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Right”.

- -

default.bar1 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar1”.

- -

default.bar2 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar2”.

- -

default.bar3 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar3”.

- -

default.bar4 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar4”.

- -

default.bar5 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar5”.

- -

default.bar6 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar6”.

- -

default.bar7 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar7”.

- -

default.bar8 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar8”.

- -

default.bar9 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar9”.

- -

default.bar0 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Bar0”.

- -

default.main1 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Main1”.

- -

default.main2 | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Main2”.

- -

default.character | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Character”.

- -

default.inventory | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Inventory”.

- -

default.powers | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Powers”.

- -

default.log | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Log”.

- -

default.ctrl | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Ctrl”.

- -

default.shift | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Shift”.

- -

default.alt | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Alt”.

- -

default.delete | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Delete”.

- -

default.actionbar | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Actionbar Accept”.

- -

default.actionbar_back | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Actionbar Left”.

- -

default.actionbar_forward | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Actionbar Right”.

- -

default.actionbar_use | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Actionbar Use”.

- -

default.developer_menu | string, string, string : Keyboard/mouse 1, Keyboard/mouse 2, Joystick | Bindings for “Developer Menu”.

- -
- -

ItemManager: Items

- -

Description about the class and it usage, items/items.txt…

- -

id | item_id | An uniq id of the item used as reference from other classes.

- -

name | string | Item name displayed on long and short tooltips.

- -

flavor | string | A description of the item.

- -

level | int | The item’s level. Has no gameplay impact. (Deprecated?)

- -

icon | icon_id | An id for the icon to display for this item.

- -

book | filename | A book file to open when this item is activated.

- -

book_is_readable | bool | If true, “read” is displayed in the tooltip instead of “use”. Defaults to true.

- -

quality | predefined_string | Item quality matching an id in items/qualities.txt

- -

item_type | predefined_string | Equipment slot matching an id in items/types.txt

- -

equip_flags | list(predefined_string) | A comma separated list of flags to set when this item is equipped. See engine/equip_flags.txt.

- -

dmg | predefined_string, int, int : Damage type, Min, Max | Defines the item’s base damage type and range. Max may be ommitted and will default to Min.

- -

abs | int, int : Min, Max | Defines the item absorb value, if only min is specified the absorb value is fixed.

- -

requires_level | int | The hero’s level must match or exceed this value in order to equip this item.

- -

requires_stat | repeatable(predefined_string, int) : Primary stat name, Value | Make item require specific stat level ex. requires_stat=physical,6 will require hero to have level 6 in physical stats

- -

requires_class | predefined_string | The hero’s base class (engine/classes.txt) must match for this item to be equipped.

- -

bonus | repeatable(predefined_string, int) : Stat name, Value | Adds a bonus to the item by stat name, example bonus=hp, 50

- -

bonus_power_level | repeatable(power_id, int) : Base power, Bonus levels | Grants bonus levels to a given base power.

- -

soundfx | filename | Sound effect filename to play for the specific item.

- -

gfx | filename | Filename of an animation set to display when the item is equipped.

- -

loot_animation | repeatable(filename, int, int) : Loot image, Min quantity, Max quantity | Specifies the loot animation file for the item. The max quantity, or both quantity values, may be omitted.

- -

power | power_id | Adds a specific power to the item which makes it usable as a power and can be placed in action bar.

- -

replace_power | repeatable(int, int) : Old power, New power | Replaces the old power id with the new power id in the action bar when equipped.

- -

power_desc | string | A string describing the additional power.

- -

price | int | The amount of currency the item costs, if set to 0 the item cannot be sold.

- -

price_per_level | int | Additional price for each player level above 1

- -

price_sell | int | The amount of currency the item is sold for, if set to 0 the sell prices is prices*vendor_ratio.

- -

max_quantity | int | Max item count per stack.

- -

pickup_status | string | Set a campaign status when item is picked up, this is used for quest items.

- -

stepfx | predefined_string | Sound effect when walking, this applies only to armors.

- -

disable_slots | list(predefined_string) | A comma separated list of equip slot types to disable when this item is equipped.

- -

quest_item | bool | If true, this item is a quest item and can not be dropped, stashed, or sold.

- -
- -

ItemManager: Types

- -

Definition of a item types, items/types.txt…

- -

type.id | string | Item type identifier.

- -

type.name | string | Item type name.

- -
- -

ItemManager: Qualities

- -

Definition of a item qualities, items/types.txt…

- -

quality.id | string | Item quality identifier.

- -

quality.name | string | Item quality name.

- -

quality.color | color | Item quality color.

- -

quality.overlay_icon | icon_id | The icon to be used as an overlay.

- -
- -

ItemManager: Sets

- -

Definition of a item sets, items/sets.txt…

- -

id | int | A uniq id for the item set.

- -

name | string | Name of the item set.

- -

items | list(item_id) | List of item id’s that is part of the set.

- -

color | color | A specific of color for the set.

- -

bonus | repeatable(int, string, int) : Required set item count, Stat name, Value | Bonus to append to items in the set.

- -

bonus_power_level | repeatable(int, power_id, int) : Required set item count, Base power, Bonus levels | Grants bonus levels to a given base power.

- -
- -

Map

- -

Description of maps/

- -

title | string | Title of map

- -

width | int | Width of map

- -

height | int | Height of map

- -

tileset | filename | Filename of a tileset definition to use for map

- -

music | filename | Filename of background music to use for map

- -

hero_pos | point | The player will spawn in this location if no point was previously given.

- -

parallax_layers | filename | Filename of a parallax layers definition.

- -

background_color | color, int : Color, alpha | Background color for the map.

- -

tilewidth | int | Inherited from Tiled map file. Unused by engine.

- -

tileheight | int | Inherited from Tiled map file. Unused by engine.

- -

layer.type | string | Map layer type.

- -

layer.format | string | Format for map layer, must be ‘dec’

- -

layer.data | raw | Raw map layer data

- -

enemygroup.type | string | (IGNORED BY ENGINE) The “type” field, as used by Tiled and other mapping tools.

- -

enemygroup.category | predefined_string | The category of enemies that will spawn in this group.

- -

enemygroup.level | int, int : Min, Max | Defines the level range of enemies in group. If only one number is given, it’s the exact level.

- -

enemygroup.location | rectangle | Location area for enemygroup

- -

enemygroup.number | int, int : Min, Max | Defines the range of enemies in group. If only one number is given, it’s the exact amount.

- -

enemygroup.chance | int | Percentage of chance

- -

enemygroup.direction | direction | Direction that enemies will initially face.

- -

enemygroup.waypoints | list(point) | Enemy waypoints; single enemy only; negates wander_radius

- -

enemygroup.wander_radius | int | The radius (in tiles) that an enemy will wander around randomly; negates waypoints

- -

enemygroup.requires_status | list(string) | Status required for loading enemies

- -

enemygroup.requires_not_status | list(string) | Status required to be missing for loading enemies

- -

enemygroup.invincible_requires_status | list(string) | Enemies in this group are invincible to hero attacks when these statuses are set.

- -

enemygroup.invincible_requires_not_status | list(string) | Enemies in this group are invincible to hero attacks when these statuses are not set.

- -

npc.type | string | (IGNORED BY ENGINE) The “type” field, as used by Tiled and other mapping tools.

- -

npc.filename | string | Filename of an NPC definition.

- -

npc.requires_status | list(string) | Status required for NPC load. There can be multiple states, separated by comma

- -

npc.requires_not_status | list(string) | Status required to be missing for NPC load. There can be multiple states, separated by comma

- -

npc.location | point | Location of NPC

- -
- -

MapParallax

- -

Description of maps/parallax/

- -

layer.image | filename | Image file to use as a scrolling background.

- -

layer.speed | float | Speed at which the background will move relative to the camera.

- -

layer.fixed_speed | float, float : X speed, Y speed | Speed at which the background will move independent of the camera movement.

- -

layer.map_layer | string | The tile map layer that this parallax layer will be rendered on top of.

- -
- -

MenuActionBar

- -

Description of menus/actionbar.txt

- -

slot | repeatable(int, int, int, bool) : Index, X, Y, Locked | Index (max 10) and position for power slot. If a slot is locked, its Power can’t be changed by the player.

- -

slot_M1 | point, bool : Position, Locked | Position for the primary action slot. If the slot is locked, its Power can’t be changed by the player.

- -

slot_M2 | point, bool : Position Locked | Position for the secondary action slot. If the slot is locked, its Power can’t be changed by the player.

- -

char_menu | point | Position for the Character menu button.

- -

inv_menu | point | Position for the Inventory menu button.

- -

powers_menu | point | Position for the Powers menu button.

- -

log_menu | point | Position for the Log menu button.

- -

loot_tip_toggle | point | Position for the button used to toggle loot tooltip visibility.

- -

minimap_mode_toggle | point | Position for the button used to toggle the mini-map mode.

- -

statbar_label_toggle | point | Position for the button used to toggle always showing the statbar labels.

- -

combat_text_toggle | point | Position for the button used to toggle the display of combat text.

- -
- -

MenuActiveEffects

- -

Description of menus/activeeffects.txt

- -

vertical | bool | True is vertical orientation; False is horizontal orientation.

- -
- -

MenuBook

- -

Description of books in books/

+

scrollpane_padding | int, int : Horizontal padding, Vertical padding | Pixel padding for each item listed in a tab’s scroll box.

+ +

scrollpane_separator_color | color | Color of the separator line in between scroll box items.

+ +

keybinds_bg_color | color, int : Color, Alpha | Background color and alpha for the keybindings scrollbox.

+ +
+ +

Menu

+ +

Description of menus in menus/

+ +

pos | rectangle | Menu position and dimensions

+ +

align | alignment | Position relative to screen edges

+ +

soundfx_open | filename | Filename of a sound to play when opening this menu.

+ +

soundfx_close | filename | Filename of a sound to play when closing this menu.

+ +
+ +

MenuDevConsole

+ +

Description of menus/devconsole.txt

close | point | Position of the close button.

-

background | filename | Filename for the background image.

- -

image.image_pos | point | Position of the image.

- -

image.image | filename | Filename of the image.

- -

image_icon | icon_id | Use an icon as the image instead of a file.

- -

image.requires_status | list(string) | Image requires these campaign statuses in order to be visible.

- -

image.requires_not_status | list(string) | Image must not have any of these campaign statuses in order to be visible.

- -

text.text_pos | int, int, int, ["left", "center", "right"] : X, Y, Width, Text justify | Position of the text.

- -

text.text_font | color, string : Font color, Font style | Font color and style.

- -

text.shadow | bool | If true, the text will have a black shadow like the text labels in various menus.

- -

text.text | string | The text to be displayed.

- -

text.requires_status | list(string) | Text requires these campaign statuses in order to be visible.

- -

text.requires_not_status | list(string) | Text must not have any of these campaign statuses in order to be visible.

- -

button.button_pos | point | Position of the button.

- -

button.button_image | filename | Image file to use for this button. Default is the normal menu button.

- -

button.text | string | Optional text label for the button.

- -

book.${EVENT_COMPONENT} | Event components to execute when the button is clicked. See the definitions in EventManager for possible attributes. |

- -

event_open.${EVENT_COMPONENT} | Event components to execute when the book is opened. See the definitions in EventManager for possible attributes. |

- -

event_close.${EVENT_COMPONENT} | Event components to execute when the book is closed. See the definitions in EventManager for possible attributes. |

- -
- -

MenuCharacter

- -

Description of menus/character.txt

+

label_title | label | Position of the “Developer Console” label.

+ +

confirm | point | Position of the “Execute” button.

+ +

input | point | Position of the command entry widget.

+ +

history | rectangle | Position and dimensions of the command history.

+ +
+ +

MenuEnemy

+ +

Description of menus/enemy.txt

+ +

bar_pos | rectangle | Position and dimensions of the health bar.

+ +

text_pos | label | Position of the text displaying the enemy’s name and level.

+ +

bar_fill_offset | point | Offset of the bar’s fill graphics relative to the bar_pos X/Y.

+ +

bar_fill_size | int, int : Width, Height | Size of the bar’s fill graphics. If not defined, the width/height of bar_pos is used.

+ +
+ +

MenuGameOver

+ +

Description of menus/game_over.txt

+ +

label_title | label | Position of the “Game Over” text.

+ +

button_continue | point | Position of the “Continue” button.

+ +

button_exit | point | Position of the “Exit” button.

+ +
+ +

MenuHUDLog

+ +

Description of menus/hudlog.txt

+ +

enable_overlay | bool | If true, shows an overlay of the last message on top of other menus.

+ +

start_at_bottom | bool | If true, messages start at the bottom and get pushed up. If false, messages start at the top and get pushed down.

+ +

overlay_at_bottom | bool | If true, the overlay message will be at the bottom of the HUD log area. If false, it will be at the top.

+ +
+ +

MenuInventory

+ +

Description of menus/inventory.txt

close | point | Position of the close button.

-

label_title | label | Position of the “Character” text.

- -

upgrade_primary | predefined_string, point : Primary stat name, Button position | Position of the button used to add a stat point to this primary stat.

- -

statlist | point | Position of the scrollbox containing non-primary stats.

- -

statlist_rows | int | The height of the statlist in rows.

- -

statlist_scrollbar_offset | int | Right margin in pixels for the statlist’s scrollbar.

- -

label_name | label | Position of the “Name” text.

- -

label_level | label | Position of the “Level” text.

- -

label_primary | predefined_string, label : Primary stat name, Text positioning | Position of the text label for this primary stat.

- -

name | rectangle | Position of the player’s name and dimensions of the tooltip hotspot.

- -

level | rectangle | Position of the player’s level and dimensions of the tooltip hotspot.

- -

primary | predefined_string, rectangle : Primary stat name, Hotspot position | Position of this primary stat value display and dimensions of its tooltip hotspot.

- -

unspent | label | Position of the label showing the number of unspent stat points.

- -

show_resists | bool | Hide the elemental “Resistance” stats in the statlist if set to false.

- -

show_stat | predefined_string, bool : Stat name / Damage type, Visible | Hide the matching stat or damage type min/max in the statlist if set to false.

- -

name_max_width | int | The maxiumum width, in pixels, that the character name can occupy until it is abbreviated.

- -
- -

Menu

- -

Description of menus in menus/

- -

pos | rectangle | Menu position and dimensions

- -

align | alignment | Position relative to screen edges

- -

soundfx_open | filename | Filename of a sound to play when opening this menu.

- -

soundfx_close | filename | Filename of a sound to play when closing this menu.

- -
- -

MenuDevConsole

- -

Description of menus/devconsole.txt

+

equipment_slot | repeatable(int, int, string) : X, Y, Slot Type | Position and item type of an equipment slot.

+ +

carried_area | point | Position of the first normal inventory slot.

+ +

carried_cols | int | The number of columns for the normal inventory.

+ +

carried_rows | int | The number of rows for the normal inventory.

+ +

label_title | label | Position of the “Inventory” label.

+ +

currency | label | Position of the label that displays the total currency being carried.

+ +

help | rectangle | A mouse-over area that displays some help text for inventory shortcuts.

+ +
+ +

MenuLog

+ +

Description of menus/log.txt

+ +

label_title | label | Position of the “Log” text.

close | point | Position of the close button.

-

label_title | label | Position of the “Developer Console” label.

- -

confirm | point | Position of the “Execute” button.

- -

input | point | Position of the command entry widget.

- -

history | rectangle | Position and dimensions of the command history.

- -
- -

MenuEnemy

- -

Description of menus/enemy.txt

- -

bar_pos | rectangle | Position and dimensions of the health bar.

- -

text_pos | label | Position of the text displaying the enemy’s name and level.

- -
- -

MenuExit

- -

Description of menus/exit.txt

- -

title | label | Position of the “Paused” text.

- -

exit | point | Position of the “Save and Exit” button.

- -

continue | point | Position of the “Continue” button.

- -

music_volume | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Music Volume” slider relative to the frame.

- -

sound_volume | int, int, int, int : Label X, Label Y, Widget X, Widget Y | Position of the “Sound Volume” slider relative to the frame.

- -

enable_overlay | bool | If true, shows an overlay of the last message on top of other menus.

- -

start_at_bottom | bool | If true, messages start at the bottom and get pushed up. If false, messages start at the top and get pushed down.

- -

overlay_at_bottom | bool | If true, the overlay message will be at the bottom of the HUD log area. If false, it will be at the top.

- -
- -

MenuInventory

- -

Description of menus/inventory.txt

+

tab_area | rectangle | The position of the row of tabs, followed by the dimensions of the log text area.

+ +
+ +

MenuMiniMap

+ +

Description of menus/minimap.txt

+ +

map_pos | rectangle | Position and dimensions of the map.

+ +

text_pos | label | Position of the text label with the map name.

+ +

background | filename | Optional background image.

+ +

color_wall | color, int : Color, Alpha | Color used for walls.

+ +

color_obst | color, int : Color, Alpha | Color used for small obstacles and pits.

+ +

color_hero | color, int : Color, Alpha | Color used for the player character.

+ +

color_enemy | color, int : Color, Alpha | Color used for enemies engaged in combat.

+ +

color_ally | color, int : Color, Alpha | Color used for allies.

+ +

color_npc | color, int : Color, Alpha | Color used for NPCs.

+ +

color_teleport | color, int : Color, Alpha | Color used for intermap teleports.

+ +

button_config | point | Position of the ‘Configuration’ button. The button will be hidden if not defined.

+ +
+ +

MenuMovementType

+ +

Description of menus/movement_type.txt

+ +

label_title | label | Position of the “Select a Movement Type” text.

+ +

label_config_hint | label | Position of the “Can be changed later in the Configuration menu” text.

+ +

button_keyboard | point | Position of the “Keyboard” button.

+ +

button_mouse | point | Position of the “Mouse” button.

+ +

button_joystick | point | Position of the “Joystick” button.

+ +

icon_keyboard | point | Position of the keyboard icon.

+ +

icon_mouse | point | Position of the mouse icon.

+ +

icon_joystick | point | Position of the joystick icon.

+ +
+ +

MenuNumPicker

+ +

Description of menus/num_picker.txt

+ +

label_title | label | Position of the “Enter amount ” text.

+ +

confirm | point | Position of the “OK” button.

+ +

increase | point | Position of the button used to increase the value.

+ +

decrease | point | Position of the button used to decrease the value.

+ +

close | point | Position of the button used to close the number picker window.

+ +

input | point | Position of the text input box.

+ +
+ +

MenuPowers: Menu layout

+ +

Description of menus/powers.txt

+ +

label_title | label | Position of the “Powers” text.

+ +

unspent_points | label | Position of the text that displays the amount of unused power points.

close | point | Position of the close button.

-

auto_equip | point | Position of the auto-equip toggle switch.

- -

equipment_slot | repeatable(int, int, string) : X, Y, Slot Type | Position and item type of an equipment slot.

- -

carried_area | point | Position of the first normal inventory slot.

- -

carried_cols | int | The number of columns for the normal inventory.

- -

carried_rows | int | The number of rows for the normal inventory.

- -

label_title | label | Position of the “Inventory” label.

- -

currency | label | Position of the label that displays the total currency being carried.

- -

help | rectangle | A mouse-over area that displays some help text for inventory shortcuts.

- -
- -

MenuLog

- -

Description of menus/log.txt

- -

label_title | label | Position of the “Log” text.

+

tab_area | rectangle | Position and dimensions of the tree pages.

+ +
+ +

MenuPowers: Power tree layout

+ +

Description of powers/trees/

+ +

background | filename | Filename of the default background image

+ +

tab.title | string | The name of this power tree tab

+ +

tab.background | filename | Filename of the background image for this tab’s power tree

+ +

power.id | int | A power id from powers/powers.txt for this slot.

+ +

power.tab | int | Tab index to place this power on, starting from 0.

+ +

power.position | point | Position of this power icon; relative to MenuPowers “pos”.

+ +

power.requires_point | bool | Power requires a power point to unlock.

+ +

power.requires_primary | predefined_string, int : Primary stat name, Required value | Power requires this primary stat to be at least the specificed value.

+ +

power.requires_level | int | Power requires at least this level for the hero.

+ +

power.requires_power | power_id | Power requires another power id.

+ +

power.requires_status | repeatable(string) | Power requires this campaign status.

+ +

power.requires_not_status | repeatable(string) | Power requires not having this campaign status.

+ +

power.visible_requires_status | repeatable(string) | (Deprecated as of v1.11.75) Hide the power if we don’t have this campaign status.

+ +

power.visible_requires_not_status | repeatable(string) | (Deprecated as of v1.11.75) Hide the power if we have this campaign status.

+ +

power.upgrades | list(power_id) | A list of upgrade power ids that this power slot can upgrade to. Each of these powers should have a matching upgrade section.

+ +

power.visible | bool | Controls whether or not a power is visible or hidden regardless of unlocked state. Defaults to true.

+ +

power.visible_when_locked | bool | Controls whether or not a power is visible or hidden when the power is locked. Defaults to true.

+ +

upgrade.id | int | A power id from powers/powers.txt for this upgrade.

+ +

upgrade.requires_primary | predefined_string, int : Primary stat name, Required value | Upgrade requires this primary stat to be at least the specificed value.

+ +

upgrade.requires_point | bool | Upgrade requires a power point to unlock.

+ +

upgrade.requires_level | int | Upgrade requires at least this level for the hero.

+ +

upgrade.requires_power | int | Upgrade requires another power id.

+ +

upgrade.requires_status | repeatable(string) | Upgrade requires this campaign status.

+ +

upgrade.requires_not_status | repeatable(string) | Upgrade requires not having this campaign status.

+ +

upgrade.visible_requires_status | repeatable(string) | (Deprecated as of v1.11.75) Hide the upgrade if we don’t have this campaign status.

+ +

upgrade.visible_requires_not_status | repeatable(string) | (Deprecated as of v1.11.75) Hide the upgrade if we have this campaign status.

+ +

upgrade.visible | bool | Controls whether or not a power is visible or hidden regardless of unlocked state. Defaults to true.

+ +

upgrade.visible_when_locked | bool | Controls whether or not a power is visible or hidden when the power is locked. Defaults to true.

+ +
+ +

MenuStash

+ +

Description of menus/stash.txt

close | point | Position of the close button.

-

tab_area | rectangle | The position of the row of tabs, followed by the dimensions of the log text area.

- -
- -

MenuMiniMap

- -

Description of menus/minimap.txt

- -

map_pos | rectangle | Position and dimensions of the map.

- -

text_pos | label | Position of the text label with the map name.

- -

background | filename | Optional background image.

- -
- -

MenuNumPicker

- -

Description of menus/num_picker.txt

- -

label_title | label | Position of the “Enter amount ” text.

- -

confirm | point | Position of the “OK” button.

- -

increase | point | Position of the button used to increase the value.

- -

decrease | point | Position of the button used to decrease the value.

- -

close | point | Position of the button used to close the number picker window.

- -

input | point | Position of the text input box.

- -
- -

MenuPowers: Menu layout

- -

Description of menus/powers.txt

- -

label_title | label | Position of the “Powers” text.

- -

unspent_points | label | Position of the text that displays the amount of unused power points.

+

slots_area | point | Position of the top-left slot.

+ +

stash_cols | int | The number of columns for the grid of slots.

+ +

stash_rows | int | The number of rows for the grid of slots.

+ +

label_title | label | Position of the “Stash” label.

+ +

currency | label | Position of the label displaying the amount of currency stored in the stash.

+ +

tab.name | ["Private", "Shared", string] | The displayed name of this tab. It is also used to determine the filename of the stash file that the engine will create. ‘Private’ and ‘Shared’ will use their legacy filenames for compatibility.

+ +

tab.is_private | bool | If true, this stash will not be shared across other saves.

+ +
+ +

MenuStatBar

+ +

Description of menus/hp.txt, menus/mp.txt, menus/xp.txt

+ +

bar_pos | rectangle | Position and dimensions of the bar graphics.

+ +

text_pos | label | Position of the text displaying the current value of the relevant stat.

+ +

orientation | bool | True is vertical orientation; false is horizontal.

+ +

bar_gfx | filename | Filename of the image to use for the “fill” of the bar.

+ +

bar_gfx_background | filename | Filename of the image to use for the base of the bar.

+ +

hide_timeout | duration | Hide HP and MP bar if full mana or health, after given amount of seconds; Hide XP bar if no changes in XP points for given amount of seconds. 0 disable hiding.

+ +

bar_fill_offset | point | Offset of the bar’s fill graphics relative to the bar_pos X/Y.

+ +

bar_fill_size | int, int : Width, Height | Size of the bar’s fill graphics. If not defined, the width/height of bar_pos is used.

+ +
+ +

MenuTalker

+ +

Description of menus/talker.txt

close | point | Position of the close button.

-

tab_area | rectangle | Position and dimensions of the tree pages.

- -
- -

MenuPowers: Power tree layout

- -

Description of powers/trees/

- -

background | filename | Filename of the default background image

- -

tab.title | string | The name of this power tree tab

- -

tab.background | filename | Filename of the background image for this tab’s power tree

- -

power.id | int | A power id from powers/powers.txt for this slot.

- -

power.tab | int | Tab index to place this power on, starting from 0.

- -

power.position | point | Position of this power icon; relative to MenuPowers “pos”.

- -

power.requires_primary | predefined_string, int : Primary stat name, Required value | Power requires this primary stat to be at least the specificed value.

- -

power.requires_point | bool | Power requires a power point to unlock.

- -

power.requires_level | int | Power requires at least this level for the hero.

- -

power.requires_power | power_id | Power requires another power id.

- -

power.visible_requires_status | repeatable(string) | Hide the power if we don’t have this campaign status.

- -

power.visible_requires_not_status | repeatable(string) | Hide the power if we have this campaign status.

- -

power.upgrades | list(power_id) | A list of upgrade power ids that this power slot can upgrade to. Each of these powers should have a matching upgrade section.

- -

upgrade.id | int | A power id from powers/powers.txt for this upgrade.

- -

upgrade.requires_primary | predefined_string, int : Primary stat name, Required value | Upgrade requires this primary stat to be at least the specificed value.

- -

upgrade.requires_point | bool | Upgrade requires a power point to unlock.

- -

upgrade.requires_level | int | Upgrade requires at least this level for the hero.

- -

upgrade.requires_power | int | Upgrade requires another power id.

- -

upgrade.visible_requires_status | repeatable(string) | Hide the upgrade if we don’t have this campaign status.

- -

upgrade.visible_requires_not_status | repeatable(string) | Hide the upgrade if we have this campaign status.

- -
- -

MenuStash

- -

Description of menus/stash.txt

+

advance | point | Position of the button to advance dialog.

+ +

dialogbox | rectangle | Position and dimensions of the text box graphics.

+ +

dialogtext | rectangle | Rectangle where the dialog text is placed.

+ +

text_offset | point | Margins for the left/right and top/bottom of the dialog text.

+ +

portrait_he | rectangle | Position and dimensions of the NPC portrait graphics.

+ +

portrait_you | rectangle | Position and dimensions of the player’s portrait graphics.

+ +

font_who | predefined_string | Font style to use for the name of the currently talking person.

+ +

font_dialog | predefined_string | Font style to use for the dialog text.

+ +

topic_color_normal | color | The normal color for topic text.

+ +

topic_color_hover | color | The color for topic text when highlighted.

+ +

topic_color_normal | color | The color for topic text when clicked.

+ +

trade_color_normal | color | The normal color for the “Trade” text.

+ +

trade_color_hover | color | The color for the “Trade” text when highlighted.

+ +

trade_color_normal | color | The color for the “Trade” text when clicked.

+ +
+ +

MenuVendor

+ +

Description of menus/vendor.txt

close | point | Position of the close button.

slots_area | point | Position of the top-left slot.

-

stash_cols | int | The number of columns for the grid of slots.

- -

stash_rows | int | The number of rows for the grid of slots.

- -

label_title | label | Position of the “Stash” label.

- -

currency | label | Position of the label displaying the amount of currency stored in the stash.

- -
- -

MenuStatBar

- -

Description of menus/hp.txt, menus/mp.txt, menus/xp.txt

- -

bar_pos | rectangle | Position and dimensions of the bar graphics.

- -

text_pos | label | Position of the text displaying the current value of the relevant stat.

- -

orientation | bool | True is vertical orientation; false is horizontal.

- -

bar_gfx | filename | Filename of the image to use for the “fill” of the bar.

- -

bar_gfx_background | filename | Filename of the image to use for the base of the bar.

- -
- -

MenuTalker

- -

Description of menus/talker.txt

- -

close | point | Position of the close button.

- -

advance | point | Position of the button to advance dialog.

- -

dialogbox | rectangle | Position and dimensions of the text box graphics.

- -

dialogtext | rectangle | Rectangle where the dialog text is placed.

- -

text_offset | point | Margins for the left/right and top/bottom of the dialog text.

- -

portrait_he | rectangle | Position and dimensions of the NPC portrait graphics.

- -

portrait_you | rectangle | Position and dimensions of the player’s portrait graphics.

- -

font_who | predefined_string | Font style to use for the name of the currently talking person.

- -

font_dialog | predefined_string | Font style to use for the dialog text.

- -

topic_color_normal | color | The normal color for topic text.

- -

topic_color_hover | color | The color for topic text when highlighted.

- -

topic_color_normal | color | The color for topic text when clicked.

- -

trade_color_normal | color | The normal color for the “Trade” text.

- -

trade_color_hover | color | The color for the “Trade” text when highlighted.

- -

trade_color_normal | color | The color for the “Trade” text when clicked.

- -
- -

MenuVendor

- -

Description of menus/vendor.txt

- -

close | point | Position of the close button.

- -

slots_area | point | Position of the top-left slot.

-

vendor_cols | int | The number of columns in the grid of slots.

vendor_rows | int | The number of rows in the grid of slots.

@@ -1645,16 +1621,18 @@

dialog.portrait_you | repeatable(filename) | Filename of a portrait to display for the player during this dialog.

+

dialog.take_a_party | bool | Start/stop taking a party with player.

+

dialog.response | repeatable(string) | A dialog ID to present as a selectable response. This key must precede the dialog text line.

dialog.response_only | bool | If true, this dialog topic will only appear when explicitly referenced with the “response” key.

name | string | NPC’s name.

-

gfx | filename | Filename of an animation definition.

-

direction | direction | The direction to use for this NPC’s stance animation.

+

show_on_minimap | bool | If true, this NPC will be shown on the minimap. The default is true.

+

talker | bool | Allows this NPC to be talked to.

portrait | filename | Filename of the default portrait image.

@@ -1765,7 +1743,7 @@

power.cooldown | duration | Specify the duration for cooldown of the power in ‘ms’ or ’s'.

-

power.requires_hpmp_state | ["hp", "mp"], ["percent", "not_percent", "ignore"], int : Stat, Current state, Percentage value | Power can only be used when HP/MP matches the specified state

+

power.requires_hpmp_state | ["all", "any"], ["percent", "not_percent", "ignore"], int , ["percent", "not_percent", "ignore"], int : Mode, HP state, HP Percentage value, MP state, MP Percentage value | Power can only be used when HP/MP matches the specified state. In ‘all’ mode, both HP and MP must meet the requirements, where as only one must in ‘any’ mode. To check a single stat, use ‘all’ mode and set the ‘ignore’ state for the other stat.

power.animation | filename | The filename of the power animation.

@@ -1863,7 +1841,7 @@

power.pre_power | power_id, int : Power, Chance to cast | Trigger a power immediately when casting this one.

-

power.post_power | power_id, int : Power, Chance to cast | Trigger a power if the hazard did damage.

+

power.post_power | power_id, int : Power, Chance to cast | Trigger a power if the hazard did damage. For ‘block’ type powers, this power will be triggered when the blocker takes damage.

power.wall_power | power_id, int : Power, Chance to cast | Trigger a power if the hazard hit a wall.

@@ -1905,6 +1883,8 @@

power.target_nearest | float | Will automatically target the nearest enemy within the specified range.

+

power.disable_equip_slots | list(predefined_string) | Passive powers only. A comma separated list of equip slot types to disable when this power is active.

+

QuestLog

@@ -1969,6 +1949,10 @@

power_filter | list(power_id) | Only these powers are allowed to hit this entity.

+

categories | list(string) | Categories that this entity belongs to.

+ +

melee_range | float | Determines the distance from the caster that some powers will be placed. For AI entities, it also means the minimum distance from target required to use melee powers.

+

StatBlock: Sound effects

@@ -1987,6 +1971,8 @@

sfx_levelup | filename | Filename of sound effect for leveling up.

+

sfx_lowhp | filename, bool : Sound file, loop | Filename of sound effect for low health warning. Optionally, it can be looped.

+

StatBlock: Enemies

@@ -2033,8 +2019,6 @@

passive_powers | list(power_id) | A list of passive powers this creature has.

-

melee_range | float | Minimum distance from target required to use melee powers.

-

threat_range | float, float : Engage distance, Stop distance | The first value is the radius of the area this creature will be able to start chasing the hero. The second, optional, value is the radius at which this creature will stop pursuing their target and defaults to double the first value.

flee_range | float | The radius at which this creature will start moving to a safe distance. Defaults to half of the threat_range.

@@ -2045,8 +2029,6 @@

suppress_hp | bool | Hides the enemy HP bar for this creature.

-

categories | list(string) | Categories that this enemy belongs to.

-

flee_duration | duration | The minimum amount of time that this creature will flee. They may flee longer than the specified time.

flee_cooldown | duration | The amount of time this creature must wait before they can start fleeing again.

@@ -2164,6 +2146,24 @@

shield | Create a damage absorbing barrier based on Mental damage stat. Duration is ignored.

heal | Restore HP based on Mental damage stat.

+ +
+ +

ItemManager

+ +

Description of “bonus” attribute in items/items.txt

+ +

speed | Movement speed. A value of 100 is 100% speed (aka normal speed).

+ +

attack_speed | Attack animation speed. A value of 100 is 100% speed (aka normal speed).

+ +

${STATNAME} | Increases ${STATNAME}, where ${STATNAME} is any of the base stats. Examples: hp, avoidance, xp_gain

+ +

${DAMAGE_TYPE} | Increases a damage min or max, where ${DAMAGE_TYPE} is any ‘min’ or ‘max’ value found in engine/damage_types.txt. Example: dmg_melee_min

+ +

${ELEMENT}_resist | Increase Resistance % to ${ELEMENT}, where ${ELEMENT} is any found in engine/elements.txt. Example: fire_resist

+ +

${PRIMARYSTAT} | Increases ${PRIMARYSTAT}, where ${PRIMARYSTAT} is any of the primary stats defined in engine/primary_stats.txt. Example: physical


diff --git a/docs/gen/attribute-reference.md b/docs/gen/attribute-reference.md index 132d6a3..9e1a405 100644 --- a/docs/gen/attribute-reference.md +++ b/docs/gen/attribute-reference.md @@ -37,7 +37,7 @@ `predefined_string`, same as a string, but uses a value defined elsewhere -`alignment`, defined as: `["topleft", "top", "topright", "left", "center", "right", "bottomleft", "bottom", "bottomright"]` +`alignment`, defined as: `["topleft", "top", "topright", "left", "center", "right", "bottomleft", "bottom", "bottomright", "frame_topleft", "frame_top", "frame_topright", "frame_left", "frame_center", "frame_right", "frame_bottomleft", "frame_bottom", "frame_bottomright"]` `direction`, defined as: `["N", "NE", "E", "SE", "S", "SW", "W", "NW", int]`. If defined as an integer, the value must be between 0-7 inclusive. @@ -45,7 +45,7 @@ `label`, defined as: `"hidden"` **or** `int, int, ["left", "right", "center"], ["top", "center", "bottom"], string : X, Y, Justify, Vertical Align, Font style`. The font style can be any style defined in engine/font\_settings.txt. -`loot`, defined as: `filename` **or** `["currency", item_id], ["fixed", int], int, int : Item, Drop chance, Min quantity, Max quantity`. There is a limitation when defining as part of a list(...): filenames can only be used in the first list element. +`loot`, defined as: `filename` **or** `["currency", item_id], ["fixed", float], int, int : Item, Drop chance, Min quantity, Max quantity`. There is a limitation when defining as part of a list(...): filenames can only be used in the first list element. `version`, defined as: a string of three numbers, separated by dots (e.g. "1.2.03") diff --git a/extract_xml.sh b/extract_xml.sh new file mode 100755 index 0000000..b7960c4 --- /dev/null +++ b/extract_xml.sh @@ -0,0 +1,38 @@ +#!/bin/bash +IFS=$'\n' +HAVE_CLASS=0 +echo "" +echo "" +for line in `grep '@CLASS\|@ATTR\|@TYPE' src/*.cpp | sed s/^.*@//g | sed 's/CLASS /CLASS|/g' | sed 's/ATTR /ATTR|/g' | sed 's/TYPE /TYPE|/g' | sed 's/"/\"/g'` +do + IFS='|' + fields=($line) + # Handle CLASS + if [ "${fields[0]}" == "CLASS" ]; then + if [ $HAVE_CLASS -eq 1 ]; then + echo ' ' + echo ' ' + fi + echo ' ' + HAVE_CLASS=1 + echo ' '${fields[2]}'' + echo ' ' + fi + # Handle ATTR + if [ "${fields[0]}" == "ATTR" ]; then + IFS=':' + TYPE_VAL=(${fields[2]}) + echo ' '${fields[3]}'' + fi + # Handle TYPE + if [ "${fields[0]}" == "TYPE" ]; then + echo ' '${fields[2]}'' + fi +done + +# close last class if available +if [ $HAVE_CLASS -eq 1 ]; then + echo ' ' + echo ' ' +fi +echo "" diff --git a/flare-android-project/app/build.gradle b/flare-android-project/app/build.gradle index ba47f47..2d6d27f 100644 --- a/flare-android-project/app/build.gradle +++ b/flare-android-project/app/build.gradle @@ -3,9 +3,9 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 22 + compileSdkVersion 26 // Each version of the Android Gradle Plugin now has a default version of the build tools - //buildToolsVersion '25.0.0' + //buildToolsVersion '29.0.2' // don't use Android.mk generated by Android Studio / Gradle sourceSets.main.jni.srcDirs = [] @@ -14,7 +14,7 @@ defaultConfig { applicationId "org.flare.app" minSdkVersion 14 - targetSdkVersion 22 + targetSdkVersion 26 } buildTypes { @@ -23,7 +23,6 @@ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } - buildToolsVersion '27.0.3' } // call regular ndk-build script from app directory diff --git a/flare-android-project/app/src/main/AndroidManifest.xml b/flare-android-project/app/src/main/AndroidManifest.xml index 2bb001d..e1be5a5 100644 --- a/flare-android-project/app/src/main/AndroidManifest.xml +++ b/flare-android-project/app/src/main/AndroidManifest.xml @@ -25,9 +25,6 @@ - - - diff --git a/flare-android-project/app/src/main/java/org/flare/app/FLARE.java b/flare-android-project/app/src/main/java/org/flare/app/FLARE.java index a0d1e86..a2c5d84 100644 --- a/flare-android-project/app/src/main/java/org/flare/app/FLARE.java +++ b/flare-android-project/app/src/main/java/org/flare/app/FLARE.java @@ -1,7 +1,7 @@ package org.flare.app; -import org.libsdl.app.SDLActivity; -import android.os.*; +import org.libsdl.app.SDLActivity; +import android.os.*; /* * A sample wrapper class that just calls SDLActivity diff --git a/flare-android-project/app/src/main/java/org/libsdl/app/HIDDevice.java b/flare-android-project/app/src/main/java/org/libsdl/app/HIDDevice.java new file mode 100644 index 0000000..955df5d --- /dev/null +++ b/flare-android-project/app/src/main/java/org/libsdl/app/HIDDevice.java @@ -0,0 +1,22 @@ +package org.libsdl.app; + +import android.hardware.usb.UsbDevice; + +interface HIDDevice +{ + public int getId(); + public int getVendorId(); + public int getProductId(); + public String getSerialNumber(); + public int getVersion(); + public String getManufacturerName(); + public String getProductName(); + public UsbDevice getDevice(); + public boolean open(); + public int sendFeatureReport(byte[] report); + public int sendOutputReport(byte[] report); + public boolean getFeatureReport(byte[] report); + public void setFrozen(boolean frozen); + public void close(); + public void shutdown(); +} diff --git a/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java b/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java new file mode 100644 index 0000000..94a2818 --- /dev/null +++ b/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java @@ -0,0 +1,650 @@ +package org.libsdl.app; + +import android.content.Context; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattDescriptor; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.bluetooth.BluetoothGattService; +import android.hardware.usb.UsbDevice; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.os.*; + +//import com.android.internal.util.HexDump; + +import java.lang.Runnable; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.UUID; + +class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDevice { + + private static final String TAG = "hidapi"; + private HIDDeviceManager mManager; + private BluetoothDevice mDevice; + private int mDeviceId; + private BluetoothGatt mGatt; + private boolean mIsRegistered = false; + private boolean mIsConnected = false; + private boolean mIsChromebook = false; + private boolean mIsReconnecting = false; + private boolean mFrozen = false; + private LinkedList mOperations; + GattOperation mCurrentOperation = null; + private Handler mHandler; + + private static final int TRANSPORT_AUTO = 0; + private static final int TRANSPORT_BREDR = 1; + private static final int TRANSPORT_LE = 2; + + private static final int CHROMEBOOK_CONNECTION_CHECK_INTERVAL = 10000; + + static public final UUID steamControllerService = UUID.fromString("100F6C32-1735-4313-B402-38567131E5F3"); + static public final UUID inputCharacteristic = UUID.fromString("100F6C33-1735-4313-B402-38567131E5F3"); + static public final UUID reportCharacteristic = UUID.fromString("100F6C34-1735-4313-B402-38567131E5F3"); + static private final byte[] enterValveMode = new byte[] { (byte)0xC0, (byte)0x87, 0x03, 0x08, 0x07, 0x00 }; + + static class GattOperation { + private enum Operation { + CHR_READ, + CHR_WRITE, + ENABLE_NOTIFICATION + } + + Operation mOp; + UUID mUuid; + byte[] mValue; + BluetoothGatt mGatt; + boolean mResult = true; + + private GattOperation(BluetoothGatt gatt, GattOperation.Operation operation, UUID uuid) { + mGatt = gatt; + mOp = operation; + mUuid = uuid; + } + + private GattOperation(BluetoothGatt gatt, GattOperation.Operation operation, UUID uuid, byte[] value) { + mGatt = gatt; + mOp = operation; + mUuid = uuid; + mValue = value; + } + + public void run() { + // This is executed in main thread + BluetoothGattCharacteristic chr; + + switch (mOp) { + case CHR_READ: + chr = getCharacteristic(mUuid); + //Log.v(TAG, "Reading characteristic " + chr.getUuid()); + if (!mGatt.readCharacteristic(chr)) { + Log.e(TAG, "Unable to read characteristic " + mUuid.toString()); + mResult = false; + break; + } + mResult = true; + break; + case CHR_WRITE: + chr = getCharacteristic(mUuid); + //Log.v(TAG, "Writing characteristic " + chr.getUuid() + " value=" + HexDump.toHexString(value)); + chr.setValue(mValue); + if (!mGatt.writeCharacteristic(chr)) { + Log.e(TAG, "Unable to write characteristic " + mUuid.toString()); + mResult = false; + break; + } + mResult = true; + break; + case ENABLE_NOTIFICATION: + chr = getCharacteristic(mUuid); + //Log.v(TAG, "Writing descriptor of " + chr.getUuid()); + if (chr != null) { + BluetoothGattDescriptor cccd = chr.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")); + if (cccd != null) { + int properties = chr.getProperties(); + byte[] value; + if ((properties & BluetoothGattCharacteristic.PROPERTY_NOTIFY) == BluetoothGattCharacteristic.PROPERTY_NOTIFY) { + value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE; + } else if ((properties & BluetoothGattCharacteristic.PROPERTY_INDICATE) == BluetoothGattCharacteristic.PROPERTY_INDICATE) { + value = BluetoothGattDescriptor.ENABLE_INDICATION_VALUE; + } else { + Log.e(TAG, "Unable to start notifications on input characteristic"); + mResult = false; + return; + } + + mGatt.setCharacteristicNotification(chr, true); + cccd.setValue(value); + if (!mGatt.writeDescriptor(cccd)) { + Log.e(TAG, "Unable to write descriptor " + mUuid.toString()); + mResult = false; + return; + } + mResult = true; + } + } + } + } + + public boolean finish() { + return mResult; + } + + private BluetoothGattCharacteristic getCharacteristic(UUID uuid) { + BluetoothGattService valveService = mGatt.getService(steamControllerService); + if (valveService == null) + return null; + return valveService.getCharacteristic(uuid); + } + + static public GattOperation readCharacteristic(BluetoothGatt gatt, UUID uuid) { + return new GattOperation(gatt, Operation.CHR_READ, uuid); + } + + static public GattOperation writeCharacteristic(BluetoothGatt gatt, UUID uuid, byte[] value) { + return new GattOperation(gatt, Operation.CHR_WRITE, uuid, value); + } + + static public GattOperation enableNotification(BluetoothGatt gatt, UUID uuid) { + return new GattOperation(gatt, Operation.ENABLE_NOTIFICATION, uuid); + } + } + + public HIDDeviceBLESteamController(HIDDeviceManager manager, BluetoothDevice device) { + mManager = manager; + mDevice = device; + mDeviceId = mManager.getDeviceIDForIdentifier(getIdentifier()); + mIsRegistered = false; + mIsChromebook = mManager.getContext().getPackageManager().hasSystemFeature("org.chromium.arc.device_management"); + mOperations = new LinkedList(); + mHandler = new Handler(Looper.getMainLooper()); + + mGatt = connectGatt(); + // final HIDDeviceBLESteamController finalThis = this; + // mHandler.postDelayed(new Runnable() { + // @Override + // public void run() { + // finalThis.checkConnectionForChromebookIssue(); + // } + // }, CHROMEBOOK_CONNECTION_CHECK_INTERVAL); + } + + public String getIdentifier() { + return String.format("SteamController.%s", mDevice.getAddress()); + } + + public BluetoothGatt getGatt() { + return mGatt; + } + + // Because on Chromebooks we show up as a dual-mode device, it will attempt to connect TRANSPORT_AUTO, which will use TRANSPORT_BREDR instead + // of TRANSPORT_LE. Let's force ourselves to connect low energy. + private BluetoothGatt connectGatt(boolean managed) { + if (Build.VERSION.SDK_INT >= 23) { + try { + return mDevice.connectGatt(mManager.getContext(), managed, this, TRANSPORT_LE); + } catch (Exception e) { + return mDevice.connectGatt(mManager.getContext(), managed, this); + } + } else { + return mDevice.connectGatt(mManager.getContext(), managed, this); + } + } + + private BluetoothGatt connectGatt() { + return connectGatt(false); + } + + protected int getConnectionState() { + + Context context = mManager.getContext(); + if (context == null) { + // We are lacking any context to get our Bluetooth information. We'll just assume disconnected. + return BluetoothProfile.STATE_DISCONNECTED; + } + + BluetoothManager btManager = (BluetoothManager)context.getSystemService(Context.BLUETOOTH_SERVICE); + if (btManager == null) { + // This device doesn't support Bluetooth. We should never be here, because how did + // we instantiate a device to start with? + return BluetoothProfile.STATE_DISCONNECTED; + } + + return btManager.getConnectionState(mDevice, BluetoothProfile.GATT); + } + + public void reconnect() { + + if (getConnectionState() != BluetoothProfile.STATE_CONNECTED) { + mGatt.disconnect(); + mGatt = connectGatt(); + } + + } + + protected void checkConnectionForChromebookIssue() { + if (!mIsChromebook) { + // We only do this on Chromebooks, because otherwise it's really annoying to just attempt + // over and over. + return; + } + + int connectionState = getConnectionState(); + + switch (connectionState) { + case BluetoothProfile.STATE_CONNECTED: + if (!mIsConnected) { + // We are in the Bad Chromebook Place. We can force a disconnect + // to try to recover. + Log.v(TAG, "Chromebook: We are in a very bad state; the controller shows as connected in the underlying Bluetooth layer, but we never received a callback. Forcing a reconnect."); + mIsReconnecting = true; + mGatt.disconnect(); + mGatt = connectGatt(false); + break; + } + else if (!isRegistered()) { + if (mGatt.getServices().size() > 0) { + Log.v(TAG, "Chromebook: We are connected to a controller, but never got our registration. Trying to recover."); + probeService(this); + } + else { + Log.v(TAG, "Chromebook: We are connected to a controller, but never discovered services. Trying to recover."); + mIsReconnecting = true; + mGatt.disconnect(); + mGatt = connectGatt(false); + break; + } + } + else { + Log.v(TAG, "Chromebook: We are connected, and registered. Everything's good!"); + return; + } + break; + + case BluetoothProfile.STATE_DISCONNECTED: + Log.v(TAG, "Chromebook: We have either been disconnected, or the Chromebook BtGatt.ContextMap bug has bitten us. Attempting a disconnect/reconnect, but we may not be able to recover."); + + mIsReconnecting = true; + mGatt.disconnect(); + mGatt = connectGatt(false); + break; + + case BluetoothProfile.STATE_CONNECTING: + Log.v(TAG, "Chromebook: We're still trying to connect. Waiting a bit longer."); + break; + } + + final HIDDeviceBLESteamController finalThis = this; + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + finalThis.checkConnectionForChromebookIssue(); + } + }, CHROMEBOOK_CONNECTION_CHECK_INTERVAL); + } + + private boolean isRegistered() { + return mIsRegistered; + } + + private void setRegistered() { + mIsRegistered = true; + } + + private boolean probeService(HIDDeviceBLESteamController controller) { + + if (isRegistered()) { + return true; + } + + if (!mIsConnected) { + return false; + } + + Log.v(TAG, "probeService controller=" + controller); + + for (BluetoothGattService service : mGatt.getServices()) { + if (service.getUuid().equals(steamControllerService)) { + Log.v(TAG, "Found Valve steam controller service " + service.getUuid()); + + for (BluetoothGattCharacteristic chr : service.getCharacteristics()) { + if (chr.getUuid().equals(inputCharacteristic)) { + Log.v(TAG, "Found input characteristic"); + // Start notifications + BluetoothGattDescriptor cccd = chr.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")); + if (cccd != null) { + enableNotification(chr.getUuid()); + } + } + } + return true; + } + } + + if ((mGatt.getServices().size() == 0) && mIsChromebook && !mIsReconnecting) { + Log.e(TAG, "Chromebook: Discovered services were empty; this almost certainly means the BtGatt.ContextMap bug has bitten us."); + mIsConnected = false; + mIsReconnecting = true; + mGatt.disconnect(); + mGatt = connectGatt(false); + } + + return false; + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + private void finishCurrentGattOperation() { + GattOperation op = null; + synchronized (mOperations) { + if (mCurrentOperation != null) { + op = mCurrentOperation; + mCurrentOperation = null; + } + } + if (op != null) { + boolean result = op.finish(); // TODO: Maybe in main thread as well? + + // Our operation failed, let's add it back to the beginning of our queue. + if (!result) { + mOperations.addFirst(op); + } + } + executeNextGattOperation(); + } + + private void executeNextGattOperation() { + synchronized (mOperations) { + if (mCurrentOperation != null) + return; + + if (mOperations.isEmpty()) + return; + + mCurrentOperation = mOperations.removeFirst(); + } + + // Run in main thread + mHandler.post(new Runnable() { + @Override + public void run() { + synchronized (mOperations) { + if (mCurrentOperation == null) { + Log.e(TAG, "Current operation null in executor?"); + return; + } + + mCurrentOperation.run(); + // now wait for the GATT callback and when it comes, finish this operation + } + } + }); + } + + private void queueGattOperation(GattOperation op) { + synchronized (mOperations) { + mOperations.add(op); + } + executeNextGattOperation(); + } + + private void enableNotification(UUID chrUuid) { + GattOperation op = HIDDeviceBLESteamController.GattOperation.enableNotification(mGatt, chrUuid); + queueGattOperation(op); + } + + public void writeCharacteristic(UUID uuid, byte[] value) { + GattOperation op = HIDDeviceBLESteamController.GattOperation.writeCharacteristic(mGatt, uuid, value); + queueGattOperation(op); + } + + public void readCharacteristic(UUID uuid) { + GattOperation op = HIDDeviceBLESteamController.GattOperation.readCharacteristic(mGatt, uuid); + queueGattOperation(op); + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////// BluetoothGattCallback overridden methods + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + public void onConnectionStateChange(BluetoothGatt g, int status, int newState) { + //Log.v(TAG, "onConnectionStateChange status=" + status + " newState=" + newState); + mIsReconnecting = false; + if (newState == 2) { + mIsConnected = true; + // Run directly, without GattOperation + if (!isRegistered()) { + mHandler.post(new Runnable() { + @Override + public void run() { + mGatt.discoverServices(); + } + }); + } + } + else if (newState == 0) { + mIsConnected = false; + } + + // Disconnection is handled in SteamLink using the ACTION_ACL_DISCONNECTED Intent. + } + + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + //Log.v(TAG, "onServicesDiscovered status=" + status); + if (status == 0) { + if (gatt.getServices().size() == 0) { + Log.v(TAG, "onServicesDiscovered returned zero services; something has gone horribly wrong down in Android's Bluetooth stack."); + mIsReconnecting = true; + mIsConnected = false; + gatt.disconnect(); + mGatt = connectGatt(false); + } + else { + probeService(this); + } + } + } + + public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { + //Log.v(TAG, "onCharacteristicRead status=" + status + " uuid=" + characteristic.getUuid()); + + if (characteristic.getUuid().equals(reportCharacteristic) && !mFrozen) { + mManager.HIDDeviceFeatureReport(getId(), characteristic.getValue()); + } + + finishCurrentGattOperation(); + } + + public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { + //Log.v(TAG, "onCharacteristicWrite status=" + status + " uuid=" + characteristic.getUuid()); + + if (characteristic.getUuid().equals(reportCharacteristic)) { + // Only register controller with the native side once it has been fully configured + if (!isRegistered()) { + Log.v(TAG, "Registering Steam Controller with ID: " + getId()); + mManager.HIDDeviceConnected(getId(), getIdentifier(), getVendorId(), getProductId(), getSerialNumber(), getVersion(), getManufacturerName(), getProductName(), 0, 0, 0, 0); + setRegistered(); + } + } + + finishCurrentGattOperation(); + } + + public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { + // Enable this for verbose logging of controller input reports + //Log.v(TAG, "onCharacteristicChanged uuid=" + characteristic.getUuid() + " data=" + HexDump.dumpHexString(characteristic.getValue())); + + if (characteristic.getUuid().equals(inputCharacteristic) && !mFrozen) { + mManager.HIDDeviceInputReport(getId(), characteristic.getValue()); + } + } + + public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { + //Log.v(TAG, "onDescriptorRead status=" + status); + } + + public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { + BluetoothGattCharacteristic chr = descriptor.getCharacteristic(); + //Log.v(TAG, "onDescriptorWrite status=" + status + " uuid=" + chr.getUuid() + " descriptor=" + descriptor.getUuid()); + + if (chr.getUuid().equals(inputCharacteristic)) { + boolean hasWrittenInputDescriptor = true; + BluetoothGattCharacteristic reportChr = chr.getService().getCharacteristic(reportCharacteristic); + if (reportChr != null) { + Log.v(TAG, "Writing report characteristic to enter valve mode"); + reportChr.setValue(enterValveMode); + gatt.writeCharacteristic(reportChr); + } + } + + finishCurrentGattOperation(); + } + + public void onReliableWriteCompleted(BluetoothGatt gatt, int status) { + //Log.v(TAG, "onReliableWriteCompleted status=" + status); + } + + public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { + //Log.v(TAG, "onReadRemoteRssi status=" + status); + } + + public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) { + //Log.v(TAG, "onMtuChanged status=" + status); + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + //////// Public API + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public int getId() { + return mDeviceId; + } + + @Override + public int getVendorId() { + // Valve Corporation + final int VALVE_USB_VID = 0x28DE; + return VALVE_USB_VID; + } + + @Override + public int getProductId() { + // We don't have an easy way to query from the Bluetooth device, but we know what it is + final int D0G_BLE2_PID = 0x1106; + return D0G_BLE2_PID; + } + + @Override + public String getSerialNumber() { + // This will be read later via feature report by Steam + return "12345"; + } + + @Override + public int getVersion() { + return 0; + } + + @Override + public String getManufacturerName() { + return "Valve Corporation"; + } + + @Override + public String getProductName() { + return "Steam Controller"; + } + + @Override + public UsbDevice getDevice() { + return null; + } + + @Override + public boolean open() { + return true; + } + + @Override + public int sendFeatureReport(byte[] report) { + if (!isRegistered()) { + Log.e(TAG, "Attempted sendFeatureReport before Steam Controller is registered!"); + if (mIsConnected) { + probeService(this); + } + return -1; + } + + // We need to skip the first byte, as that doesn't go over the air + byte[] actual_report = Arrays.copyOfRange(report, 1, report.length - 1); + //Log.v(TAG, "sendFeatureReport " + HexDump.dumpHexString(actual_report)); + writeCharacteristic(reportCharacteristic, actual_report); + return report.length; + } + + @Override + public int sendOutputReport(byte[] report) { + if (!isRegistered()) { + Log.e(TAG, "Attempted sendOutputReport before Steam Controller is registered!"); + if (mIsConnected) { + probeService(this); + } + return -1; + } + + //Log.v(TAG, "sendFeatureReport " + HexDump.dumpHexString(report)); + writeCharacteristic(reportCharacteristic, report); + return report.length; + } + + @Override + public boolean getFeatureReport(byte[] report) { + if (!isRegistered()) { + Log.e(TAG, "Attempted getFeatureReport before Steam Controller is registered!"); + if (mIsConnected) { + probeService(this); + } + return false; + } + + //Log.v(TAG, "getFeatureReport"); + readCharacteristic(reportCharacteristic); + return true; + } + + @Override + public void close() { + } + + @Override + public void setFrozen(boolean frozen) { + mFrozen = frozen; + } + + @Override + public void shutdown() { + close(); + + BluetoothGatt g = mGatt; + if (g != null) { + g.disconnect(); + g.close(); + mGatt = null; + } + mManager = null; + mIsRegistered = false; + mIsConnected = false; + mOperations.clear(); + } + +} + diff --git a/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java b/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java new file mode 100644 index 0000000..56f677e --- /dev/null +++ b/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java @@ -0,0 +1,669 @@ +package org.libsdl.app; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.PendingIntent; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.util.Log; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.hardware.usb.*; +import android.os.Handler; +import android.os.Looper; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class HIDDeviceManager { + private static final String TAG = "hidapi"; + private static final String ACTION_USB_PERMISSION = "org.libsdl.app.USB_PERMISSION"; + + private static HIDDeviceManager sManager; + private static int sManagerRefCount = 0; + + public static HIDDeviceManager acquire(Context context) { + if (sManagerRefCount == 0) { + sManager = new HIDDeviceManager(context); + } + ++sManagerRefCount; + return sManager; + } + + public static void release(HIDDeviceManager manager) { + if (manager == sManager) { + --sManagerRefCount; + if (sManagerRefCount == 0) { + sManager.close(); + sManager = null; + } + } + } + + private Context mContext; + private HashMap mDevicesById = new HashMap(); + private HashMap mBluetoothDevices = new HashMap(); + private int mNextDeviceId = 0; + private SharedPreferences mSharedPreferences = null; + private boolean mIsChromebook = false; + private UsbManager mUsbManager; + private Handler mHandler; + private BluetoothManager mBluetoothManager; + private List mLastBluetoothDevices; + + private final BroadcastReceiver mUsbBroadcast = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { + UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + handleUsbDeviceAttached(usbDevice); + } else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { + UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + handleUsbDeviceDetached(usbDevice); + } else if (action.equals(HIDDeviceManager.ACTION_USB_PERMISSION)) { + UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + handleUsbDevicePermission(usbDevice, intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)); + } + } + }; + + private final BroadcastReceiver mBluetoothBroadcast = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + // Bluetooth device was connected. If it was a Steam Controller, handle it + if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) { + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + Log.d(TAG, "Bluetooth device connected: " + device); + + if (isSteamController(device)) { + connectBluetoothDevice(device); + } + } + + // Bluetooth device was disconnected, remove from controller manager (if any) + if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) { + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + Log.d(TAG, "Bluetooth device disconnected: " + device); + + disconnectBluetoothDevice(device); + } + } + }; + + private HIDDeviceManager(final Context context) { + mContext = context; + + // Make sure we have the HIDAPI library loaded with the native functions + try { + SDL.loadLibrary("hidapi"); + } catch (Throwable e) { + Log.w(TAG, "Couldn't load hidapi: " + e.toString()); + + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setCancelable(false); + builder.setTitle("SDL HIDAPI Error"); + builder.setMessage("Please report the following error to the SDL maintainers: " + e.getMessage()); + builder.setNegativeButton("Quit", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + try { + // If our context is an activity, exit rather than crashing when we can't + // call our native functions. + Activity activity = (Activity)context; + + activity.finish(); + } + catch (ClassCastException cce) { + // Context wasn't an activity, there's nothing we can do. Give up and return. + } + } + }); + builder.show(); + + return; + } + + HIDDeviceRegisterCallback(); + + mSharedPreferences = mContext.getSharedPreferences("hidapi", Context.MODE_PRIVATE); + mIsChromebook = mContext.getPackageManager().hasSystemFeature("org.chromium.arc.device_management"); + +// if (shouldClear) { +// SharedPreferences.Editor spedit = mSharedPreferences.edit(); +// spedit.clear(); +// spedit.commit(); +// } +// else + { + mNextDeviceId = mSharedPreferences.getInt("next_device_id", 0); + } + + initializeUSB(); + initializeBluetooth(); + } + + public Context getContext() { + return mContext; + } + + public int getDeviceIDForIdentifier(String identifier) { + SharedPreferences.Editor spedit = mSharedPreferences.edit(); + + int result = mSharedPreferences.getInt(identifier, 0); + if (result == 0) { + result = mNextDeviceId++; + spedit.putInt("next_device_id", mNextDeviceId); + } + + spedit.putInt(identifier, result); + spedit.commit(); + return result; + } + + private void initializeUSB() { + mUsbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE); + + /* + // Logging + for (UsbDevice device : mUsbManager.getDeviceList().values()) { + Log.i(TAG,"Path: " + device.getDeviceName()); + Log.i(TAG,"Manufacturer: " + device.getManufacturerName()); + Log.i(TAG,"Product: " + device.getProductName()); + Log.i(TAG,"ID: " + device.getDeviceId()); + Log.i(TAG,"Class: " + device.getDeviceClass()); + Log.i(TAG,"Protocol: " + device.getDeviceProtocol()); + Log.i(TAG,"Vendor ID " + device.getVendorId()); + Log.i(TAG,"Product ID: " + device.getProductId()); + Log.i(TAG,"Interface count: " + device.getInterfaceCount()); + Log.i(TAG,"---------------------------------------"); + + // Get interface details + for (int index = 0; index < device.getInterfaceCount(); index++) { + UsbInterface mUsbInterface = device.getInterface(index); + Log.i(TAG," ***** *****"); + Log.i(TAG," Interface index: " + index); + Log.i(TAG," Interface ID: " + mUsbInterface.getId()); + Log.i(TAG," Interface class: " + mUsbInterface.getInterfaceClass()); + Log.i(TAG," Interface subclass: " + mUsbInterface.getInterfaceSubclass()); + Log.i(TAG," Interface protocol: " + mUsbInterface.getInterfaceProtocol()); + Log.i(TAG," Endpoint count: " + mUsbInterface.getEndpointCount()); + + // Get endpoint details + for (int epi = 0; epi < mUsbInterface.getEndpointCount(); epi++) + { + UsbEndpoint mEndpoint = mUsbInterface.getEndpoint(epi); + Log.i(TAG," ++++ ++++ ++++"); + Log.i(TAG," Endpoint index: " + epi); + Log.i(TAG," Attributes: " + mEndpoint.getAttributes()); + Log.i(TAG," Direction: " + mEndpoint.getDirection()); + Log.i(TAG," Number: " + mEndpoint.getEndpointNumber()); + Log.i(TAG," Interval: " + mEndpoint.getInterval()); + Log.i(TAG," Packet size: " + mEndpoint.getMaxPacketSize()); + Log.i(TAG," Type: " + mEndpoint.getType()); + } + } + } + Log.i(TAG," No more devices connected."); + */ + + // Register for USB broadcasts and permission completions + IntentFilter filter = new IntentFilter(); + filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); + filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); + filter.addAction(HIDDeviceManager.ACTION_USB_PERMISSION); + mContext.registerReceiver(mUsbBroadcast, filter); + + for (UsbDevice usbDevice : mUsbManager.getDeviceList().values()) { + handleUsbDeviceAttached(usbDevice); + } + } + + UsbManager getUSBManager() { + return mUsbManager; + } + + private void shutdownUSB() { + try { + mContext.unregisterReceiver(mUsbBroadcast); + } catch (Exception e) { + // We may not have registered, that's okay + } + } + + private boolean isHIDDeviceInterface(UsbDevice usbDevice, UsbInterface usbInterface) { + if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_HID) { + return true; + } + if (isXbox360Controller(usbDevice, usbInterface) || isXboxOneController(usbDevice, usbInterface)) { + return true; + } + return false; + } + + private boolean isXbox360Controller(UsbDevice usbDevice, UsbInterface usbInterface) { + final int XB360_IFACE_SUBCLASS = 93; + final int XB360_IFACE_PROTOCOL = 1; // Wired + final int XB360W_IFACE_PROTOCOL = 129; // Wireless + final int[] SUPPORTED_VENDORS = { + 0x0079, // GPD Win 2 + 0x044f, // Thrustmaster + 0x045e, // Microsoft + 0x046d, // Logitech + 0x056e, // Elecom + 0x06a3, // Saitek + 0x0738, // Mad Catz + 0x07ff, // Mad Catz + 0x0e6f, // PDP + 0x0f0d, // Hori + 0x1038, // SteelSeries + 0x11c9, // Nacon + 0x12ab, // Unknown + 0x1430, // RedOctane + 0x146b, // BigBen + 0x1532, // Razer Sabertooth + 0x15e4, // Numark + 0x162e, // Joytech + 0x1689, // Razer Onza + 0x1bad, // Harmonix + 0x24c6, // PowerA + }; + + if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC && + usbInterface.getInterfaceSubclass() == XB360_IFACE_SUBCLASS && + (usbInterface.getInterfaceProtocol() == XB360_IFACE_PROTOCOL || + usbInterface.getInterfaceProtocol() == XB360W_IFACE_PROTOCOL)) { + int vendor_id = usbDevice.getVendorId(); + for (int supportedVid : SUPPORTED_VENDORS) { + if (vendor_id == supportedVid) { + return true; + } + } + } + return false; + } + + private boolean isXboxOneController(UsbDevice usbDevice, UsbInterface usbInterface) { + final int XB1_IFACE_SUBCLASS = 71; + final int XB1_IFACE_PROTOCOL = 208; + final int[] SUPPORTED_VENDORS = { + 0x045e, // Microsoft + 0x0738, // Mad Catz + 0x0e6f, // PDP + 0x0f0d, // Hori + 0x1532, // Razer Wildcat + 0x24c6, // PowerA + 0x2e24, // Hyperkin + }; + + if (usbInterface.getId() == 0 && + usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC && + usbInterface.getInterfaceSubclass() == XB1_IFACE_SUBCLASS && + usbInterface.getInterfaceProtocol() == XB1_IFACE_PROTOCOL) { + int vendor_id = usbDevice.getVendorId(); + for (int supportedVid : SUPPORTED_VENDORS) { + if (vendor_id == supportedVid) { + return true; + } + } + } + return false; + } + + private void handleUsbDeviceAttached(UsbDevice usbDevice) { + connectHIDDeviceUSB(usbDevice); + } + + private void handleUsbDeviceDetached(UsbDevice usbDevice) { + List devices = new ArrayList(); + for (HIDDevice device : mDevicesById.values()) { + if (usbDevice.equals(device.getDevice())) { + devices.add(device.getId()); + } + } + for (int id : devices) { + HIDDevice device = mDevicesById.get(id); + mDevicesById.remove(id); + device.shutdown(); + HIDDeviceDisconnected(id); + } + } + + private void handleUsbDevicePermission(UsbDevice usbDevice, boolean permission_granted) { + for (HIDDevice device : mDevicesById.values()) { + if (usbDevice.equals(device.getDevice())) { + boolean opened = false; + if (permission_granted) { + opened = device.open(); + } + HIDDeviceOpenResult(device.getId(), opened); + } + } + } + + private void connectHIDDeviceUSB(UsbDevice usbDevice) { + synchronized (this) { + for (int interface_index = 0; interface_index < usbDevice.getInterfaceCount(); interface_index++) { + UsbInterface usbInterface = usbDevice.getInterface(interface_index); + if (isHIDDeviceInterface(usbDevice, usbInterface)) { + HIDDeviceUSB device = new HIDDeviceUSB(this, usbDevice, interface_index); + int id = device.getId(); + mDevicesById.put(id, device); + HIDDeviceConnected(id, device.getIdentifier(), device.getVendorId(), device.getProductId(), device.getSerialNumber(), device.getVersion(), device.getManufacturerName(), device.getProductName(), usbInterface.getId(), usbInterface.getInterfaceClass(), usbInterface.getInterfaceSubclass(), usbInterface.getInterfaceProtocol()); + } + } + } + } + + private void initializeBluetooth() { + Log.d(TAG, "Initializing Bluetooth"); + + if (mContext.getPackageManager().checkPermission(android.Manifest.permission.BLUETOOTH, mContext.getPackageName()) != PackageManager.PERMISSION_GRANTED) { + Log.d(TAG, "Couldn't initialize Bluetooth, missing android.permission.BLUETOOTH"); + return; + } + + // Find bonded bluetooth controllers and create SteamControllers for them + mBluetoothManager = (BluetoothManager)mContext.getSystemService(Context.BLUETOOTH_SERVICE); + if (mBluetoothManager == null) { + // This device doesn't support Bluetooth. + return; + } + + BluetoothAdapter btAdapter = mBluetoothManager.getAdapter(); + if (btAdapter == null) { + // This device has Bluetooth support in the codebase, but has no available adapters. + return; + } + + // Get our bonded devices. + for (BluetoothDevice device : btAdapter.getBondedDevices()) { + + Log.d(TAG, "Bluetooth device available: " + device); + if (isSteamController(device)) { + connectBluetoothDevice(device); + } + + } + + // NOTE: These don't work on Chromebooks, to my undying dismay. + IntentFilter filter = new IntentFilter(); + filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); + filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); + mContext.registerReceiver(mBluetoothBroadcast, filter); + + if (mIsChromebook) { + mHandler = new Handler(Looper.getMainLooper()); + mLastBluetoothDevices = new ArrayList(); + + // final HIDDeviceManager finalThis = this; + // mHandler.postDelayed(new Runnable() { + // @Override + // public void run() { + // finalThis.chromebookConnectionHandler(); + // } + // }, 5000); + } + } + + private void shutdownBluetooth() { + try { + mContext.unregisterReceiver(mBluetoothBroadcast); + } catch (Exception e) { + // We may not have registered, that's okay + } + } + + // Chromebooks do not pass along ACTION_ACL_CONNECTED / ACTION_ACL_DISCONNECTED properly. + // This function provides a sort of dummy version of that, watching for changes in the + // connected devices and attempting to add controllers as things change. + public void chromebookConnectionHandler() { + if (!mIsChromebook) { + return; + } + + ArrayList disconnected = new ArrayList(); + ArrayList connected = new ArrayList(); + + List currentConnected = mBluetoothManager.getConnectedDevices(BluetoothProfile.GATT); + + for (BluetoothDevice bluetoothDevice : currentConnected) { + if (!mLastBluetoothDevices.contains(bluetoothDevice)) { + connected.add(bluetoothDevice); + } + } + for (BluetoothDevice bluetoothDevice : mLastBluetoothDevices) { + if (!currentConnected.contains(bluetoothDevice)) { + disconnected.add(bluetoothDevice); + } + } + + mLastBluetoothDevices = currentConnected; + + for (BluetoothDevice bluetoothDevice : disconnected) { + disconnectBluetoothDevice(bluetoothDevice); + } + for (BluetoothDevice bluetoothDevice : connected) { + connectBluetoothDevice(bluetoothDevice); + } + + final HIDDeviceManager finalThis = this; + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + finalThis.chromebookConnectionHandler(); + } + }, 10000); + } + + public boolean connectBluetoothDevice(BluetoothDevice bluetoothDevice) { + Log.v(TAG, "connectBluetoothDevice device=" + bluetoothDevice); + synchronized (this) { + if (mBluetoothDevices.containsKey(bluetoothDevice)) { + Log.v(TAG, "Steam controller with address " + bluetoothDevice + " already exists, attempting reconnect"); + + HIDDeviceBLESteamController device = mBluetoothDevices.get(bluetoothDevice); + device.reconnect(); + + return false; + } + HIDDeviceBLESteamController device = new HIDDeviceBLESteamController(this, bluetoothDevice); + int id = device.getId(); + mBluetoothDevices.put(bluetoothDevice, device); + mDevicesById.put(id, device); + + // The Steam Controller will mark itself connected once initialization is complete + } + return true; + } + + public void disconnectBluetoothDevice(BluetoothDevice bluetoothDevice) { + synchronized (this) { + HIDDeviceBLESteamController device = mBluetoothDevices.get(bluetoothDevice); + if (device == null) + return; + + int id = device.getId(); + mBluetoothDevices.remove(bluetoothDevice); + mDevicesById.remove(id); + device.shutdown(); + HIDDeviceDisconnected(id); + } + } + + public boolean isSteamController(BluetoothDevice bluetoothDevice) { + // Sanity check. If you pass in a null device, by definition it is never a Steam Controller. + if (bluetoothDevice == null) { + return false; + } + + // If the device has no local name, we really don't want to try an equality check against it. + if (bluetoothDevice.getName() == null) { + return false; + } + + return bluetoothDevice.getName().equals("SteamController") && ((bluetoothDevice.getType() & BluetoothDevice.DEVICE_TYPE_LE) != 0); + } + + private void close() { + shutdownUSB(); + shutdownBluetooth(); + synchronized (this) { + for (HIDDevice device : mDevicesById.values()) { + device.shutdown(); + } + mDevicesById.clear(); + mBluetoothDevices.clear(); + HIDDeviceReleaseCallback(); + } + } + + public void setFrozen(boolean frozen) { + synchronized (this) { + for (HIDDevice device : mDevicesById.values()) { + device.setFrozen(frozen); + } + } + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + private HIDDevice getDevice(int id) { + synchronized (this) { + HIDDevice result = mDevicesById.get(id); + if (result == null) { + Log.v(TAG, "No device for id: " + id); + Log.v(TAG, "Available devices: " + mDevicesById.keySet()); + } + return result; + } + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////// JNI interface functions + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + public boolean openDevice(int deviceID) { + Log.v(TAG, "openDevice deviceID=" + deviceID); + HIDDevice device = getDevice(deviceID); + if (device == null) { + HIDDeviceDisconnected(deviceID); + return false; + } + + // Look to see if this is a USB device and we have permission to access it + UsbDevice usbDevice = device.getDevice(); + if (usbDevice != null && !mUsbManager.hasPermission(usbDevice)) { + HIDDeviceOpenPending(deviceID); + try { + mUsbManager.requestPermission(usbDevice, PendingIntent.getBroadcast(mContext, 0, new Intent(HIDDeviceManager.ACTION_USB_PERMISSION), 0)); + } catch (Exception e) { + Log.v(TAG, "Couldn't request permission for USB device " + usbDevice); + HIDDeviceOpenResult(deviceID, false); + } + return false; + } + + try { + return device.open(); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + } + return false; + } + + public int sendOutputReport(int deviceID, byte[] report) { + try { + //Log.v(TAG, "sendOutputReport deviceID=" + deviceID + " length=" + report.length); + HIDDevice device; + device = getDevice(deviceID); + if (device == null) { + HIDDeviceDisconnected(deviceID); + return -1; + } + + return device.sendOutputReport(report); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + } + return -1; + } + + public int sendFeatureReport(int deviceID, byte[] report) { + try { + //Log.v(TAG, "sendFeatureReport deviceID=" + deviceID + " length=" + report.length); + HIDDevice device; + device = getDevice(deviceID); + if (device == null) { + HIDDeviceDisconnected(deviceID); + return -1; + } + + return device.sendFeatureReport(report); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + } + return -1; + } + + public boolean getFeatureReport(int deviceID, byte[] report) { + try { + //Log.v(TAG, "getFeatureReport deviceID=" + deviceID); + HIDDevice device; + device = getDevice(deviceID); + if (device == null) { + HIDDeviceDisconnected(deviceID); + return false; + } + + return device.getFeatureReport(report); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + } + return false; + } + + public void closeDevice(int deviceID) { + try { + Log.v(TAG, "closeDevice deviceID=" + deviceID); + HIDDevice device; + device = getDevice(deviceID); + if (device == null) { + HIDDeviceDisconnected(deviceID); + return; + } + + device.close(); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + } + } + + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////// Native methods + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + private native void HIDDeviceRegisterCallback(); + private native void HIDDeviceReleaseCallback(); + + native void HIDDeviceConnected(int deviceID, String identifier, int vendorId, int productId, String serial_number, int release_number, String manufacturer_string, String product_string, int interface_number, int interface_class, int interface_subclass, int interface_protocol); + native void HIDDeviceOpenPending(int deviceID); + native void HIDDeviceOpenResult(int deviceID, boolean opened); + native void HIDDeviceDisconnected(int deviceID); + + native void HIDDeviceInputReport(int deviceID, byte[] report); + native void HIDDeviceFeatureReport(int deviceID, byte[] report); +} diff --git a/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java b/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java new file mode 100644 index 0000000..d20fe80 --- /dev/null +++ b/flare-android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java @@ -0,0 +1,309 @@ +package org.libsdl.app; + +import android.hardware.usb.*; +import android.os.Build; +import android.util.Log; +import java.util.Arrays; + +class HIDDeviceUSB implements HIDDevice { + + private static final String TAG = "hidapi"; + + protected HIDDeviceManager mManager; + protected UsbDevice mDevice; + protected int mInterfaceIndex; + protected int mInterface; + protected int mDeviceId; + protected UsbDeviceConnection mConnection; + protected UsbEndpoint mInputEndpoint; + protected UsbEndpoint mOutputEndpoint; + protected InputThread mInputThread; + protected boolean mRunning; + protected boolean mFrozen; + + public HIDDeviceUSB(HIDDeviceManager manager, UsbDevice usbDevice, int interface_index) { + mManager = manager; + mDevice = usbDevice; + mInterfaceIndex = interface_index; + mInterface = mDevice.getInterface(mInterfaceIndex).getId(); + mDeviceId = manager.getDeviceIDForIdentifier(getIdentifier()); + mRunning = false; + } + + public String getIdentifier() { + return String.format("%s/%x/%x/%d", mDevice.getDeviceName(), mDevice.getVendorId(), mDevice.getProductId(), mInterfaceIndex); + } + + @Override + public int getId() { + return mDeviceId; + } + + @Override + public int getVendorId() { + return mDevice.getVendorId(); + } + + @Override + public int getProductId() { + return mDevice.getProductId(); + } + + @Override + public String getSerialNumber() { + String result = null; + if (Build.VERSION.SDK_INT >= 21) { + try { + result = mDevice.getSerialNumber(); + } + catch (SecurityException exception) { + //Log.w(TAG, "App permissions mean we cannot get serial number for device " + getDeviceName() + " message: " + exception.getMessage()); + } + } + if (result == null) { + result = ""; + } + return result; + } + + @Override + public int getVersion() { + return 0; + } + + @Override + public String getManufacturerName() { + String result = null; + if (Build.VERSION.SDK_INT >= 21) { + result = mDevice.getManufacturerName(); + } + if (result == null) { + result = String.format("%x", getVendorId()); + } + return result; + } + + @Override + public String getProductName() { + String result = null; + if (Build.VERSION.SDK_INT >= 21) { + result = mDevice.getProductName(); + } + if (result == null) { + result = String.format("%x", getProductId()); + } + return result; + } + + @Override + public UsbDevice getDevice() { + return mDevice; + } + + public String getDeviceName() { + return getManufacturerName() + " " + getProductName() + "(0x" + String.format("%x", getVendorId()) + "/0x" + String.format("%x", getProductId()) + ")"; + } + + @Override + public boolean open() { + mConnection = mManager.getUSBManager().openDevice(mDevice); + if (mConnection == null) { + Log.w(TAG, "Unable to open USB device " + getDeviceName()); + return false; + } + + // Force claim our interface + UsbInterface iface = mDevice.getInterface(mInterfaceIndex); + if (!mConnection.claimInterface(iface, true)) { + Log.w(TAG, "Failed to claim interfaces on USB device " + getDeviceName()); + close(); + return false; + } + + // Find the endpoints + for (int j = 0; j < iface.getEndpointCount(); j++) { + UsbEndpoint endpt = iface.getEndpoint(j); + switch (endpt.getDirection()) { + case UsbConstants.USB_DIR_IN: + if (mInputEndpoint == null) { + mInputEndpoint = endpt; + } + break; + case UsbConstants.USB_DIR_OUT: + if (mOutputEndpoint == null) { + mOutputEndpoint = endpt; + } + break; + } + } + + // Make sure the required endpoints were present + if (mInputEndpoint == null || mOutputEndpoint == null) { + Log.w(TAG, "Missing required endpoint on USB device " + getDeviceName()); + close(); + return false; + } + + // Start listening for input + mRunning = true; + mInputThread = new InputThread(); + mInputThread.start(); + + return true; + } + + @Override + public int sendFeatureReport(byte[] report) { + int res = -1; + int offset = 0; + int length = report.length; + boolean skipped_report_id = false; + byte report_number = report[0]; + + if (report_number == 0x0) { + ++offset; + --length; + skipped_report_id = true; + } + + res = mConnection.controlTransfer( + UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_OUT, + 0x09/*HID set_report*/, + (3/*HID feature*/ << 8) | report_number, + mInterface, + report, offset, length, + 1000/*timeout millis*/); + + if (res < 0) { + Log.w(TAG, "sendFeatureReport() returned " + res + " on device " + getDeviceName()); + return -1; + } + + if (skipped_report_id) { + ++length; + } + return length; + } + + @Override + public int sendOutputReport(byte[] report) { + int r = mConnection.bulkTransfer(mOutputEndpoint, report, report.length, 1000); + if (r != report.length) { + Log.w(TAG, "sendOutputReport() returned " + r + " on device " + getDeviceName()); + } + return r; + } + + @Override + public boolean getFeatureReport(byte[] report) { + int res = -1; + int offset = 0; + int length = report.length; + boolean skipped_report_id = false; + byte report_number = report[0]; + + if (report_number == 0x0) { + /* Offset the return buffer by 1, so that the report ID + will remain in byte 0. */ + ++offset; + --length; + skipped_report_id = true; + } + + res = mConnection.controlTransfer( + UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_IN, + 0x01/*HID get_report*/, + (3/*HID feature*/ << 8) | report_number, + mInterface, + report, offset, length, + 1000/*timeout millis*/); + + if (res < 0) { + Log.w(TAG, "getFeatureReport() returned " + res + " on device " + getDeviceName()); + return false; + } + + if (skipped_report_id) { + ++res; + ++length; + } + + byte[] data; + if (res == length) { + data = report; + } else { + data = Arrays.copyOfRange(report, 0, res); + } + mManager.HIDDeviceFeatureReport(mDeviceId, data); + + return true; + } + + @Override + public void close() { + mRunning = false; + if (mInputThread != null) { + while (mInputThread.isAlive()) { + mInputThread.interrupt(); + try { + mInputThread.join(); + } catch (InterruptedException e) { + // Keep trying until we're done + } + } + mInputThread = null; + } + if (mConnection != null) { + UsbInterface iface = mDevice.getInterface(mInterfaceIndex); + mConnection.releaseInterface(iface); + mConnection.close(); + mConnection = null; + } + } + + @Override + public void shutdown() { + close(); + mManager = null; + } + + @Override + public void setFrozen(boolean frozen) { + mFrozen = frozen; + } + + protected class InputThread extends Thread { + @Override + public void run() { + int packetSize = mInputEndpoint.getMaxPacketSize(); + byte[] packet = new byte[packetSize]; + while (mRunning) { + int r; + try + { + r = mConnection.bulkTransfer(mInputEndpoint, packet, packetSize, 1000); + } + catch (Exception e) + { + Log.v(TAG, "Exception in UsbDeviceConnection bulktransfer: " + e); + break; + } + if (r < 0) { + // Could be a timeout or an I/O error + } + if (r > 0) { + byte[] data; + if (r == packetSize) { + data = packet; + } else { + data = Arrays.copyOfRange(packet, 0, r); + } + + if (!mFrozen) { + mManager.HIDDeviceInputReport(mDeviceId, data); + } + } + } + } + } +} diff --git a/flare-android-project/app/src/main/java/org/libsdl/app/SDL.java b/flare-android-project/app/src/main/java/org/libsdl/app/SDL.java index cfe4830..fb7f731 100644 --- a/flare-android-project/app/src/main/java/org/libsdl/app/SDL.java +++ b/flare-android-project/app/src/main/java/org/libsdl/app/SDL.java @@ -1,6 +1,8 @@ package org.libsdl.app; import android.content.Context; + +import java.lang.reflect.*; /** SDL library initialization @@ -33,5 +35,50 @@ return mContext; } + public static void loadLibrary(String libraryName) throws UnsatisfiedLinkError, SecurityException, NullPointerException { + + if (libraryName == null) { + throw new NullPointerException("No library name provided."); + } + + try { + // Let's see if we have ReLinker available in the project. This is necessary for + // some projects that have huge numbers of local libraries bundled, and thus may + // trip a bug in Android's native library loader which ReLinker works around. (If + // loadLibrary works properly, ReLinker will simply use the normal Android method + // internally.) + // + // To use ReLinker, just add it as a dependency. For more information, see + // https://github.com/KeepSafe/ReLinker for ReLinker's repository. + // + Class relinkClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker"); + Class relinkListenerClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker$LoadListener"); + Class contextClass = mContext.getClassLoader().loadClass("android.content.Context"); + Class stringClass = mContext.getClassLoader().loadClass("java.lang.String"); + + // Get a 'force' instance of the ReLinker, so we can ensure libraries are reinstalled if + // they've changed during updates. + Method forceMethod = relinkClass.getDeclaredMethod("force"); + Object relinkInstance = forceMethod.invoke(null); + Class relinkInstanceClass = relinkInstance.getClass(); + + // Actually load the library! + Method loadMethod = relinkInstanceClass.getDeclaredMethod("loadLibrary", contextClass, stringClass, stringClass, relinkListenerClass); + loadMethod.invoke(relinkInstance, mContext, libraryName, null, null); + } + catch (final Throwable e) { + // Fall back + try { + System.loadLibrary(libraryName); + } + catch (final UnsatisfiedLinkError ule) { + throw ule; + } + catch (final SecurityException se) { + throw se; + } + } + } + protected static Context mContext; } diff --git a/flare-android-project/app/src/main/java/org/libsdl/app/SDLActivity.java b/flare-android-project/app/src/main/java/org/libsdl/app/SDLActivity.java index 3ea99da..fa20779 100644 --- a/flare-android-project/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/flare-android-project/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -4,7 +4,9 @@ import java.io.InputStream; import java.util.Arrays; import java.util.Hashtable; +import java.util.Locale; import java.lang.reflect.Method; +import java.lang.Math; import android.app.*; import android.content.*; @@ -33,10 +35,11 @@ /** SDL Activity */ -public class SDLActivity extends Activity { +public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener { private static final String TAG = "SDL"; - public static boolean mIsResumedCalled, mIsSurfaceReady, mHasFocus; + public static boolean mIsResumedCalled, mHasFocus; + public static final boolean mHasMultiWindow = (Build.VERSION.SDK_INT >= 24); // Cursor types private static final int SDL_SYSTEM_CURSOR_NONE = -1; @@ -53,6 +56,15 @@ private static final int SDL_SYSTEM_CURSOR_NO = 10; private static final int SDL_SYSTEM_CURSOR_HAND = 11; + protected static final int SDL_ORIENTATION_UNKNOWN = 0; + protected static final int SDL_ORIENTATION_LANDSCAPE = 1; + protected static final int SDL_ORIENTATION_LANDSCAPE_FLIPPED = 2; + protected static final int SDL_ORIENTATION_PORTRAIT = 3; + protected static final int SDL_ORIENTATION_PORTRAIT_FLIPPED = 4; + + protected static int mCurrentOrientation; + protected static Locale mCurrentLocale; + // Handle the state of the native layer public enum NativeState { INIT, RESUMED, PAUSED @@ -61,14 +73,8 @@ public static NativeState mNextNativeState; public static NativeState mCurrentNativeState; - public static boolean mExitCalledFromJava; - /** If shared libraries (e.g. SDL or the native application) could not be loaded. */ public static boolean mBrokenLibraries; - - // If we want to separate mouse and touch events. - // This is only toggled in native code when a hint is set! - public static boolean mSeparateMouseAndTouch; // Main components protected static SDLActivity mSingleton; @@ -77,12 +83,28 @@ protected static boolean mScreenKeyboardShown; protected static ViewGroup mLayout; protected static SDLClipboardHandler mClipboardHandler; - protected static Hashtable mCursors; + protected static Hashtable mCursors; protected static int mLastCursorID; - + protected static SDLGenericMotionListener_API12 mMotionListener; + protected static HIDDeviceManager mHIDDeviceManager; // This is what SDL runs in. It invokes SDL_main(), eventually protected static Thread mSDLThread; + + protected static SDLGenericMotionListener_API12 getMotionListener() { + if (mMotionListener == null) { + if (Build.VERSION.SDK_INT >= 26) { + mMotionListener = new SDLGenericMotionListener_API26(); + } else + if (Build.VERSION.SDK_INT >= 24) { + mMotionListener = new SDLGenericMotionListener_API24(); + } else { + mMotionListener = new SDLGenericMotionListener_API12(); + } + } + + return mMotionListener; + } /** * This method returns the name of the shared object with the application entry point @@ -96,7 +118,7 @@ } else { library = "libmain.so"; } - return library; + return getContext().getApplicationInfo().nativeLibraryDir + "/" + library; } /** @@ -117,11 +139,13 @@ */ protected String[] getLibraries() { return new String[] { + "hidapi", "SDL2", - // "SDL2_image", - // "SDL2_mixer", + "SDL2_image", + "mpg123", // needed by SDL2_mixer + "SDL2_mixer", // "SDL2_net", - // "SDL2_ttf", + "SDL2_ttf", "main" }; } @@ -129,7 +153,7 @@ // Load the .so public void loadLibraries() { for (String lib : getLibraries()) { - System.loadLibrary(lib); + SDL.loadLibrary(lib); } } @@ -151,13 +175,11 @@ mTextEdit = null; mLayout = null; mClipboardHandler = null; - mCursors = new Hashtable(); + mCursors = new Hashtable(); mLastCursorID = 0; mSDLThread = null; - mExitCalledFromJava = false; mBrokenLibraries = false; mIsResumedCalled = false; - mIsSurfaceReady = false; mHasFocus = true; mNextNativeState = NativeState.INIT; mCurrentNativeState = NativeState.INIT; @@ -166,10 +188,16 @@ // Setup @Override protected void onCreate(Bundle savedInstanceState) { - Log.v(TAG, "Device: " + android.os.Build.DEVICE); - Log.v(TAG, "Model: " + android.os.Build.MODEL); + Log.v(TAG, "Device: " + Build.DEVICE); + Log.v(TAG, "Model: " + Build.MODEL); Log.v(TAG, "onCreate()"); super.onCreate(savedInstanceState); + + try { + Thread.currentThread().setName("SDLActivity"); + } catch (Exception e) { + Log.v(TAG, "modify thread properties failed " + e.toString()); + } // Load shared libraries String errorMsgBrokenLib = ""; @@ -218,12 +246,9 @@ mSingleton = this; SDL.setContext(this); - if (Build.VERSION.SDK_INT >= 11) { - mClipboardHandler = new SDLClipboardHandler_API11(); - } else { - /* Before API 11, no clipboard notification (eg no SDL_CLIPBOARDUPDATE) */ - mClipboardHandler = new SDLClipboardHandler_Old(); - } + mClipboardHandler = new SDLClipboardHandler_API11(); + + mHIDDeviceManager = HIDDeviceManager.acquire(this); // Set up the surface mSurface = new SDLSurface(getApplication()); @@ -231,9 +256,25 @@ mLayout = new RelativeLayout(this); mLayout.addView(mSurface); + // Get our current screen orientation and pass it down. + mCurrentOrientation = SDLActivity.getCurrentOrientation(); + // Only record current orientation + SDLActivity.onNativeOrientationChanged(mCurrentOrientation); + + try { + if (Build.VERSION.SDK_INT < 24) { + mCurrentLocale = getContext().getResources().getConfiguration().locale; + } else { + mCurrentLocale = getContext().getResources().getConfiguration().getLocales().get(0); + } + } catch(Exception ignored) { + } + setContentView(mLayout); setWindowStyle(false); + + getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this); // Get filename from "Open with" of another application Intent intent = getIntent(); @@ -246,35 +287,99 @@ } } + protected void pauseNativeThread() { + mNextNativeState = NativeState.PAUSED; + mIsResumedCalled = false; + + if (SDLActivity.mBrokenLibraries) { + return; + } + + SDLActivity.handleNativeState(); + } + + protected void resumeNativeThread() { + mNextNativeState = NativeState.RESUMED; + mIsResumedCalled = true; + + if (SDLActivity.mBrokenLibraries) { + return; + } + + SDLActivity.handleNativeState(); + } + // Events @Override protected void onPause() { Log.v(TAG, "onPause()"); super.onPause(); - mNextNativeState = NativeState.PAUSED; - mIsResumedCalled = false; - - if (SDLActivity.mBrokenLibraries) { - return; - } - - SDLActivity.handleNativeState(); + + if (mHIDDeviceManager != null) { + mHIDDeviceManager.setFrozen(true); + } + if (!mHasMultiWindow) { + pauseNativeThread(); + } } @Override protected void onResume() { Log.v(TAG, "onResume()"); super.onResume(); - mNextNativeState = NativeState.RESUMED; - mIsResumedCalled = true; - - if (SDLActivity.mBrokenLibraries) { - return; - } - - SDLActivity.handleNativeState(); - } - + + if (mHIDDeviceManager != null) { + mHIDDeviceManager.setFrozen(false); + } + if (!mHasMultiWindow) { + resumeNativeThread(); + } + } + + @Override + protected void onStop() { + Log.v(TAG, "onStop()"); + super.onStop(); + if (mHasMultiWindow) { + pauseNativeThread(); + } + } + + @Override + protected void onStart() { + Log.v(TAG, "onStart()"); + super.onStart(); + if (mHasMultiWindow) { + resumeNativeThread(); + } + } + + public static int getCurrentOrientation() { + final Context context = SDLActivity.getContext(); + final Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + + int result = SDL_ORIENTATION_UNKNOWN; + + switch (display.getRotation()) { + case Surface.ROTATION_0: + result = SDL_ORIENTATION_PORTRAIT; + break; + + case Surface.ROTATION_90: + result = SDL_ORIENTATION_LANDSCAPE; + break; + + case Surface.ROTATION_180: + result = SDL_ORIENTATION_PORTRAIT_FLIPPED; + break; + + case Surface.ROTATION_270: + result = SDL_ORIENTATION_LANDSCAPE_FLIPPED; + break; + } + + return result; + } @Override public void onWindowFocusChanged(boolean hasFocus) { @@ -285,14 +390,21 @@ return; } - SDLActivity.mHasFocus = hasFocus; + mHasFocus = hasFocus; if (hasFocus) { mNextNativeState = NativeState.RESUMED; + SDLActivity.getMotionListener().reclaimRelativeMouseModeIfNeeded(); + + SDLActivity.handleNativeState(); + nativeFocusChanged(true); + } else { - mNextNativeState = NativeState.PAUSED; - } - - SDLActivity.handleNativeState(); + nativeFocusChanged(false); + if (!mHasMultiWindow) { + mNextNativeState = NativeState.PAUSED; + SDLActivity.handleNativeState(); + } + } } @Override @@ -308,39 +420,87 @@ } @Override + public void onConfigurationChanged(Configuration newConfig) { + Log.v(TAG, "onConfigurationChanged()"); + super.onConfigurationChanged(newConfig); + + if (mCurrentLocale == null || !mCurrentLocale.equals(newConfig.locale)) { + mCurrentLocale = newConfig.locale; + SDLActivity.onNativeLocaleChanged(); + } + } + + @Override protected void onDestroy() { Log.v(TAG, "onDestroy()"); + if (mHIDDeviceManager != null) { + HIDDeviceManager.release(mHIDDeviceManager); + mHIDDeviceManager = null; + } + if (SDLActivity.mBrokenLibraries) { super.onDestroy(); - // Reset everything in case the user re opens the app - SDLActivity.initialize(); return; } - mNextNativeState = NativeState.PAUSED; - SDLActivity.handleNativeState(); - - // Send a quit message to the application - SDLActivity.mExitCalledFromJava = true; - SDLActivity.nativeQuit(); - - // Now wait for the SDL thread to quit if (SDLActivity.mSDLThread != null) { + + // Send Quit event to "SDLThread" thread + SDLActivity.nativeSendQuit(); + + // Wait for "SDLThread" thread to end try { SDLActivity.mSDLThread.join(); } catch(Exception e) { - Log.v(TAG, "Problem stopping thread: " + e); - } - SDLActivity.mSDLThread = null; - - //Log.v(TAG, "Finished waiting for SDL thread"); - } + Log.v(TAG, "Problem stopping SDLThread: " + e); + } + } + + SDLActivity.nativeQuit(); super.onDestroy(); - - // Reset everything in case the user re opens the app - SDLActivity.initialize(); + } + + @Override + public void onBackPressed() { + // Check if we want to block the back button in case of mouse right click. + // + // If we do, the normal hardware back button will no longer work and people have to use home, + // but the mouse right click will work. + // + String trapBack = SDLActivity.nativeGetHint("SDL_ANDROID_TRAP_BACK_BUTTON"); + if ((trapBack != null) && trapBack.equals("1")) { + // Exit and let the mouse handler handle this button (if appropriate) + return; + } + + // Default system back button behavior. + if (!isFinishing()) { + super.onBackPressed(); + } + } + + // Called by JNI from SDL. + public static void manualBackButton() { + mSingleton.pressBackButton(); + } + + // Used to get us onto the activity's main thread + public void pressBackButton() { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (!SDLActivity.this.isFinishing()) { + SDLActivity.this.superOnBackPressed(); + } + } + }); + } + + // Used to access the system back behavior. + public void superOnBackPressed() { + super.onBackPressed(); } @Override @@ -380,16 +540,19 @@ // Try a transition to paused state if (mNextNativeState == NativeState.PAUSED) { - nativePause(); - if (mSurface != null) + if (mSDLThread != null) { + nativePause(); + } + if (mSurface != null) { mSurface.handlePause(); + } mCurrentNativeState = mNextNativeState; return; } // Try a transition to resumed state if (mNextNativeState == NativeState.RESUMED) { - if (mIsSurfaceReady && mHasFocus && mIsResumedCalled) { + if (mSurface.mIsSurfaceReady && mHasFocus && mIsResumedCalled) { if (mSDLThread == null) { // This is the entry point to the C app. // Start up the C app thread and enable sensor input for the first time @@ -398,29 +561,29 @@ mSDLThread = new Thread(new SDLMain(), "SDLThread"); mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true); mSDLThread.start(); - } - - nativeResume(); - mSurface.handleResume(); + + // No nativeResume(), don't signal Android_ResumeSem + mSurface.handleResume(); + } else { + nativeResume(); + mSurface.handleResume(); + } + mCurrentNativeState = mNextNativeState; } } } - - /* The native thread has finished */ - public static void handleNativeExit() { - SDLActivity.mSDLThread = null; - mSingleton.finish(); - } - // Messages from the SDLMain thread static final int COMMAND_CHANGE_TITLE = 1; static final int COMMAND_CHANGE_WINDOW_STYLE = 2; static final int COMMAND_TEXTEDIT_HIDE = 3; + static final int COMMAND_CHANGE_SURFACEVIEW_FORMAT = 4; static final int COMMAND_SET_KEEP_SCREEN_ON = 5; protected static final int COMMAND_USER = 0x8000; + + protected static boolean mFullscreenModeActive; /** * This method is called by SDL if SDL did not handle a message itself. @@ -460,30 +623,31 @@ // This version of Android doesn't support the immersive fullscreen mode break; } -/* This needs more testing, per bug 4096 - Enabling fullscreen on Android causes the app to toggle fullscreen mode continuously in a loop - *** if (context instanceof Activity) { Window window = ((Activity) context).getWindow(); if (window != null) { if ((msg.obj instanceof Integer) && (((Integer) msg.obj).intValue() != 0)) { - int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_FULLSCREEN | - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - window.getDecorView().setSystemUiVisibility(flags); + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.INVISIBLE; + window.getDecorView().setSystemUiVisibility(flags); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + SDLActivity.mFullscreenModeActive = true; } else { - int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE; - window.getDecorView().setSystemUiVisibility(flags); + int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_VISIBLE; + window.getDecorView().setSystemUiVisibility(flags); + window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + SDLActivity.mFullscreenModeActive = false; } } } else { Log.e(TAG, "error handling message, getContext() returned no Activity"); } -***/ break; case COMMAND_TEXTEDIT_HIDE: if (mTextEdit != null) { @@ -494,8 +658,10 @@ InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0); - + mScreenKeyboardShown = false; + + mSurface.requestFocus(); } break; case COMMAND_SET_KEEP_SCREEN_ON: @@ -512,6 +678,32 @@ } break; } + case COMMAND_CHANGE_SURFACEVIEW_FORMAT: + { + int format = (Integer) msg.obj; + int pf; + + if (SDLActivity.mSurface == null) { + return; + } + + SurfaceHolder holder = SDLActivity.mSurface.getHolder(); + if (holder == null) { + return; + } + + if (format == 1) { + pf = PixelFormat.RGBA_8888; + } else if (format == 2) { + pf = PixelFormat.RGBX_8888; + } else { + pf = PixelFormat.RGB_565; + } + + holder.setFormat(pf); + + break; + } default: if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) { Log.e(TAG, "error handling message, command is " + msg.arg1); @@ -528,31 +720,94 @@ Message msg = commandHandler.obtainMessage(); msg.arg1 = command; msg.obj = data; - return commandHandler.sendMessage(msg); + boolean result = commandHandler.sendMessage(msg); + + if ((Build.VERSION.SDK_INT >= 19) && (command == COMMAND_CHANGE_WINDOW_STYLE)) { + // Ensure we don't return until the resize has actually happened, + // or 500ms have passed. + + boolean bShouldWait = false; + + if (data instanceof Integer) { + // Let's figure out if we're already laid out fullscreen or not. + Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + android.util.DisplayMetrics realMetrics = new android.util.DisplayMetrics(); + display.getRealMetrics( realMetrics ); + + boolean bFullscreenLayout = ((realMetrics.widthPixels == mSurface.getWidth()) && + (realMetrics.heightPixels == mSurface.getHeight())); + + if (((Integer)data).intValue() == 1) { + // If we aren't laid out fullscreen or actively in fullscreen mode already, we're going + // to change size and should wait for surfaceChanged() before we return, so the size + // is right back in native code. If we're already laid out fullscreen, though, we're + // not going to change size even if we change decor modes, so we shouldn't wait for + // surfaceChanged() -- which may not even happen -- and should return immediately. + bShouldWait = !bFullscreenLayout; + } + else { + // If we're laid out fullscreen (even if the status bar and nav bar are present), + // or are actively in fullscreen, we're going to change size and should wait for + // surfaceChanged before we return, so the size is right back in native code. + bShouldWait = bFullscreenLayout; + } + } + + if (bShouldWait && (SDLActivity.getContext() != null)) { + // We'll wait for the surfaceChanged() method, which will notify us + // when called. That way, we know our current size is really the + // size we need, instead of grabbing a size that's still got + // the navigation and/or status bars before they're hidden. + // + // We'll wait for up to half a second, because some devices + // take a surprisingly long time for the surface resize, but + // then we'll just give up and return. + // + synchronized(SDLActivity.getContext()) { + try { + SDLActivity.getContext().wait(500); + } + catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + } + } + + return result; } // C functions we call public static native int nativeSetupJNI(); public static native int nativeRunMain(String library, String function, Object arguments); public static native void nativeLowMemory(); + public static native void nativeSendQuit(); public static native void nativeQuit(); public static native void nativePause(); public static native void nativeResume(); + public static native void nativeFocusChanged(boolean hasFocus); public static native void onNativeDropFile(String filename); - public static native void onNativeResize(int x, int y, int format, float rate); + public static native void nativeSetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, int format, float rate); + public static native void onNativeResize(); public static native void onNativeKeyDown(int keycode); public static native void onNativeKeyUp(int keycode); + public static native boolean onNativeSoftReturnKey(); public static native void onNativeKeyboardFocusLost(); - public static native void onNativeMouse(int button, int action, float x, float y); + public static native void onNativeMouse(int button, int action, float x, float y, boolean relative); public static native void onNativeTouch(int touchDevId, int pointerFingerId, int action, float x, float y, float p); public static native void onNativeAccel(float x, float y, float z); public static native void onNativeClipboardChanged(); + public static native void onNativeSurfaceCreated(); public static native void onNativeSurfaceChanged(); public static native void onNativeSurfaceDestroyed(); public static native String nativeGetHint(String name); public static native void nativeSetenv(String name, String value); + public static native void onNativeOrientationChanged(int orientation); + public static native void nativeAddTouch(int touchId, String name); + public static native void nativePermissionResult(int requestCode, boolean result); + public static native void onNativeLocaleChanged(); /** * This method is called by SDL using JNI. @@ -573,7 +828,7 @@ /** * This method is called by SDL using JNI. * This is a static method for JNI convenience, it calls a non-static method - * so that is can be overridden + * so that is can be overridden */ public static void setOrientation(int w, int h, boolean resizable, String hint) { @@ -581,52 +836,113 @@ mSingleton.setOrientationBis(w, h, resizable, hint); } } - + /** * This can be overridden */ - public void setOrientationBis(int w, int h, boolean resizable, String hint) + public void setOrientationBis(int w, int h, boolean resizable, String hint) { - int orientation = -1; - + int orientation_landscape = -1; + int orientation_portrait = -1; + + /* If set, hint "explicitly controls which UI orientations are allowed". */ if (hint.contains("LandscapeRight") && hint.contains("LandscapeLeft")) { - orientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE; + orientation_landscape = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE; } else if (hint.contains("LandscapeRight")) { - orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; + orientation_landscape = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } else if (hint.contains("LandscapeLeft")) { - orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; - } else if (hint.contains("Portrait") && hint.contains("PortraitUpsideDown")) { - orientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT; + orientation_landscape = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; + } + + if (hint.contains("Portrait") && hint.contains("PortraitUpsideDown")) { + orientation_portrait = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT; } else if (hint.contains("Portrait")) { - orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; + orientation_portrait = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; } else if (hint.contains("PortraitUpsideDown")) { - orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; - } - - /* no valid hint */ - if (orientation == -1) { + orientation_portrait = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; + } + + boolean is_landscape_allowed = (orientation_landscape == -1 ? false : true); + boolean is_portrait_allowed = (orientation_portrait == -1 ? false : true); + int req = -1; /* Requested orientation */ + + /* No valid hint, nothing is explicitly allowed */ + if (!is_portrait_allowed && !is_landscape_allowed) { if (resizable) { - /* no fixed orientation */ + /* All orientations are allowed */ + req = ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR; } else { - if (w > h) { - orientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE; + /* Fixed window and nothing specified. Get orientation from w/h of created window */ + req = (w > h ? ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); + } + } else { + /* At least one orientation is allowed */ + if (resizable) { + if (is_portrait_allowed && is_landscape_allowed) { + /* hint allows both landscape and portrait, promote to full sensor */ + req = ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR; } else { - orientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT; - } - } - } - - Log.v("SDL", "setOrientation() orientation=" + orientation + " width=" + w +" height="+ h +" resizable=" + resizable + " hint=" + hint); - if (orientation != -1) { - mSingleton.setRequestedOrientation(orientation); - } - } - - - /** - * This method is called by SDL using JNI. - */ - public static boolean isScreenKeyboardShown() + /* Use the only one allowed "orientation" */ + req = (is_landscape_allowed ? orientation_landscape : orientation_portrait); + } + } else { + /* Fixed window and both orientations are allowed. Choose one. */ + if (is_portrait_allowed && is_landscape_allowed) { + req = (w > h ? orientation_landscape : orientation_portrait); + } else { + /* Use the only one allowed "orientation" */ + req = (is_landscape_allowed ? orientation_landscape : orientation_portrait); + } + } + } + + Log.v(TAG, "setOrientation() requestedOrientation=" + req + " width=" + w +" height="+ h +" resizable=" + resizable + " hint=" + hint); + mSingleton.setRequestedOrientation(req); + } + + /** + * This method is called by SDL using JNI. + */ + public static void minimizeWindow() { + + if (mSingleton == null) { + return; + } + + Intent startMain = new Intent(Intent.ACTION_MAIN); + startMain.addCategory(Intent.CATEGORY_HOME); + startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mSingleton.startActivity(startMain); + } + + /** + * This method is called by SDL using JNI. + */ + public static boolean shouldMinimizeOnFocusLoss() { +/* + if (Build.VERSION.SDK_INT >= 24) { + if (mSingleton == null) { + return true; + } + + if (mSingleton.isInMultiWindowMode()) { + return false; + } + + if (mSingleton.isInPictureInPictureMode()) { + return false; + } + } + + return true; +*/ + return false; + } + + /** + * This method is called by SDL using JNI. + */ + public static boolean isScreenKeyboardShown() { if (mTextEdit == null) { return false; @@ -644,6 +960,42 @@ /** * This method is called by SDL using JNI. */ + public static boolean supportsRelativeMouse() + { + // ChromeOS doesn't provide relative mouse motion via the Android 7 APIs + if (isChromebook()) { + return false; + } + + // DeX mode in Samsung Experience 9.0 and earlier doesn't support relative mice properly under + // Android 7 APIs, and simply returns no data under Android 8 APIs. + // + // This is fixed in Samsung Experience 9.5, which corresponds to Android 8.1.0, and + // thus SDK version 27. If we are in DeX mode and not API 27 or higher, as a result, + // we should stick to relative mode. + // + if ((Build.VERSION.SDK_INT < 27) && isDeXMode()) { + return false; + } + + return SDLActivity.getMotionListener().supportsRelativeMouse(); + } + + /** + * This method is called by SDL using JNI. + */ + public static boolean setRelativeMouseEnabled(boolean enabled) + { + if (enabled && !supportsRelativeMouse()) { + return false; + } + + return SDLActivity.getMotionListener().setRelativeMouseEnabled(enabled); + } + + /** + * This method is called by SDL using JNI. + */ public static boolean sendMessage(int command, int param) { if (mSingleton == null) { return false; @@ -663,7 +1015,66 @@ */ public static boolean isAndroidTV() { UiModeManager uiModeManager = (UiModeManager) getContext().getSystemService(UI_MODE_SERVICE); - return (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION); + if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) { + return true; + } + if (Build.MANUFACTURER.equals("MINIX") && Build.MODEL.equals("NEO-U1")) { + return true; + } + if (Build.MANUFACTURER.equals("Amlogic") && Build.MODEL.equals("X96-W")) { + return true; + } + if (Build.MANUFACTURER.equals("Amlogic") && Build.MODEL.startsWith("TV")) { + return true; + } + return false; + } + + /** + * This method is called by SDL using JNI. + */ + public static boolean isTablet() { + DisplayMetrics metrics = new DisplayMetrics(); + Activity activity = (Activity)getContext(); + if (activity == null) { + return false; + } + activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); + + double dWidthInches = metrics.widthPixels / (double)metrics.xdpi; + double dHeightInches = metrics.heightPixels / (double)metrics.ydpi; + + double dDiagonal = Math.sqrt((dWidthInches * dWidthInches) + (dHeightInches * dHeightInches)); + + // If our diagonal size is seven inches or greater, we consider ourselves a tablet. + return (dDiagonal >= 7.0); + } + + /** + * This method is called by SDL using JNI. + */ + public static boolean isChromebook() { + if (getContext() == null) { + return false; + } + return getContext().getPackageManager().hasSystemFeature("org.chromium.arc.device_management"); + } + + /** + * This method is called by SDL using JNI. + */ + public static boolean isDeXMode() { + if (Build.VERSION.SDK_INT < 24) { + return false; + } + try { + final Configuration config = getContext().getResources().getConfiguration(); + final Class configClass = config.getClass(); + return configClass.getField("SEM_DESKTOP_MODE_ENABLED").getInt(configClass) + == configClass.getField("semDesktopModeEnabled").getInt(config); + } catch(Exception ignored) { + return false; + } } /** @@ -678,6 +1089,10 @@ */ public static boolean getManifestEnvironmentVariables() { try { + if (getContext() == null) { + return false; + } + ApplicationInfo applicationInfo = getContext().getPackageManager().getApplicationInfo(getContext().getPackageName(), PackageManager.GET_META_DATA); Bundle bundle = applicationInfo.metaData; if (bundle == null) { @@ -693,11 +1108,17 @@ } } /* environment variables set! */ - return true; + return true; } catch (Exception e) { - Log.v("SDL", "exception " + e.toString()); + Log.v(TAG, "exception " + e.toString()); } return false; + } + + // This method is called by SDLControllerManager's API 26 Generic Motion Handler. + public static View getContentView() + { + return mSingleton.mLayout; } static class ShowTextInputTask implements Runnable { @@ -715,6 +1136,14 @@ this.y = y; this.w = w; this.h = h; + + /* Minimum size of 1 pixel, so it takes focus. */ + if (this.w <= 0) { + this.w = 1; + } + if (this.h + HEIGHT_PADDING <= 0) { + this.h = 1 - HEIGHT_PADDING; + } } @Override @@ -750,12 +1179,10 @@ } public static boolean isTextInputEvent(KeyEvent event) { - + // Key pressed with Ctrl should be sent as SDL_KEYDOWN/SDL_KEYUP and not SDL_TEXTINPUT - if (Build.VERSION.SDK_INT >= 11) { - if (event.isCtrlPressed()) { - return false; - } + if (event.isCtrlPressed()) { + return false; } return event.isPrintingKey() || event.getKeyCode() == KeyEvent.KEYCODE_SPACE; @@ -771,23 +1198,28 @@ return SDLActivity.mSurface.getNativeSurface(); } + /** + * This method is called by SDL using JNI. + */ + public static void setSurfaceViewFormat(int format) { + mSingleton.sendCommand(COMMAND_CHANGE_SURFACEVIEW_FORMAT, format); + return; + } + // Input /** * This method is called by SDL using JNI. - * @return an array which may be empty but is never null. - */ - public static int[] inputGetInputDeviceIds(int sources) { + */ + public static void initTouch() { int[] ids = InputDevice.getDeviceIds(); - int[] filtered = new int[ids.length]; - int used = 0; + for (int i = 0; i < ids.length; ++i) { InputDevice device = InputDevice.getDevice(ids[i]); - if ((device != null) && ((device.getSources() & sources) != 0)) { - filtered[used++] = device.getId(); - } - } - return Arrays.copyOf(filtered, used); + if (device != null && (device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) != 0) { + nativeAddTouch(device.getId(), device.getName()); + } + } } // APK expansion files support @@ -1065,6 +1497,32 @@ return dialog; } + private final Runnable rehideSystemUi = new Runnable() { + @Override + public void run() { + int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.INVISIBLE; + + SDLActivity.this.getWindow().getDecorView().setSystemUiVisibility(flags); + } + }; + + public void onSystemUiVisibilityChange(int visibility) { + if (SDLActivity.mFullscreenModeActive && ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0 || (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0)) { + + Handler handler = getWindow().getDecorView().getHandler(); + if (handler != null) { + handler.removeCallbacks(rehideSystemUi); // Prevent a hide loop. + handler.postDelayed(rehideSystemUi, 2000); + } + + } + } + /** * This method is called by SDL using JNI. */ @@ -1092,13 +1550,14 @@ public static int createCustomCursor(int[] colors, int width, int height, int hotSpotX, int hotSpotY) { Bitmap bitmap = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888); ++mLastCursorID; - // This requires API 24, so use reflection to implement this - try { - Class PointerIconClass = Class.forName("android.view.PointerIcon"); - Class[] arg_types = new Class[] { Bitmap.class, float.class, float.class }; - Method create = PointerIconClass.getMethod("create", arg_types); - mCursors.put(mLastCursorID, create.invoke(null, bitmap, hotSpotX, hotSpotY)); - } catch (Exception e) { + + if (Build.VERSION.SDK_INT >= 24) { + try { + mCursors.put(mLastCursorID, PointerIcon.create(bitmap, hotSpotX, hotSpotY)); + } catch (Exception e) { + return 0; + } + } else { return 0; } return mLastCursorID; @@ -1108,12 +1567,14 @@ * This method is called by SDL using JNI. */ public static boolean setCustomCursor(int cursorID) { - // This requires API 24, so use reflection to implement this - try { - Class PointerIconClass = Class.forName("android.view.PointerIcon"); - Method setPointerIcon = SDLSurface.class.getMethod("setPointerIcon", PointerIconClass); - setPointerIcon.invoke(mSurface, mCursors.get(cursorID)); - } catch (Exception e) { + + if (Build.VERSION.SDK_INT >= 24) { + try { + mSurface.setPointerIcon(mCursors.get(cursorID)); + } catch (Exception e) { + return false; + } + } else { return false; } return true; @@ -1162,17 +1623,40 @@ cursor_type = 1002; //PointerIcon.TYPE_HAND; break; } - // This requires API 24, so use reflection to implement this - try { - Class PointerIconClass = Class.forName("android.view.PointerIcon"); - Class[] arg_types = new Class[] { Context.class, int.class }; - Method getSystemIcon = PointerIconClass.getMethod("getSystemIcon", arg_types); - Method setPointerIcon = SDLSurface.class.getMethod("setPointerIcon", PointerIconClass); - setPointerIcon.invoke(mSurface, getSystemIcon.invoke(null, SDL.getContext(), cursor_type)); - } catch (Exception e) { - return false; + if (Build.VERSION.SDK_INT >= 24) { + try { + mSurface.setPointerIcon(PointerIcon.getSystemIcon(SDL.getContext(), cursor_type)); + } catch (Exception e) { + return false; + } } return true; + } + + /** + * This method is called by SDL using JNI. + */ + public static void requestPermission(String permission, int requestCode) { + if (Build.VERSION.SDK_INT < 23) { + nativePermissionResult(requestCode, true); + return; + } + + Activity activity = (Activity)getContext(); + if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { + activity.requestPermissions(new String[]{permission}, requestCode); + } else { + nativePermissionResult(requestCode, true); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + nativePermissionResult(requestCode, true); + } else { + nativePermissionResult(requestCode, false); + } } } @@ -1187,14 +1671,24 @@ String function = SDLActivity.mSingleton.getMainFunction(); String[] arguments = SDLActivity.mSingleton.getArguments(); + try { + android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_DISPLAY); + } catch (Exception e) { + Log.v("SDL", "modify thread properties failed " + e.toString()); + } + Log.v("SDL", "Running main function " + function + " from library " + library); + SDLActivity.nativeRunMain(library, function, arguments); Log.v("SDL", "Finished main function"); - // Native thread has finished, let's finish the Activity - if (!SDLActivity.mExitCalledFromJava) { - SDLActivity.handleNativeExit(); + if (SDLActivity.mSingleton == null || SDLActivity.mSingleton.isFinishing()) { + // Activity is already being destroyed + } else { + // Let's finish the Activity + SDLActivity.mSDLThread = null; + SDLActivity.mSingleton.finish(); } } } @@ -1210,11 +1704,14 @@ View.OnKeyListener, View.OnTouchListener, SensorEventListener { // Sensors - protected static SensorManager mSensorManager; - protected static Display mDisplay; + protected SensorManager mSensorManager; + protected Display mDisplay; // Keep track of the surface size to normalize touch events - protected static float mWidth, mHeight; + protected float mWidth, mHeight; + + // Is SurfaceView ready for rendering + public boolean mIsSurfaceReady; // Startup public SDLSurface(Context context) { @@ -1230,13 +1727,13 @@ mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); - if (Build.VERSION.SDK_INT >= 12) { - setOnGenericMotionListener(new SDLGenericMotionListener_API12()); - } + setOnGenericMotionListener(SDLActivity.getMotionListener()); // Some arbitrary defaults to avoid a potential division by zero mWidth = 1.0f; mHeight = 1.0f; + + mIsSurfaceReady = false; } public void handlePause() { @@ -1260,7 +1757,7 @@ @Override public void surfaceCreated(SurfaceHolder holder) { Log.v("SDL", "surfaceCreated()"); - holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); + SDLActivity.onNativeSurfaceCreated(); } // Called when we lose the surface @@ -1272,7 +1769,7 @@ SDLActivity.mNextNativeState = SDLActivity.NativeState.PAUSED; SDLActivity.handleNativeState(); - SDLActivity.mIsSurfaceReady = false; + mIsSurfaceReady = false; SDLActivity.onNativeSurfaceDestroyed(); } @@ -1282,25 +1779,12 @@ int format, int width, int height) { Log.v("SDL", "surfaceChanged()"); + if (SDLActivity.mSingleton == null) { + return; + } + int sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565 by default switch (format) { - case PixelFormat.A_8: - Log.v("SDL", "pixel format A_8"); - break; - case PixelFormat.LA_88: - Log.v("SDL", "pixel format LA_88"); - break; - case PixelFormat.L_8: - Log.v("SDL", "pixel format L_8"); - break; - case PixelFormat.RGBA_4444: - Log.v("SDL", "pixel format RGBA_4444"); - sdlFormat = 0x15421002; // SDL_PIXELFORMAT_RGBA4444 - break; - case PixelFormat.RGBA_5551: - Log.v("SDL", "pixel format RGBA_5551"); - sdlFormat = 0x15441002; // SDL_PIXELFORMAT_RGBA5551 - break; case PixelFormat.RGBA_8888: Log.v("SDL", "pixel format RGBA_8888"); sdlFormat = 0x16462004; // SDL_PIXELFORMAT_RGBA8888 @@ -1308,10 +1792,6 @@ case PixelFormat.RGBX_8888: Log.v("SDL", "pixel format RGBX_8888"); sdlFormat = 0x16261804; // SDL_PIXELFORMAT_RGBX8888 - break; - case PixelFormat.RGB_332: - Log.v("SDL", "pixel format RGB_332"); - sdlFormat = 0x14110801; // SDL_PIXELFORMAT_RGB332 break; case PixelFormat.RGB_565: Log.v("SDL", "pixel format RGB_565"); @@ -1329,10 +1809,31 @@ mWidth = width; mHeight = height; - SDLActivity.onNativeResize(width, height, sdlFormat, mDisplay.getRefreshRate()); + int nDeviceWidth = width; + int nDeviceHeight = height; + try + { + if (Build.VERSION.SDK_INT >= 17) { + android.util.DisplayMetrics realMetrics = new android.util.DisplayMetrics(); + mDisplay.getRealMetrics( realMetrics ); + nDeviceWidth = realMetrics.widthPixels; + nDeviceHeight = realMetrics.heightPixels; + } + } + catch ( java.lang.Throwable throwable ) {} + + synchronized(SDLActivity.getContext()) { + // In case we're waiting on a size change after going fullscreen, send a notification. + SDLActivity.getContext().notifyAll(); + } + Log.v("SDL", "Window size: " + width + "x" + height); - - + Log.v("SDL", "Device size: " + nDeviceWidth + "x" + nDeviceHeight); + SDLActivity.nativeSetScreenResolution(width, height, nDeviceWidth, nDeviceHeight, sdlFormat, mDisplay.getRefreshRate()); + SDLActivity.onNativeResize(); + + // Prevent a screen distortion glitch, + // for instance when the device is in Landscape and a Portrait App is resumed. boolean skip = false; int requestedOrientation = SDLActivity.mSingleton.getRequestedOrientation(); @@ -1362,24 +1863,52 @@ } } + // Don't skip in MultiWindow. + if (skip) { + if (Build.VERSION.SDK_INT >= 24) { + if (SDLActivity.mSingleton.isInMultiWindowMode()) { + Log.v("SDL", "Don't skip in Multi-Window"); + skip = false; + } + } + } + if (skip) { Log.v("SDL", "Skip .. Surface is not ready."); - SDLActivity.mIsSurfaceReady = false; + mIsSurfaceReady = false; return; } - - /* Surface is ready */ - SDLActivity.mIsSurfaceReady = true; /* If the surface has been previously destroyed by onNativeSurfaceDestroyed, recreate it here */ SDLActivity.onNativeSurfaceChanged(); + /* Surface is ready */ + mIsSurfaceReady = true; + + SDLActivity.mNextNativeState = SDLActivity.NativeState.RESUMED; SDLActivity.handleNativeState(); } // Key events @Override public boolean onKey(View v, int keyCode, KeyEvent event) { + + int deviceId = event.getDeviceId(); + int source = event.getSource(); + + if (source == InputDevice.SOURCE_UNKNOWN) { + InputDevice device = InputDevice.getDevice(deviceId); + if (device != null) { + source = device.getSources(); + } + } + +// if (event.getAction() == KeyEvent.ACTION_DOWN) { +// Log.v("SDL", "key down: " + keyCode + ", deviceId = " + deviceId + ", source = " + source); +// } else if (event.getAction() == KeyEvent.ACTION_UP) { +// Log.v("SDL", "key up: " + keyCode + ", deviceId = " + deviceId + ", source = " + source); +// } + // Dispatch the different events depending on where they come from // Some SOURCE_JOYSTICK, SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD // So, we try to process them as JOYSTICK/DPAD/GAMEPAD events first, if that fails we try them as KEYBOARD @@ -1387,36 +1916,33 @@ // Furthermore, it's possible a game controller has SOURCE_KEYBOARD and // SOURCE_JOYSTICK, while its key events arrive from the keyboard source // So, retrieve the device itself and check all of its sources - if (SDLControllerManager.isDeviceSDLJoystick(event.getDeviceId())) { + if (SDLControllerManager.isDeviceSDLJoystick(deviceId)) { // Note that we process events with specific key codes here if (event.getAction() == KeyEvent.ACTION_DOWN) { - if (SDLControllerManager.onNativePadDown(event.getDeviceId(), keyCode) == 0) { + if (SDLControllerManager.onNativePadDown(deviceId, keyCode) == 0) { return true; } } else if (event.getAction() == KeyEvent.ACTION_UP) { - if (SDLControllerManager.onNativePadUp(event.getDeviceId(), keyCode) == 0) { + if (SDLControllerManager.onNativePadUp(deviceId, keyCode) == 0) { return true; } } } - if ((event.getSource() & InputDevice.SOURCE_KEYBOARD) != 0) { + if ((source & InputDevice.SOURCE_KEYBOARD) != 0) { if (event.getAction() == KeyEvent.ACTION_DOWN) { - //Log.v("SDL", "key down: " + keyCode); if (SDLActivity.isTextInputEvent(event)) { SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1); } SDLActivity.onNativeKeyDown(keyCode); return true; - } - else if (event.getAction() == KeyEvent.ACTION_UP) { - //Log.v("SDL", "key up: " + keyCode); + } else if (event.getAction() == KeyEvent.ACTION_UP) { SDLActivity.onNativeKeyUp(keyCode); return true; } } - if ((event.getSource() & InputDevice.SOURCE_MOUSE) != 0) { + if ((source & InputDevice.SOURCE_MOUSE) != 0) { // on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses // they are ignored here because sending them as mouse input to SDL is messy if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) { @@ -1445,18 +1971,23 @@ int i = -1; float x,y,p; - // !!! FIXME: dump this SDK check after 2.0.4 ships and require API14. - if (event.getSource() == InputDevice.SOURCE_MOUSE && SDLActivity.mSeparateMouseAndTouch) { - if (Build.VERSION.SDK_INT < 14) { - mouseButton = 1; // all mouse buttons are the left button - } else { - try { - mouseButton = (Integer) event.getClass().getMethod("getButtonState").invoke(event); - } catch(Exception e) { - mouseButton = 1; // oh well. - } - } - SDLActivity.onNativeMouse(mouseButton, action, event.getX(0), event.getY(0)); + // 12290 = Samsung DeX mode desktop mouse + // 12290 = 0x3002 = 0x2002 | 0x1002 = SOURCE_MOUSE | SOURCE_TOUCHSCREEN + // 0x2 = SOURCE_CLASS_POINTER + if (event.getSource() == InputDevice.SOURCE_MOUSE || event.getSource() == (InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN)) { + try { + mouseButton = (Integer) event.getClass().getMethod("getButtonState").invoke(event); + } catch(Exception e) { + mouseButton = 1; // oh well. + } + + // We need to check if we're in relative mouse mode and get the axis offset rather than the x/y values + // if we are. We'll leverage our existing mouse motion listener + SDLGenericMotionListener_API12 motionListener = SDLActivity.getMotionListener(); + x = motionListener.getEventX(event); + y = motionListener.getEventY(event); + + SDLActivity.onNativeMouse(mouseButton, action, x, y, motionListener.inRelativeMode()); } else { switch(action) { case MotionEvent.ACTION_MOVE: @@ -1541,30 +2072,90 @@ @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { + + // Since we may have an orientation set, we won't receive onConfigurationChanged events. + // We thus should check here. + int newOrientation = SDLActivity.SDL_ORIENTATION_UNKNOWN; + float x, y; switch (mDisplay.getRotation()) { case Surface.ROTATION_90: x = -event.values[1]; y = event.values[0]; + newOrientation = SDLActivity.SDL_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_270: x = event.values[1]; y = -event.values[0]; + newOrientation = SDLActivity.SDL_ORIENTATION_LANDSCAPE_FLIPPED; break; case Surface.ROTATION_180: - x = -event.values[1]; - y = -event.values[0]; + x = -event.values[0]; + y = -event.values[1]; + newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT_FLIPPED; break; default: x = event.values[0]; y = event.values[1]; + newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT; break; } + + if (newOrientation != SDLActivity.mCurrentOrientation) { + SDLActivity.mCurrentOrientation = newOrientation; + SDLActivity.onNativeOrientationChanged(newOrientation); + } + SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH, y / SensorManager.GRAVITY_EARTH, event.values[2] / SensorManager.GRAVITY_EARTH); - } - } + + + } + } + + // Captured pointer events for API 26. + public boolean onCapturedPointerEvent(MotionEvent event) + { + int action = event.getActionMasked(); + + float x, y; + switch (action) { + case MotionEvent.ACTION_SCROLL: + x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); + y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); + SDLActivity.onNativeMouse(0, action, x, y, false); + return true; + + case MotionEvent.ACTION_HOVER_MOVE: + case MotionEvent.ACTION_MOVE: + x = event.getX(0); + y = event.getY(0); + SDLActivity.onNativeMouse(0, action, x, y, true); + return true; + + case MotionEvent.ACTION_BUTTON_PRESS: + case MotionEvent.ACTION_BUTTON_RELEASE: + + // Change our action value to what SDL's code expects. + if (action == MotionEvent.ACTION_BUTTON_PRESS) { + action = MotionEvent.ACTION_DOWN; + } + else if (action == MotionEvent.ACTION_BUTTON_RELEASE) { + action = MotionEvent.ACTION_UP; + } + + x = event.getX(0); + y = event.getY(0); + int button = event.getButtonState(); + + SDLActivity.onNativeMouse(button, action, x, y, true); + return true; + } + + return false; + } + } /* This is a fake invisible editor view that receives the input and defines the @@ -1587,7 +2178,7 @@ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { - /* + /* * This handles the hardware keyboard input */ if (event.getAction() == KeyEvent.ACTION_DOWN) { @@ -1655,14 +2246,8 @@ */ if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { - String imeHide = SDLActivity.nativeGetHint("SDL_RETURN_KEY_HIDES_IME"); - if ((imeHide != null) && imeHide.equals("1")) { - Context c = SDL.getContext(); - if (c instanceof SDLActivity) { - SDLActivity activity = (SDLActivity)c; - activity.sendCommand(SDLActivity.COMMAND_TEXTEDIT_HIDE, null); - return true; - } + if (SDLActivity.onNativeSoftReturnKey()) { + return true; } } @@ -1675,6 +2260,11 @@ for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); + if (c == '\n') { + if (SDLActivity.onNativeSoftReturnKey()) { + return true; + } + } nativeGenerateScancodeForUnichar(c); } @@ -1707,7 +2297,7 @@ while (beforeLength-- > 0) { boolean ret_key = sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)) && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL)); - ret = ret && ret_key; + ret = ret && ret_key; } return ret; } @@ -1726,7 +2316,7 @@ class SDLClipboardHandler_API11 implements - SDLClipboardHandler, + SDLClipboardHandler, android.content.ClipboardManager.OnPrimaryClipChangedListener { protected android.content.ClipboardManager mClipMgr; @@ -1757,7 +2347,7 @@ mClipMgr.setText(string); mClipMgr.addPrimaryClipChangedListener(this); } - + @Override public void onPrimaryClipChanged() { SDLActivity.onNativeClipboardChanged(); @@ -1765,33 +2355,3 @@ } -class SDLClipboardHandler_Old implements - SDLClipboardHandler { - - protected android.text.ClipboardManager mClipMgrOld; - - SDLClipboardHandler_Old() { - mClipMgrOld = (android.text.ClipboardManager) SDL.getContext().getSystemService(Context.CLIPBOARD_SERVICE); - } - - @Override - public boolean clipboardHasText() { - return mClipMgrOld.hasText(); - } - - @Override - public String clipboardGetText() { - CharSequence text; - text = mClipMgrOld.getText(); - if (text != null) { - return text.toString(); - } - return null; - } - - @Override - public void clipboardSetText(String string) { - mClipMgrOld.setText(string); - } -} - diff --git a/flare-android-project/app/src/main/java/org/libsdl/app/SDLAudioManager.java b/flare-android-project/app/src/main/java/org/libsdl/app/SDLAudioManager.java index 26baf82..0714419 100644 --- a/flare-android-project/app/src/main/java/org/libsdl/app/SDLAudioManager.java +++ b/flare-android-project/app/src/main/java/org/libsdl/app/SDLAudioManager.java @@ -1,6 +1,7 @@ package org.libsdl.app; import android.media.*; +import android.os.Build; import android.util.Log; public class SDLAudioManager @@ -17,47 +18,282 @@ // Audio - /** - * This method is called by SDL using JNI. - */ - public static int audioOpen(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) { - int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO; - int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT; - int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1); - - Log.v(TAG, "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + (sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer"); + protected static String getAudioFormatString(int audioFormat) { + switch (audioFormat) { + case AudioFormat.ENCODING_PCM_8BIT: + return "8-bit"; + case AudioFormat.ENCODING_PCM_16BIT: + return "16-bit"; + case AudioFormat.ENCODING_PCM_FLOAT: + return "float"; + default: + return Integer.toString(audioFormat); + } + } + + protected static int[] open(boolean isCapture, int sampleRate, int audioFormat, int desiredChannels, int desiredFrames) { + int channelConfig; + int sampleSize; + int frameSize; + + Log.v(TAG, "Opening " + (isCapture ? "capture" : "playback") + ", requested " + desiredFrames + " frames of " + desiredChannels + " channel " + getAudioFormatString(audioFormat) + " audio at " + sampleRate + " Hz"); + + /* On older devices let's use known good settings */ + if (Build.VERSION.SDK_INT < 21) { + if (desiredChannels > 2) { + desiredChannels = 2; + } + if (sampleRate < 8000) { + sampleRate = 8000; + } else if (sampleRate > 48000) { + sampleRate = 48000; + } + } + + if (audioFormat == AudioFormat.ENCODING_PCM_FLOAT) { + int minSDKVersion = (isCapture ? 23 : 21); + if (Build.VERSION.SDK_INT < minSDKVersion) { + audioFormat = AudioFormat.ENCODING_PCM_16BIT; + } + } + switch (audioFormat) + { + case AudioFormat.ENCODING_PCM_8BIT: + sampleSize = 1; + break; + case AudioFormat.ENCODING_PCM_16BIT: + sampleSize = 2; + break; + case AudioFormat.ENCODING_PCM_FLOAT: + sampleSize = 4; + break; + default: + Log.v(TAG, "Requested format " + audioFormat + ", getting ENCODING_PCM_16BIT"); + audioFormat = AudioFormat.ENCODING_PCM_16BIT; + sampleSize = 2; + break; + } + + if (isCapture) { + switch (desiredChannels) { + case 1: + channelConfig = AudioFormat.CHANNEL_IN_MONO; + break; + case 2: + channelConfig = AudioFormat.CHANNEL_IN_STEREO; + break; + default: + Log.v(TAG, "Requested " + desiredChannels + " channels, getting stereo"); + desiredChannels = 2; + channelConfig = AudioFormat.CHANNEL_IN_STEREO; + break; + } + } else { + switch (desiredChannels) { + case 1: + channelConfig = AudioFormat.CHANNEL_OUT_MONO; + break; + case 2: + channelConfig = AudioFormat.CHANNEL_OUT_STEREO; + break; + case 3: + channelConfig = AudioFormat.CHANNEL_OUT_STEREO | AudioFormat.CHANNEL_OUT_FRONT_CENTER; + break; + case 4: + channelConfig = AudioFormat.CHANNEL_OUT_QUAD; + break; + case 5: + channelConfig = AudioFormat.CHANNEL_OUT_QUAD | AudioFormat.CHANNEL_OUT_FRONT_CENTER; + break; + case 6: + channelConfig = AudioFormat.CHANNEL_OUT_5POINT1; + break; + case 7: + channelConfig = AudioFormat.CHANNEL_OUT_5POINT1 | AudioFormat.CHANNEL_OUT_BACK_CENTER; + break; + case 8: + if (Build.VERSION.SDK_INT >= 23) { + channelConfig = AudioFormat.CHANNEL_OUT_7POINT1_SURROUND; + } else { + Log.v(TAG, "Requested " + desiredChannels + " channels, getting 5.1 surround"); + desiredChannels = 6; + channelConfig = AudioFormat.CHANNEL_OUT_5POINT1; + } + break; + default: + Log.v(TAG, "Requested " + desiredChannels + " channels, getting stereo"); + desiredChannels = 2; + channelConfig = AudioFormat.CHANNEL_OUT_STEREO; + break; + } + +/* + Log.v(TAG, "Speaker configuration (and order of channels):"); + + if ((channelConfig & 0x00000004) != 0) { + Log.v(TAG, " CHANNEL_OUT_FRONT_LEFT"); + } + if ((channelConfig & 0x00000008) != 0) { + Log.v(TAG, " CHANNEL_OUT_FRONT_RIGHT"); + } + if ((channelConfig & 0x00000010) != 0) { + Log.v(TAG, " CHANNEL_OUT_FRONT_CENTER"); + } + if ((channelConfig & 0x00000020) != 0) { + Log.v(TAG, " CHANNEL_OUT_LOW_FREQUENCY"); + } + if ((channelConfig & 0x00000040) != 0) { + Log.v(TAG, " CHANNEL_OUT_BACK_LEFT"); + } + if ((channelConfig & 0x00000080) != 0) { + Log.v(TAG, " CHANNEL_OUT_BACK_RIGHT"); + } + if ((channelConfig & 0x00000100) != 0) { + Log.v(TAG, " CHANNEL_OUT_FRONT_LEFT_OF_CENTER"); + } + if ((channelConfig & 0x00000200) != 0) { + Log.v(TAG, " CHANNEL_OUT_FRONT_RIGHT_OF_CENTER"); + } + if ((channelConfig & 0x00000400) != 0) { + Log.v(TAG, " CHANNEL_OUT_BACK_CENTER"); + } + if ((channelConfig & 0x00000800) != 0) { + Log.v(TAG, " CHANNEL_OUT_SIDE_LEFT"); + } + if ((channelConfig & 0x00001000) != 0) { + Log.v(TAG, " CHANNEL_OUT_SIDE_RIGHT"); + } +*/ + } + frameSize = (sampleSize * desiredChannels); // Let the user pick a larger buffer if they really want -- but ye // gods they probably shouldn't, the minimums are horrifyingly high // latency already - desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize); - + int minBufferSize; + if (isCapture) { + minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); + } else { + minBufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat); + } + desiredFrames = Math.max(desiredFrames, (minBufferSize + frameSize - 1) / frameSize); + + int[] results = new int[4]; + + if (isCapture) { + if (mAudioRecord == null) { + mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, sampleRate, + channelConfig, audioFormat, desiredFrames * frameSize); + + // see notes about AudioTrack state in audioOpen(), above. Probably also applies here. + if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) { + Log.e(TAG, "Failed during initialization of AudioRecord"); + mAudioRecord.release(); + mAudioRecord = null; + return null; + } + + mAudioRecord.startRecording(); + } + + results[0] = mAudioRecord.getSampleRate(); + results[1] = mAudioRecord.getAudioFormat(); + results[2] = mAudioRecord.getChannelCount(); + results[3] = desiredFrames; + + } else { + if (mAudioTrack == null) { + mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM); + + // Instantiating AudioTrack can "succeed" without an exception and the track may still be invalid + // Ref: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/AudioTrack.java + // Ref: http://developer.android.com/reference/android/media/AudioTrack.html#getState() + if (mAudioTrack.getState() != AudioTrack.STATE_INITIALIZED) { + /* Try again, with safer values */ + + Log.e(TAG, "Failed during initialization of Audio Track"); + mAudioTrack.release(); + mAudioTrack = null; + return null; + } + + mAudioTrack.play(); + } + + results[0] = mAudioTrack.getSampleRate(); + results[1] = mAudioTrack.getAudioFormat(); + results[2] = mAudioTrack.getChannelCount(); + results[3] = desiredFrames; + } + + Log.v(TAG, "Opening " + (isCapture ? "capture" : "playback") + ", got " + results[3] + " frames of " + results[2] + " channel " + getAudioFormatString(results[1]) + " audio at " + results[0] + " Hz"); + + return results; + } + + /** + * This method is called by SDL using JNI. + */ + public static int[] audioOpen(int sampleRate, int audioFormat, int desiredChannels, int desiredFrames) { + return open(false, sampleRate, audioFormat, desiredChannels, desiredFrames); + } + + /** + * This method is called by SDL using JNI. + */ + public static void audioWriteFloatBuffer(float[] buffer) { if (mAudioTrack == null) { - mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, - channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM); - - // Instantiating AudioTrack can "succeed" without an exception and the track may still be invalid - // Ref: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/AudioTrack.java - // Ref: http://developer.android.com/reference/android/media/AudioTrack.html#getState() - - if (mAudioTrack.getState() != AudioTrack.STATE_INITIALIZED) { - Log.e(TAG, "Failed during initialization of Audio Track"); - mAudioTrack = null; - return -1; - } - - mAudioTrack.play(); - } - - Log.v(TAG, "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + (mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer"); - - return 0; + Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); + return; + } + + for (int i = 0; i < buffer.length;) { + int result = mAudioTrack.write(buffer, i, buffer.length - i, AudioTrack.WRITE_BLOCKING); + if (result > 0) { + i += result; + } else if (result == 0) { + try { + Thread.sleep(1); + } catch(InterruptedException e) { + // Nom nom + } + } else { + Log.w(TAG, "SDL audio: error return from write(float)"); + return; + } + } } /** * This method is called by SDL using JNI. */ public static void audioWriteShortBuffer(short[] buffer) { + if (mAudioTrack == null) { + Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); + return; + } + + for (int i = 0; i < buffer.length;) { + int result = mAudioTrack.write(buffer, i, buffer.length - i); + if (result > 0) { + i += result; + } else if (result == 0) { + try { + Thread.sleep(1); + } catch(InterruptedException e) { + // Nom nom + } + } else { + Log.w(TAG, "SDL audio: error return from write(short)"); + return; + } + } + } + + /** + * This method is called by SDL using JNI. + */ + public static void audioWriteByteBuffer(byte[] buffer) { if (mAudioTrack == null) { Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); return; @@ -74,32 +310,6 @@ // Nom nom } } else { - Log.w(TAG, "SDL audio: error return from write(short)"); - return; - } - } - } - - /** - * This method is called by SDL using JNI. - */ - public static void audioWriteByteBuffer(byte[] buffer) { - if (mAudioTrack == null) { - Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); - return; - } - - for (int i = 0; i < buffer.length; ) { - int result = mAudioTrack.write(buffer, i, buffer.length - i); - if (result > 0) { - i += result; - } else if (result == 0) { - try { - Thread.sleep(1); - } catch(InterruptedException e) { - // Nom nom - } - } else { Log.w(TAG, "SDL audio: error return from write(byte)"); return; } @@ -109,52 +319,32 @@ /** * This method is called by SDL using JNI. */ - public static int captureOpen(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) { - int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO; - int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT; - int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1); - - Log.v(TAG, "SDL capture: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + (sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer"); - - // Let the user pick a larger buffer if they really want -- but ye - // gods they probably shouldn't, the minimums are horrifyingly high - // latency already - desiredFrames = Math.max(desiredFrames, (AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize); - - if (mAudioRecord == null) { - mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, sampleRate, - channelConfig, audioFormat, desiredFrames * frameSize); - - // see notes about AudioTrack state in audioOpen(), above. Probably also applies here. - if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) { - Log.e(TAG, "Failed during initialization of AudioRecord"); - mAudioRecord.release(); - mAudioRecord = null; - return -1; - } - - mAudioRecord.startRecording(); - } - - Log.v(TAG, "SDL capture: got " + ((mAudioRecord.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioRecord.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + (mAudioRecord.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer"); - - return 0; + public static int[] captureOpen(int sampleRate, int audioFormat, int desiredChannels, int desiredFrames) { + return open(true, sampleRate, audioFormat, desiredChannels, desiredFrames); + } + + /** This method is called by SDL using JNI. */ + public static int captureReadFloatBuffer(float[] buffer, boolean blocking) { + return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING); } /** This method is called by SDL using JNI. */ public static int captureReadShortBuffer(short[] buffer, boolean blocking) { - // !!! FIXME: this is available in API Level 23. Until then, we always block. :( - //return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING); - return mAudioRecord.read(buffer, 0, buffer.length); + if (Build.VERSION.SDK_INT < 23) { + return mAudioRecord.read(buffer, 0, buffer.length); + } else { + return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING); + } } /** This method is called by SDL using JNI. */ public static int captureReadByteBuffer(byte[] buffer, boolean blocking) { - // !!! FIXME: this is available in API Level 23. Until then, we always block. :( - //return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING); - return mAudioRecord.read(buffer, 0, buffer.length); - } - + if (Build.VERSION.SDK_INT < 23) { + return mAudioRecord.read(buffer, 0, buffer.length); + } else { + return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING); + } + } /** This method is called by SDL using JNI. */ public static void audioClose() { @@ -174,5 +364,24 @@ } } + /** This method is called by SDL using JNI. */ + public static void audioSetThreadPriority(boolean iscapture, int device_id) { + try { + + /* Set thread name */ + if (iscapture) { + Thread.currentThread().setName("SDLAudioC" + device_id); + } else { + Thread.currentThread().setName("SDLAudioP" + device_id); + } + + /* Set thread priority */ + android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO); + + } catch (Exception e) { + Log.v(TAG, "modify thread properties failed " + e.toString()); + } + } + public static native int nativeSetupJNI(); } diff --git a/flare-android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java b/flare-android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java index bb1797e..a81e97b 100644 --- a/flare-android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java +++ b/flare-android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java @@ -11,7 +11,7 @@ import android.util.Log; -public class SDLControllerManager +public class SDLControllerManager { public static native int nativeSetupJNI(); @@ -36,23 +36,21 @@ private static final String TAG = "SDLControllerManager"; public static void initialize() { - mJoystickHandler = null; - mHapticHandler = null; - - SDLControllerManager.setup(); - } - - public static void setup() { - if (Build.VERSION.SDK_INT >= 19) { - mJoystickHandler = new SDLJoystickHandler_API19(); - } else if (Build.VERSION.SDK_INT >= 16) { - mJoystickHandler = new SDLJoystickHandler_API16(); - } else if (Build.VERSION.SDK_INT >= 12) { - mJoystickHandler = new SDLJoystickHandler_API12(); - } else { - mJoystickHandler = new SDLJoystickHandler(); - } - mHapticHandler = new SDLHapticHandler(); + if (mJoystickHandler == null) { + if (Build.VERSION.SDK_INT >= 19) { + mJoystickHandler = new SDLJoystickHandler_API19(); + } else { + mJoystickHandler = new SDLJoystickHandler_API16(); + } + } + + if (mHapticHandler == null) { + if (Build.VERSION.SDK_INT >= 26) { + mHapticHandler = new SDLHapticHandler_API26(); + } else { + mHapticHandler = new SDLHapticHandler(); + } + } } // Joystick glue code, just a series of stubs that redirect to the SDLJoystickHandler instance @@ -77,8 +75,16 @@ /** * This method is called by SDL using JNI. */ - public static void hapticRun(int device_id, int length) { - mHapticHandler.run(device_id, length); + public static void hapticRun(int device_id, float intensity, int length) { + mHapticHandler.run(device_id, intensity, length); + } + + /** + * This method is called by SDL using JNI. + */ + public static void hapticStop(int device_id) + { + mHapticHandler.stop(device_id); } // Check if a given device is considered a possible SDL joystick @@ -93,8 +99,8 @@ /* This is called for every button press, so let's not spam the logs */ /** - if ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) { - Log.v(TAG, "Input device " + device.getName() + " is a joystick."); + if ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) { + Log.v(TAG, "Input device " + device.getName() + " has class joystick."); } if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) { Log.v(TAG, "Input device " + device.getName() + " is a dpad."); @@ -104,7 +110,7 @@ } **/ - return (((sources & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) || + return ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) != 0 || ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) || ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) ); @@ -112,7 +118,6 @@ } -/* A null joystick handler for API level < 12 devices (the accelerometer is handled separately) */ class SDLJoystickHandler { /** @@ -132,7 +137,7 @@ } /* Actual joystick functionality available for API >= 12 devices */ -class SDLJoystickHandler_API12 extends SDLJoystickHandler { +class SDLJoystickHandler_API16 extends SDLJoystickHandler { static class SDLJoystick { public int device_id; @@ -144,13 +149,27 @@ static class RangeComparator implements Comparator { @Override public int compare(InputDevice.MotionRange arg0, InputDevice.MotionRange arg1) { - return arg0.getAxis() - arg1.getAxis(); + // Some controllers, like the Moga Pro 2, return AXIS_GAS (22) for right trigger and AXIS_BRAKE (23) for left trigger - swap them so they're sorted in the right order for SDL + int arg0Axis = arg0.getAxis(); + int arg1Axis = arg1.getAxis(); + if (arg0Axis == MotionEvent.AXIS_GAS) { + arg0Axis = MotionEvent.AXIS_BRAKE; + } else if (arg0Axis == MotionEvent.AXIS_BRAKE) { + arg0Axis = MotionEvent.AXIS_GAS; + } + if (arg1Axis == MotionEvent.AXIS_GAS) { + arg1Axis = MotionEvent.AXIS_BRAKE; + } else if (arg1Axis == MotionEvent.AXIS_BRAKE) { + arg1Axis = MotionEvent.AXIS_GAS; + } + + return arg0Axis - arg1Axis; } } private ArrayList mJoysticks; - public SDLJoystickHandler_API12() { + public SDLJoystickHandler_API16() { mJoysticks = new ArrayList(); } @@ -254,6 +273,12 @@ } public String getJoystickDescriptor(InputDevice joystickDevice) { + String desc = joystickDevice.getDescriptor(); + + if (desc != null && !desc.isEmpty()) { + return desc; + } + return joystickDevice.getName(); } public int getProductId(InputDevice joystickDevice) { @@ -264,20 +289,6 @@ } public int getButtonMask(InputDevice joystickDevice) { return -1; - } -} - -class SDLJoystickHandler_API16 extends SDLJoystickHandler_API12 { - - @Override - public String getJoystickDescriptor(InputDevice joystickDevice) { - String desc = joystickDevice.getDescriptor(); - - if (desc != null && !desc.isEmpty()) { - return desc; - } - - return super.getJoystickDescriptor(joystickDevice); } } @@ -387,6 +398,38 @@ } } +class SDLHapticHandler_API26 extends SDLHapticHandler { + @Override + public void run(int device_id, float intensity, int length) { + SDLHaptic haptic = getHaptic(device_id); + if (haptic != null) { + Log.d("SDL", "Rtest: Vibe with intensity " + intensity + " for " + length); + if (intensity == 0.0f) { + stop(device_id); + return; + } + + int vibeValue = Math.round(intensity * 255); + + if (vibeValue > 255) { + vibeValue = 255; + } + if (vibeValue < 1) { + stop(device_id); + return; + } + try { + haptic.vib.vibrate(VibrationEffect.createOneShot(length, vibeValue)); + } + catch (Exception e) { + // Fall back to the generic method, which uses DEFAULT_AMPLITUDE, but works even if + // something went horribly wrong with the Android 8.0 APIs. + haptic.vib.vibrate(length); + } + } + } +} + class SDLHapticHandler { class SDLHaptic { @@ -396,20 +439,27 @@ } private ArrayList mHaptics; - + public SDLHapticHandler() { mHaptics = new ArrayList(); } - public void run(int device_id, int length) { + public void run(int device_id, float intensity, int length) { SDLHaptic haptic = getHaptic(device_id); if (haptic != null) { - haptic.vib.vibrate (length); + haptic.vib.vibrate(length); + } + } + + public void stop(int device_id) { + SDLHaptic haptic = getHaptic(device_id); + if (haptic != null) { + haptic.vib.cancel(); } } public void pollHapticDevices() { - + final int deviceId_VIBRATOR_SERVICE = 999999; boolean hasVibratorService = false; @@ -419,21 +469,18 @@ // so the first controller seen by SDL matches what the receiver // considers to be the first controller - if (Build.VERSION.SDK_INT >= 16) - { - for (int i = deviceIds.length - 1; i > -1; i--) { - SDLHaptic haptic = getHaptic(deviceIds[i]); - if (haptic == null) { - InputDevice device = InputDevice.getDevice(deviceIds[i]); - Vibrator vib = device.getVibrator(); - if (vib.hasVibrator()) { - haptic = new SDLHaptic(); - haptic.device_id = deviceIds[i]; - haptic.name = device.getName(); - haptic.vib = vib; - mHaptics.add(haptic); - SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name); - } + for (int i = deviceIds.length - 1; i > -1; i--) { + SDLHaptic haptic = getHaptic(deviceIds[i]); + if (haptic == null) { + InputDevice device = InputDevice.getDevice(deviceIds[i]); + Vibrator vib = device.getVibrator(); + if (vib.hasVibrator()) { + haptic = new SDLHaptic(); + haptic.device_id = deviceIds[i]; + haptic.name = device.getName(); + haptic.vib = vib; + mHaptics.add(haptic); + SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name); } } } @@ -441,11 +488,7 @@ /* Check VIBRATOR_SERVICE */ Vibrator vib = (Vibrator) SDL.getContext().getSystemService(Context.VIBRATOR_SERVICE); if (vib != null) { - if (Build.VERSION.SDK_INT >= 11) { - hasVibratorService = vib.hasVibrator(); - } else { - hasVibratorService = true; - } + hasVibratorService = vib.hasVibrator(); if (hasVibratorService) { SDLHaptic haptic = getHaptic(deviceId_VIBRATOR_SERVICE); @@ -453,7 +496,7 @@ haptic = new SDLHaptic(); haptic.device_id = deviceId_VIBRATOR_SERVICE; haptic.name = "VIBRATOR_SERVICE"; - haptic.vib = vib; + haptic.vib = vib; mHaptics.add(haptic); SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name); } @@ -495,7 +538,7 @@ } } return null; - } + } } class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { @@ -512,22 +555,19 @@ return SDLControllerManager.handleJoystickMotionEvent(event); case InputDevice.SOURCE_MOUSE: - if (!SDLActivity.mSeparateMouseAndTouch) { - break; - } action = event.getActionMasked(); switch (action) { case MotionEvent.ACTION_SCROLL: x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); - SDLActivity.onNativeMouse(0, action, x, y); + SDLActivity.onNativeMouse(0, action, x, y, false); return true; case MotionEvent.ACTION_HOVER_MOVE: x = event.getX(0); y = event.getY(0); - SDLActivity.onNativeMouse(0, action, x, y); + SDLActivity.onNativeMouse(0, action, x, y, false); return true; default: @@ -542,5 +582,207 @@ // Event was not managed return false; } -} - + + public boolean supportsRelativeMouse() { + return false; + } + + public boolean inRelativeMode() { + return false; + } + + public boolean setRelativeMouseEnabled(boolean enabled) { + return false; + } + + public void reclaimRelativeMouseModeIfNeeded() + { + + } + + public float getEventX(MotionEvent event) { + return event.getX(0); + } + + public float getEventY(MotionEvent event) { + return event.getY(0); + } + +} + +class SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API12 { + // Generic Motion (mouse hover, joystick...) events go here + + private boolean mRelativeModeEnabled; + + @Override + public boolean onGenericMotion(View v, MotionEvent event) { + + // Handle relative mouse mode + if (mRelativeModeEnabled) { + if (event.getSource() == InputDevice.SOURCE_MOUSE) { + int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_HOVER_MOVE) { + float x = event.getAxisValue(MotionEvent.AXIS_RELATIVE_X); + float y = event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y); + SDLActivity.onNativeMouse(0, action, x, y, true); + return true; + } + } + } + + // Event was not managed, call SDLGenericMotionListener_API12 method + return super.onGenericMotion(v, event); + } + + @Override + public boolean supportsRelativeMouse() { + return true; + } + + @Override + public boolean inRelativeMode() { + return mRelativeModeEnabled; + } + + @Override + public boolean setRelativeMouseEnabled(boolean enabled) { + mRelativeModeEnabled = enabled; + return true; + } + + @Override + public float getEventX(MotionEvent event) { + if (mRelativeModeEnabled) { + return event.getAxisValue(MotionEvent.AXIS_RELATIVE_X); + } + else { + return event.getX(0); + } + } + + @Override + public float getEventY(MotionEvent event) { + if (mRelativeModeEnabled) { + return event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y); + } + else { + return event.getY(0); + } + } +} + + +class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 { + // Generic Motion (mouse hover, joystick...) events go here + private boolean mRelativeModeEnabled; + + @Override + public boolean onGenericMotion(View v, MotionEvent event) { + float x, y; + int action; + + switch ( event.getSource() ) { + case InputDevice.SOURCE_JOYSTICK: + case InputDevice.SOURCE_GAMEPAD: + case InputDevice.SOURCE_DPAD: + return SDLControllerManager.handleJoystickMotionEvent(event); + + case InputDevice.SOURCE_MOUSE: + // DeX desktop mouse cursor is a separate non-standard input type. + case InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN: + action = event.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_SCROLL: + x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); + y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); + SDLActivity.onNativeMouse(0, action, x, y, false); + return true; + + case MotionEvent.ACTION_HOVER_MOVE: + x = event.getX(0); + y = event.getY(0); + SDLActivity.onNativeMouse(0, action, x, y, false); + return true; + + default: + break; + } + break; + + case InputDevice.SOURCE_MOUSE_RELATIVE: + action = event.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_SCROLL: + x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); + y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); + SDLActivity.onNativeMouse(0, action, x, y, false); + return true; + + case MotionEvent.ACTION_HOVER_MOVE: + x = event.getX(0); + y = event.getY(0); + SDLActivity.onNativeMouse(0, action, x, y, true); + return true; + + default: + break; + } + break; + + default: + break; + } + + // Event was not managed + return false; + } + + @Override + public boolean supportsRelativeMouse() { + return (!SDLActivity.isDeXMode() || (Build.VERSION.SDK_INT >= 27)); + } + + @Override + public boolean inRelativeMode() { + return mRelativeModeEnabled; + } + + @Override + public boolean setRelativeMouseEnabled(boolean enabled) { + if (!SDLActivity.isDeXMode() || (Build.VERSION.SDK_INT >= 27)) { + if (enabled) { + SDLActivity.getContentView().requestPointerCapture(); + } + else { + SDLActivity.getContentView().releasePointerCapture(); + } + mRelativeModeEnabled = enabled; + return true; + } + else + { + return false; + } + } + + @Override + public void reclaimRelativeMouseModeIfNeeded() + { + if (mRelativeModeEnabled && !SDLActivity.isDeXMode()) { + SDLActivity.getContentView().requestPointerCapture(); + } + } + + @Override + public float getEventX(MotionEvent event) { + // Relative mouse in capture mode will only have relative for X/Y + return event.getX(0); + } + + @Override + public float getEventY(MotionEvent event) { + // Relative mouse in capture mode will only have relative for X/Y + return event.getY(0); + } +} diff --git a/flare-android-project/app/src/main/jni/src/Android.mk b/flare-android-project/app/src/main/jni/src/Android.mk index b5295fe..d628c35 100644 --- a/flare-android-project/app/src/main/jni/src/Android.mk +++ b/flare-android-project/app/src/main/jni/src/Android.mk @@ -14,32 +14,30 @@ # Add your application source files here... LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \ ../../../../../../src/main.cpp \ - ../../../../../../src/BehaviorAlly.cpp \ - ../../../../../../src/Entity.cpp \ ../../../../../../src/Animation.cpp \ ../../../../../../src/AnimationManager.cpp \ + ../../../../../../src/AnimationMedia.cpp \ ../../../../../../src/AnimationSet.cpp \ ../../../../../../src/AStarContainer.cpp \ ../../../../../../src/AStarNode.cpp \ ../../../../../../src/Avatar.cpp \ - ../../../../../../src/BehaviorStandard.cpp \ + ../../../../../../src/Camera.cpp \ ../../../../../../src/CampaignManager.cpp \ ../../../../../../src/CombatText.cpp \ ../../../../../../src/CursorManager.cpp \ ../../../../../../src/DeviceList.cpp \ ../../../../../../src/EffectManager.cpp \ - ../../../../../../src/Enemy.cpp \ - ../../../../../../src/EnemyBehavior.cpp \ ../../../../../../src/EnemyGroupManager.cpp \ - ../../../../../../src/EnemyManager.cpp \ + ../../../../../../src/Entity.cpp \ + ../../../../../../src/EntityBehavior.cpp \ + ../../../../../../src/EntityManager.cpp \ ../../../../../../src/EngineSettings.cpp \ ../../../../../../src/EventManager.cpp \ ../../../../../../src/FileParser.cpp \ ../../../../../../src/FontEngine.cpp \ ../../../../../../src/GameSlotPreview.cpp \ ../../../../../../src/GameState.cpp \ - ../../../../../../src/GameStateConfigBase.cpp \ - ../../../../../../src/GameStateConfigDesktop.cpp \ + ../../../../../../src/GameStateConfig.cpp \ ../../../../../../src/GameStateCutscene.cpp \ ../../../../../../src/GameStateTitle.cpp \ ../../../../../../src/GameStateLoad.cpp \ @@ -64,16 +62,19 @@ ../../../../../../src/MenuActiveEffects.cpp \ ../../../../../../src/MenuBook.cpp \ ../../../../../../src/MenuCharacter.cpp \ + ../../../../../../src/MenuConfig.cpp \ ../../../../../../src/MenuConfirm.cpp \ ../../../../../../src/MenuDevConsole.cpp \ ../../../../../../src/MenuEnemy.cpp \ ../../../../../../src/MenuExit.cpp \ + ../../../../../../src/MenuGameOver.cpp \ ../../../../../../src/MenuHUDLog.cpp \ ../../../../../../src/MenuInventory.cpp \ ../../../../../../src/MenuItemStorage.cpp \ ../../../../../../src/MenuLog.cpp \ ../../../../../../src/MenuManager.cpp \ ../../../../../../src/MenuMiniMap.cpp \ + ../../../../../../src/MenuMovementType.cpp \ ../../../../../../src/MenuNumPicker.cpp \ ../../../../../../src/MenuPowers.cpp \ ../../../../../../src/MenuStash.cpp \ @@ -112,6 +113,7 @@ ../../../../../../src/Widget.cpp \ ../../../../../../src/WidgetCheckBox.cpp \ ../../../../../../src/WidgetButton.cpp \ + ../../../../../../src/WidgetHorizontalList.cpp \ ../../../../../../src/WidgetInput.cpp \ ../../../../../../src/WidgetLabel.cpp \ ../../../../../../src/WidgetListBox.cpp \ diff --git a/flare-android-project/build.gradle b/flare-android-project/build.gradle index 45df5e9..f787ce5 100644 --- a/flare-android-project/build.gradle +++ b/flare-android-project/build.gradle @@ -5,7 +5,7 @@ google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.0' + classpath 'com.android.tools.build:gradle:4.0.1' } } diff --git a/flare-android-project/flare-android-project.iml b/flare-android-project/flare-android-project.iml index d907edd..68052ef 100644 --- a/flare-android-project/flare-android-project.iml +++ b/flare-android-project/flare-android-project.iml @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ - + diff --git a/flare-android-project/gradle/wrapper/gradle-wrapper.properties b/flare-android-project/gradle/wrapper/gradle-wrapper.properties index fcc9efd..ef1912c 100644 --- a/flare-android-project/gradle/wrapper/gradle-wrapper.properties +++ b/flare-android-project/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Apr 05 15:20:13 EDT 2018 +#Mon Jun 08 12:29:11 EDT 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/make_emscripten.sh b/make_emscripten.sh index 5887789..498bbbd 100755 --- a/make_emscripten.sh +++ b/make_emscripten.sh @@ -9,17 +9,22 @@ cmake . emcc \ - -Isrc/ \ - src/*.cpp \ - -O3 \ - -s ASSERTIONS=1 \ - -s ALLOW_MEMORY_GROWTH=1 \ - -s USE_SDL=2 \ - -s USE_SDL_IMAGE=2 \ - -s SDL2_IMAGE_FORMATS='["png"]' \ + -v \ + -Isrc/ \ + src/*.cpp \ + -O3 \ + -s ASSERTIONS=1 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -s USE_SDL=2 \ + -s USE_SDL_IMAGE=2 \ + -s SDL2_IMAGE_FORMATS='["png"]' \ -s USE_SDL_TTF=2 \ - --preload-file mods \ - -o emscripten/index.html + -s USE_SDL_MIXER=2 \ + -s "EXTRA_EXPORTED_RUNTIME_METHODS=['print']" \ + -lidbfs.js \ + --preload-file mods \ + --use-preload-cache \ + -o emscripten/index.html rm -rf mods/fantasycore rm -rf mods/empyrean_campaign diff --git a/mods/default/cutscenes/credits.txt b/mods/default/cutscenes/credits.txt index 93ef9ce..d373f6b 100644 --- a/mods/default/cutscenes/credits.txt +++ b/mods/default/cutscenes/credits.txt @@ -23,6 +23,7 @@ text=Anton Golov text=Artur Rojek text=blazindragon +text=bloodhero text=Bonbadil text=Chris Oelmueller text=David Bariod @@ -32,11 +33,15 @@ text=Juan PabloTamayo text=Kitano text=Kyle Belanger +text=Leszek Cimała text=LongerDev text=Manuel A. Fernandez Montecelo text=Matthew Krohn +text=m7600 text=Nojan +text=nwtour text=Pavel Kirpichyov +text=r-a-cristian-93 text=runtime-x86 text=Ryan Dansie separator=32 @@ -52,36 +57,46 @@ text=Adrian Chaves Fernandez text=Andrea Ranaldi text=Andreas Berheim Brudin +text=Andrey Kapitonov text=Bas Doodeman +text=Błażej Pęksyk text=Bonbadil +text=bzt text=Carlos Sanchez text=Chris Oelmueller text=Christoph J. Thompson +text=Christophe Nemo text=Denis Lysenko text=Diego J. Romero López text=dumaosen +text=Elias Nykrem text=Emil text=Eric R text=Evgen Pavlov text=Fabio Loli text=Gianfranco Del Borrello text=Giovanni Dalla Torre +text=Grzegorz Szymaszek text=GunChleoc text=Hans Joachim Desserud text=hark34 text=Igor Paliychuk text=Janet Hunt text=Juan Pablo Tamayo +text=Kor_OfenTHource +text=(bnk159hair, kangdonghun1230, HunSeongPark, paparad0x) text=losine text=Marc Tormo i Bochaca +text=Maria Cano +text=McSinyx text=Michael Papageorgiou text=Mikhail Karalevich text=Miro Jánošík +text=MiroslavR text=Mykola Franchuk text=MOB2 text=Morgan Strauss text=Nea Retrogamer -text=Nguyễn Gia Phong text=Nikita Vanku text=Paul Wortmann text=Pawel Puszczynski @@ -92,6 +107,7 @@ text=Stefan Beller text=Stefano Peris text=sujiniku +text=syl_ text=Thomas Glamsch text=Timo Sievänen text=Vicente Monteiro diff --git a/mods/default/engine/combat_text.txt b/mods/default/engine/combat_text.txt index 4f93b97..97fa076 100644 --- a/mods/default/engine/combat_text.txt +++ b/mods/default/engine/combat_text.txt @@ -1,5 +1,3 @@ -# duration, in frames duration=1s - -# speed, in pixels per frame +fade_duration=400ms speed=1 diff --git a/mods/default/engine/font_settings.txt b/mods/default/engine/font_settings.txt index 840f631..8061743 100644 --- a/mods/default/engine/font_settings.txt +++ b/mods/default/engine/font_settings.txt @@ -5,17 +5,20 @@ id=font_regular style=default,LiberationSans-Regular.ttf,14,1 style=ja,unifont-10.0.06.ttf,14,1 +style=ko,unifont-10.0.06.ttf,14,1 style=zh,unifont-10.0.06.ttf,14,1 [font] id=font_captions style=default,LiberationSans-Regular.ttf,18,1 style=ja,unifont-10.0.06.ttf,18,1 +style=ko,unifont-10.0.06.ttf,18,1 style=zh,unifont-10.0.06.ttf,18,1 [font] id=font_subtitles style=default,LiberationSans-Regular.ttf,16,1 style=ja,unifont-10.0.06.ttf,16,1 +style=ko,unifont-10.0.06.ttf,16,1 style=zh,unifont-10.0.06.ttf,16,1 diff --git a/mods/default/engine/languages.txt b/mods/default/engine/languages.txt index d02eed2..541ac6d 100644 --- a/mods/default/engine/languages.txt +++ b/mods/default/engine/languages.txt @@ -14,13 +14,16 @@ el=Ελληνικά en=English es=Español +eu=Basque fi=Suomi fr=Français gd=Gàidhlig gl=Galego +hu=Magyar # he=עברית it=Italiano ja=Japanese +ko=Korean nb=Norsk Bokmål nl=Nederlands pl=Polski diff --git a/mods/default/images/logo/icon.png b/mods/default/images/logo/icon.png index a837912..760fe16 100644 Binary files a/mods/default/images/logo/icon.png and b/mods/default/images/logo/icon.png differ diff --git a/mods/default/images/menus/movement_type.png b/mods/default/images/menus/movement_type.png new file mode 100644 index 0000000..35f22a0 Binary files /dev/null and b/mods/default/images/menus/movement_type.png differ diff --git a/mods/default/images/menus/movement_type_joystick.png b/mods/default/images/menus/movement_type_joystick.png new file mode 100644 index 0000000..30fa868 Binary files /dev/null and b/mods/default/images/menus/movement_type_joystick.png differ diff --git a/mods/default/images/menus/movement_type_keyboard.png b/mods/default/images/menus/movement_type_keyboard.png new file mode 100644 index 0000000..ae0c583 Binary files /dev/null and b/mods/default/images/menus/movement_type_keyboard.png differ diff --git a/mods/default/images/menus/movement_type_mouse.png b/mods/default/images/menus/movement_type_mouse.png new file mode 100644 index 0000000..eb93e50 Binary files /dev/null and b/mods/default/images/menus/movement_type_mouse.png differ diff --git a/mods/default/languages/data.be.po b/mods/default/languages/data.be.po index 11fbbf6..dbbb052 100644 --- a/mods/default/languages/data.be.po +++ b/mods/default/languages/data.be.po @@ -3,15 +3,15 @@ # # FIRST AUTHOR , YEAR. # Translators: -# Zmicer Turok , 2018 +# Zmicer Turok , 2018 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Zmicer Turok , 2018\n" +"Last-Translator: Zmicer Turok , 2018\n" "Language-Team: Belarusian (https://www.transifex.com/flareorg/teams/84925/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -91,113 +91,9 @@ msgid "Lead Programmers" msgstr "Вядучыя праграмісты" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Праграмісты" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +103,22 @@ msgid "Translators" msgstr "Перакладчыкі" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero Lopez" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Эміль" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyen Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Распаўсюджвальнікі" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Шчырыя падзякі" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "За шматлікія водгукі і тэставанне:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "Суполка OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "За Tiled і экспарт мапаў Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.bg.po b/mods/default/languages/data.bg.po index f3578a2..9e1649b 100644 --- a/mods/default/languages/data.bg.po +++ b/mods/default/languages/data.bg.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: 48719d321e4b4a9c2ca8c6a1f8b9cba8, 2018\n" "Language-Team: Bulgarian (https://www.transifex.com/flareorg/teams/84925/bg/)\n" @@ -91,113 +91,9 @@ msgid "Lead Programmers" msgstr "Водещи програмисти" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Програмисти" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +103,22 @@ msgid "Translators" msgstr "Преводачи" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Emil" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Дистрибутори" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Специални благодарности" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "За даване на постоянна обратна връзка и тестване:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "Общността в OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "За Tiled и експортърът на карти за Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.ca.po b/mods/default/languages/data.ca.po index 7c47ace..95cbca0 100644 --- a/mods/default/languages/data.ca.po +++ b/mods/default/languages/data.ca.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Marc Tormo i Bochaca , 2018\n" "Language-Team: Catalan (https://www.transifex.com/flareorg/teams/84925/ca/)\n" @@ -91,113 +91,9 @@ msgid "Lead Programmers" msgstr "Principals programadors" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Programadors" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +103,22 @@ msgid "Translators" msgstr "Traductors" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Emil" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "Fabio Loli" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "Mykola Franchuk" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Distribuïdors" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Agraïments especials" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "Per realitzar comentaris i proves constantment:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "La comunitat de OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "Per els mosaics i els exportadors de mapes de Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.cs.po b/mods/default/languages/data.cs.po index c1ac536..f82a344 100644 --- a/mods/default/languages/data.cs.po +++ b/mods/default/languages/data.cs.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: a hark , 2018\n" "Language-Team: Czech (https://www.transifex.com/flareorg/teams/84925/cs/)\n" @@ -91,113 +91,9 @@ msgid "Lead Programmers" msgstr "vedoucí programátoři" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "programátoři" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +103,22 @@ msgid "Translators" msgstr "překladatelé" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "distributoři" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "zvláštní poděkování" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "za dlouhodobou zpětnou vazbu a testování" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "komunita na OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "za Tiled a exportér map Flare " - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.de.po b/mods/default/languages/data.de.po index b575e7a..84f45ab 100644 --- a/mods/default/languages/data.de.po +++ b/mods/default/languages/data.de.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-14 00:57+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Fyrenic , 2018\n" "Language-Team: German (https://www.transifex.com/flareorg/teams/84925/de/)\n" @@ -98,113 +98,9 @@ msgid "Lead Programmers" msgstr "Hauptprogrammierer" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Programmierer" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -214,234 +110,22 @@ msgid "Translators" msgstr "Übersetzer" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Emil" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "Fabio Loli" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "Marc Tormo i Bochaca" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "Mykola Franchuk" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Distributoren" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Besonderer Dank geht an" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "Für Feedback und Testen:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "Die Gemeinschaft von OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "Für Tiled und den Flare-Kartenexportierer:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.el.po b/mods/default/languages/data.el.po index 478721b..129b940 100644 --- a/mods/default/languages/data.el.po +++ b/mods/default/languages/data.el.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Nea Retrogamer (nearetrogamer), 2018\n" "Language-Team: Greek (https://www.transifex.com/flareorg/teams/84925/el/)\n" @@ -91,113 +91,9 @@ msgid "Lead Programmers" msgstr "" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Προγραμματιστές" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +103,22 @@ msgid "Translators" msgstr "Μεταφραστές" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "Iosine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Διανομείς" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.es.po b/mods/default/languages/data.es.po index 8d6930a..70d7d88 100644 --- a/mods/default/languages/data.es.po +++ b/mods/default/languages/data.es.po @@ -3,14 +3,13 @@ # # FIRST AUTHOR , YEAR. # Translators: -# Eric R, 2018 # Diego J. Romero López , 2018 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Diego J. Romero López , 2018\n" "Language-Team: Spanish (https://www.transifex.com/flareorg/teams/84925/es/)\n" @@ -92,113 +91,9 @@ msgid "Lead Programmers" msgstr "Programadores principales" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Programadores" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -208,234 +103,22 @@ msgid "Translators" msgstr "Traductores" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Emil" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "Fabio Loli" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "Marc Tormo i Bochaca" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "Mykola Franchuk" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Distribuidores" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Agradecimientos especiales" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "Por su retroalimentación y pruebas constantes" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "La comunidad de OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "Por Tiled y el exportador de mapas de Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.eu.po b/mods/default/languages/data.eu.po new file mode 100644 index 0000000..c710cdd --- /dev/null +++ b/mods/default/languages/data.eu.po @@ -0,0 +1,120 @@ +# Copyright (C) 2011 Clint Bellanger +# This file is distributed under the same license as the FLARE package. +# +# FIRST AUTHOR , YEAR. +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-07-29 09:34+\n" +"PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Language-Team: Basque (https://www.transifex.com/flareorg/teams/84925/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../engine/primary_stats.txt:3 +msgid "Physical" +msgstr "" + +#: ../engine/primary_stats.txt:7 +msgid "Mental" +msgstr "" + +#: ../engine/primary_stats.txt:11 +msgid "Offense" +msgstr "" + +#: ../engine/primary_stats.txt:15 +msgid "Defense" +msgstr "" + +#: ../engine/damage_types.txt:3 +msgid "Melee Damage" +msgstr "" + +#: ../engine/damage_types.txt:4 +msgid "Increases the damage done with swords and other melee weapons." +msgstr "" + +#: ../engine/damage_types.txt:5 +msgid "Melee Damage Min" +msgstr "" + +#: ../engine/damage_types.txt:6 +msgid "Melee Damage Max" +msgstr "" + +#: ../engine/damage_types.txt:12 +msgid "Ranged Damage" +msgstr "" + +#: ../engine/damage_types.txt:13 +msgid "Increases the damage done with bows and other ranged weapons." +msgstr "" + +#: ../engine/damage_types.txt:14 +msgid "Ranged Damage Min" +msgstr "" + +#: ../engine/damage_types.txt:15 +msgid "Ranged Damage Max" +msgstr "" + +#: ../engine/damage_types.txt:21 +msgid "Mental Damage" +msgstr "" + +#: ../engine/damage_types.txt:22 +msgid "Increases the damage done with staves and other mental weapons." +msgstr "" + +#: ../engine/damage_types.txt:23 +msgid "Mental Damage Min" +msgstr "" + +#: ../engine/damage_types.txt:24 +msgid "Mental Damage Max" +msgstr "" + +#: ../cutscenes/credits.txt:7 +msgid "Flare Engine Credits" +msgstr "" + +#: ../cutscenes/credits.txt:10 +msgid "Lead Programmers" +msgstr "" + +#: ../cutscenes/credits.txt:20 +msgid "Programmers" +msgstr "" + +#: ../cutscenes/credits.txt:44 +msgid "Default Art" +msgstr "" + +#: ../cutscenes/credits.txt:49 +msgid "Translators" +msgstr "" + +#: ../cutscenes/credits.txt:108 +msgid "Distributors" +msgstr "" + +#: ../cutscenes/credits.txt:117 +msgid "Special Thanks" +msgstr "" + +#: ../cutscenes/credits.txt:121 +msgid "For giving constant feedback and testing:" +msgstr "" + +#: ../cutscenes/credits.txt:123 +msgid "The community at OpenGameArt" +msgstr "" + +#: ../cutscenes/credits.txt:127 +msgid "For Tiled and the Flare map exporter:" +msgstr "" diff --git a/mods/default/languages/data.fi.po b/mods/default/languages/data.fi.po index 5a94204..03cee6c 100644 --- a/mods/default/languages/data.fi.po +++ b/mods/default/languages/data.fi.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Language-Team: Finnish (https://www.transifex.com/flareorg/teams/84925/fi/)\n" "MIME-Version: 1.0\n" @@ -87,112 +87,8 @@ msgid "Lead Programmers" msgstr "" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" - #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" msgstr "" #: ../cutscenes/credits.txt:44 @@ -203,234 +99,22 @@ msgid "Translators" msgstr "" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" diff --git a/mods/default/languages/data.fr.po b/mods/default/languages/data.fr.po index 99db312..37d0ed3 100644 --- a/mods/default/languages/data.fr.po +++ b/mods/default/languages/data.fr.po @@ -4,14 +4,16 @@ # FIRST AUTHOR , YEAR. # Translators: # Justin Jacobs , 2018 +# syl_, 2019 +# leø , 2020 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2020-05-20 16:39+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Justin Jacobs , 2018\n" +"Last-Translator: leø , 2020\n" "Language-Team: French (https://www.transifex.com/flareorg/teams/84925/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -29,7 +31,7 @@ #: ../engine/primary_stats.txt:11 msgid "Offense" -msgstr "Offense" +msgstr "Attaque" #: ../engine/primary_stats.txt:15 msgid "Defense" @@ -37,404 +39,89 @@ #: ../engine/damage_types.txt:3 msgid "Melee Damage" -msgstr "Dégats de mélée" +msgstr "Dégâts de mêlée" #: ../engine/damage_types.txt:4 msgid "Increases the damage done with swords and other melee weapons." -msgstr "Augmente les dégats infligés avec des épées et autres armes de mélée" +msgstr "Augmente les dégâts infligés avec des épées et autres armes de mêlée" #: ../engine/damage_types.txt:5 msgid "Melee Damage Min" -msgstr "Dégats de mélée Min" +msgstr "Dégâts de mêlée min" #: ../engine/damage_types.txt:6 msgid "Melee Damage Max" -msgstr "Dégats de mélée max" +msgstr "Dégâts de mêlée max" #: ../engine/damage_types.txt:12 msgid "Ranged Damage" -msgstr "Dégats a distance" +msgstr "Dégâts à distance" #: ../engine/damage_types.txt:13 msgid "Increases the damage done with bows and other ranged weapons." -msgstr "Augmente les dégats infligés avec des arcs et autres armes a distance" +msgstr "" +"Augmente les dégâts infligés avec des arcs et autres armes à distance." #: ../engine/damage_types.txt:14 msgid "Ranged Damage Min" -msgstr "Dégats a distance min" +msgstr "Dégâts à distance min" #: ../engine/damage_types.txt:15 msgid "Ranged Damage Max" -msgstr "Dégats a distance max" +msgstr "Dégâts à distance max" #: ../engine/damage_types.txt:21 msgid "Mental Damage" -msgstr "Dégats mentaux" +msgstr "Dégâts mentaux" #: ../engine/damage_types.txt:22 msgid "Increases the damage done with staves and other mental weapons." -msgstr "Augmente les dégats infligés avec des batons et autres armes mentales" +msgstr "Augmente les dégâts infligés avec des bâtons et autres armes mentales" #: ../engine/damage_types.txt:23 msgid "Mental Damage Min" -msgstr "Dégats mentaux min" +msgstr "Dégâts mentaux min" #: ../engine/damage_types.txt:24 msgid "Mental Damage Max" -msgstr "Dégats mentaux max" +msgstr "Dégâts mentaux max" #: ../cutscenes/credits.txt:7 msgid "Flare Engine Credits" -msgstr "Credits du Moteur de Flare" +msgstr "Crédits du moteur de Flare" #: ../cutscenes/credits.txt:10 msgid "Lead Programmers" -msgstr "Programmeurs Principaux" - -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" +msgstr "Programmeurs principaux" #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Programmeurs" -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" +#: ../cutscenes/credits.txt:48 +msgid "Default Art" +msgstr "Illustrateurs" -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "" - -#: ../cutscenes/credits.txt:44 -msgid "Default Art" -msgstr "" - -#: ../cutscenes/credits.txt:49 +#: ../cutscenes/credits.txt:53 msgid "Translators" msgstr "Traducteurs" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:112 msgid "Distributors" msgstr "Distributeurs" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" +#: ../cutscenes/credits.txt:121 +msgid "Special Thanks" +msgstr "Remerciements spéciaux" -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 -msgid "Special Thanks" -msgstr "Remerciements spécials" - -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:125 msgid "For giving constant feedback and testing:" msgstr "Pour constamment donner leur avis et tester :" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:127 msgid "The community at OpenGameArt" msgstr "La communauté OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:131 msgid "For Tiled and the Flare map exporter:" -msgstr "Pour Tiled et l'exporteur de map de Flare" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" +msgstr "Pour Tiled et l'exportateur de carte de Flare :" diff --git a/mods/default/languages/data.gd.po b/mods/default/languages/data.gd.po index dc723e8..ae5ef0c 100644 --- a/mods/default/languages/data.gd.po +++ b/mods/default/languages/data.gd.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-14 00:57+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: GunChleoc, 2018\n" "Language-Team: Gaelic, Scottish (https://www.transifex.com/flareorg/teams/84925/gd/)\n" @@ -92,113 +92,9 @@ msgid "Lead Programmers" msgstr "Prìomh luchd-prògramachaidh" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Luchd-prògramachaidh" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -208,234 +104,22 @@ msgid "Translators" msgstr "Eadar-theangadairean" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Emil" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "Fabio Loli" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "Marc Tormo i Bochaca" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "Mykola Franchuk" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Luchd-sgaoilidh" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Taing shònraichte" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "Airson torr bheachdan is deuchainneachaidh:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "Coimhearsnachd OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "Airson Tiled agus inneal às-phortaidh mhapaichean Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.gl.po b/mods/default/languages/data.gl.po index 8669e7f..8a28f3e 100644 --- a/mods/default/languages/data.gl.po +++ b/mods/default/languages/data.gl.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Justin Jacobs , 2018\n" "Language-Team: Galician (https://www.transifex.com/flareorg/teams/84925/gl/)\n" @@ -91,112 +91,8 @@ msgid "Lead Programmers" msgstr "" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" - #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" msgstr "" #: ../cutscenes/credits.txt:44 @@ -207,234 +103,22 @@ msgid "Translators" msgstr "" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" diff --git a/mods/default/languages/data.he.po b/mods/default/languages/data.he.po index f49a0d3..6a6b15c 100644 --- a/mods/default/languages/data.he.po +++ b/mods/default/languages/data.he.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Language-Team: Hebrew (https://www.transifex.com/flareorg/teams/84925/he/)\n" "MIME-Version: 1.0\n" @@ -87,112 +87,8 @@ msgid "Lead Programmers" msgstr "" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" - #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" msgstr "" #: ../cutscenes/credits.txt:44 @@ -203,234 +99,22 @@ msgid "Translators" msgstr "" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" diff --git a/mods/default/languages/data.hu.po b/mods/default/languages/data.hu.po new file mode 100644 index 0000000..e547a2e --- /dev/null +++ b/mods/default/languages/data.hu.po @@ -0,0 +1,124 @@ +# Copyright (C) 2011 Clint Bellanger +# This file is distributed under the same license as the FLARE package. +# +# FIRST AUTHOR , YEAR. +# Translators: +# Justin Jacobs , 2019 +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-07-29 09:34+\n" +"PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Last-Translator: Justin Jacobs , 2019\n" +"Language-Team: Hungarian (https://www.transifex.com/flareorg/teams/84925/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../engine/primary_stats.txt:3 +msgid "Physical" +msgstr "Fizikai" + +#: ../engine/primary_stats.txt:7 +msgid "Mental" +msgstr "Mentális" + +#: ../engine/primary_stats.txt:11 +msgid "Offense" +msgstr "Támadó" + +#: ../engine/primary_stats.txt:15 +msgid "Defense" +msgstr "Védő" + +#: ../engine/damage_types.txt:3 +msgid "Melee Damage" +msgstr "Közeharc Sebzés" + +#: ../engine/damage_types.txt:4 +msgid "Increases the damage done with swords and other melee weapons." +msgstr "" + +#: ../engine/damage_types.txt:5 +msgid "Melee Damage Min" +msgstr "Közelharc Sebzés Min" + +#: ../engine/damage_types.txt:6 +msgid "Melee Damage Max" +msgstr "Közelharc Sebzés Max" + +#: ../engine/damage_types.txt:12 +msgid "Ranged Damage" +msgstr "Lővegyver Sebzés" + +#: ../engine/damage_types.txt:13 +msgid "Increases the damage done with bows and other ranged weapons." +msgstr "" + +#: ../engine/damage_types.txt:14 +msgid "Ranged Damage Min" +msgstr "Lőfegyver Sebzés Min" + +#: ../engine/damage_types.txt:15 +msgid "Ranged Damage Max" +msgstr "Lőfegyver Sebzés Max" + +#: ../engine/damage_types.txt:21 +msgid "Mental Damage" +msgstr "Mentális Sebzés" + +#: ../engine/damage_types.txt:22 +msgid "Increases the damage done with staves and other mental weapons." +msgstr "" + +#: ../engine/damage_types.txt:23 +msgid "Mental Damage Min" +msgstr "Mentális Sebzés Min" + +#: ../engine/damage_types.txt:24 +msgid "Mental Damage Max" +msgstr "Mentális Sebzés Max" + +#: ../cutscenes/credits.txt:7 +msgid "Flare Engine Credits" +msgstr "Flare Motor Készítők" + +#: ../cutscenes/credits.txt:10 +msgid "Lead Programmers" +msgstr "Vezető fejlesztők" + +#: ../cutscenes/credits.txt:20 +msgid "Programmers" +msgstr "Programozók" + +#: ../cutscenes/credits.txt:44 +msgid "Default Art" +msgstr "" + +#: ../cutscenes/credits.txt:49 +msgid "Translators" +msgstr "" + +#: ../cutscenes/credits.txt:108 +msgid "Distributors" +msgstr "Terjesztők" + +#: ../cutscenes/credits.txt:117 +msgid "Special Thanks" +msgstr "Külön köszönet" + +#: ../cutscenes/credits.txt:121 +msgid "For giving constant feedback and testing:" +msgstr "a folyamatos visszajelzésért és tesztelésért:" + +#: ../cutscenes/credits.txt:123 +msgid "The community at OpenGameArt" +msgstr "Az OpenGameArt közösség" + +#: ../cutscenes/credits.txt:127 +msgid "For Tiled and the Flare map exporter:" +msgstr "A Tiled és Flare térkép exporerért:" diff --git a/mods/default/languages/data.it.po b/mods/default/languages/data.it.po index 90b779f..9799e89 100644 --- a/mods/default/languages/data.it.po +++ b/mods/default/languages/data.it.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: MOB2 , 2018\n" "Language-Team: Italian (https://www.transifex.com/flareorg/teams/84925/it/)\n" @@ -91,113 +91,9 @@ msgid "Lead Programmers" msgstr "Capi Programmatori" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Programmatori" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +103,22 @@ msgid "Translators" msgstr "Traduttori" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Distributori" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Speciali Ringraziamenti" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "Per il costante feedback e il testing:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "La comunità di OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "Per l'editor Tiled e l'esportatore di mappe di Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.ja.po b/mods/default/languages/data.ja.po index bab27b0..493b019 100644 --- a/mods/default/languages/data.ja.po +++ b/mods/default/languages/data.ja.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Justin Jacobs , 2018\n" "Language-Team: Japanese (https://www.transifex.com/flareorg/teams/84925/ja/)\n" @@ -91,112 +91,8 @@ msgid "Lead Programmers" msgstr "" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" - #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" msgstr "" #: ../cutscenes/credits.txt:44 @@ -207,234 +103,22 @@ msgid "Translators" msgstr "" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" diff --git a/mods/default/languages/data.ko.po b/mods/default/languages/data.ko.po new file mode 100644 index 0000000..cd9f574 --- /dev/null +++ b/mods/default/languages/data.ko.po @@ -0,0 +1,120 @@ +# Copyright (C) 2011 Clint Bellanger +# This file is distributed under the same license as the FLARE package. +# +# FIRST AUTHOR , YEAR. +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-05-20 16:39+\n" +"PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Language-Team: Korean (https://www.transifex.com/flareorg/teams/84925/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../engine/primary_stats.txt:3 +msgid "Physical" +msgstr "" + +#: ../engine/primary_stats.txt:7 +msgid "Mental" +msgstr "" + +#: ../engine/primary_stats.txt:11 +msgid "Offense" +msgstr "" + +#: ../engine/primary_stats.txt:15 +msgid "Defense" +msgstr "" + +#: ../engine/damage_types.txt:3 +msgid "Melee Damage" +msgstr "" + +#: ../engine/damage_types.txt:4 +msgid "Increases the damage done with swords and other melee weapons." +msgstr "" + +#: ../engine/damage_types.txt:5 +msgid "Melee Damage Min" +msgstr "" + +#: ../engine/damage_types.txt:6 +msgid "Melee Damage Max" +msgstr "" + +#: ../engine/damage_types.txt:12 +msgid "Ranged Damage" +msgstr "" + +#: ../engine/damage_types.txt:13 +msgid "Increases the damage done with bows and other ranged weapons." +msgstr "" + +#: ../engine/damage_types.txt:14 +msgid "Ranged Damage Min" +msgstr "" + +#: ../engine/damage_types.txt:15 +msgid "Ranged Damage Max" +msgstr "" + +#: ../engine/damage_types.txt:21 +msgid "Mental Damage" +msgstr "" + +#: ../engine/damage_types.txt:22 +msgid "Increases the damage done with staves and other mental weapons." +msgstr "" + +#: ../engine/damage_types.txt:23 +msgid "Mental Damage Min" +msgstr "" + +#: ../engine/damage_types.txt:24 +msgid "Mental Damage Max" +msgstr "" + +#: ../cutscenes/credits.txt:7 +msgid "Flare Engine Credits" +msgstr "" + +#: ../cutscenes/credits.txt:10 +msgid "Lead Programmers" +msgstr "" + +#: ../cutscenes/credits.txt:20 +msgid "Programmers" +msgstr "" + +#: ../cutscenes/credits.txt:48 +msgid "Default Art" +msgstr "" + +#: ../cutscenes/credits.txt:53 +msgid "Translators" +msgstr "" + +#: ../cutscenes/credits.txt:112 +msgid "Distributors" +msgstr "" + +#: ../cutscenes/credits.txt:121 +msgid "Special Thanks" +msgstr "" + +#: ../cutscenes/credits.txt:125 +msgid "For giving constant feedback and testing:" +msgstr "" + +#: ../cutscenes/credits.txt:127 +msgid "The community at OpenGameArt" +msgstr "" + +#: ../cutscenes/credits.txt:131 +msgid "For Tiled and the Flare map exporter:" +msgstr "" diff --git a/mods/default/languages/data.nb.po b/mods/default/languages/data.nb.po index f87f829..716a2ac 100644 --- a/mods/default/languages/data.nb.po +++ b/mods/default/languages/data.nb.po @@ -2,12 +2,16 @@ # This file is distributed under the same license as the FLARE package. # # FIRST AUTHOR , YEAR. +# Translators: +# Elias Nykrem , 2019 +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Last-Translator: Elias Nykrem , 2019\n" "Language-Team: Norwegian Bokmål (https://www.transifex.com/flareorg/teams/84925/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,420 +21,104 @@ #: ../engine/primary_stats.txt:3 msgid "Physical" -msgstr "" +msgstr "Fysisk" #: ../engine/primary_stats.txt:7 msgid "Mental" -msgstr "" +msgstr "Mentalitet" #: ../engine/primary_stats.txt:11 msgid "Offense" -msgstr "" +msgstr "Offensiv" #: ../engine/primary_stats.txt:15 msgid "Defense" -msgstr "" +msgstr "Defensiv" #: ../engine/damage_types.txt:3 msgid "Melee Damage" -msgstr "" +msgstr "Nærkamp Skade" #: ../engine/damage_types.txt:4 msgid "Increases the damage done with swords and other melee weapons." -msgstr "" +msgstr "Øker skade gjort med sverd og andre nærkampsvåpen." #: ../engine/damage_types.txt:5 msgid "Melee Damage Min" -msgstr "" +msgstr "Nærkamp Skade Min" #: ../engine/damage_types.txt:6 msgid "Melee Damage Max" -msgstr "" +msgstr "Nærkamp Skade Maks" #: ../engine/damage_types.txt:12 msgid "Ranged Damage" -msgstr "" +msgstr "Distanse Skade" #: ../engine/damage_types.txt:13 msgid "Increases the damage done with bows and other ranged weapons." -msgstr "" +msgstr "Øker skade gjort med buer og andre distansevåpen." #: ../engine/damage_types.txt:14 msgid "Ranged Damage Min" -msgstr "" +msgstr "Distanse Skade Min" #: ../engine/damage_types.txt:15 msgid "Ranged Damage Max" -msgstr "" +msgstr "Distanse Skade Maks" #: ../engine/damage_types.txt:21 msgid "Mental Damage" -msgstr "" +msgstr "Mental Skade" #: ../engine/damage_types.txt:22 msgid "Increases the damage done with staves and other mental weapons." -msgstr "" +msgstr "Øker skade gjort med staver og andre mentalitetsvåpen." #: ../engine/damage_types.txt:23 msgid "Mental Damage Min" -msgstr "" +msgstr "Mental Skade Min" #: ../engine/damage_types.txt:24 msgid "Mental Damage Max" -msgstr "" +msgstr "Mental Skade Maks" #: ../cutscenes/credits.txt:7 msgid "Flare Engine Credits" -msgstr "" +msgstr "Flare Engine Rulletekst" #: ../cutscenes/credits.txt:10 msgid "Lead Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" +msgstr "Ledende Programmerere" #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "" +msgstr "Programmerere" #: ../cutscenes/credits.txt:44 msgid "Default Art" -msgstr "" +msgstr "Standard Kunst" #: ../cutscenes/credits.txt:49 msgid "Translators" -msgstr "" +msgstr "Oversettere" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" -msgstr "" - -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 -msgid "Special Thanks" -msgstr "" - -#: ../cutscenes/credits.txt:116 -msgid "For giving constant feedback and testing:" -msgstr "" +msgstr "Distributører" #: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" +msgid "Special Thanks" +msgstr "Spesielt takk til" -#: ../cutscenes/credits.txt:118 -msgid "The community at OpenGameArt" -msgstr "" - -#: ../cutscenes/credits.txt:122 -msgid "For Tiled and the Flare map exporter:" -msgstr "" +#: ../cutscenes/credits.txt:121 +msgid "For giving constant feedback and testing:" +msgstr "For konstant testing og tilbakemelding:" #: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" +msgid "The community at OpenGameArt" +msgstr "Fellesskapet ved OpenGameArt" -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" +#: ../cutscenes/credits.txt:127 +msgid "For Tiled and the Flare map exporter:" +msgstr "Til Tiled og Flare kart eksportør:" diff --git a/mods/default/languages/data.nl.po b/mods/default/languages/data.nl.po index 75af886..5eac764 100644 --- a/mods/default/languages/data.nl.po +++ b/mods/default/languages/data.nl.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Language-Team: Dutch (https://www.transifex.com/flareorg/teams/84925/nl/)\n" "MIME-Version: 1.0\n" @@ -87,112 +87,8 @@ msgid "Lead Programmers" msgstr "" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" - #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" msgstr "" #: ../cutscenes/credits.txt:44 @@ -203,234 +99,22 @@ msgid "Translators" msgstr "" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" diff --git a/mods/default/languages/data.pl.po b/mods/default/languages/data.pl.po index 144ccc5..e74a853 100644 --- a/mods/default/languages/data.pl.po +++ b/mods/default/languages/data.pl.po @@ -3,15 +3,15 @@ # # FIRST AUTHOR , YEAR. # Translators: -# Justin Jacobs , 2018 +# Justin Jacobs , 2019 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Justin Jacobs , 2018\n" +"Last-Translator: Justin Jacobs , 2019\n" "Language-Team: Polish (https://www.transifex.com/flareorg/teams/84925/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,6 +42,8 @@ #: ../engine/damage_types.txt:4 msgid "Increases the damage done with swords and other melee weapons." msgstr "" +"Zwiększa obrażenia zadawane przez miecze i inne bronie służące do walki w " +"zwarciu." #: ../engine/damage_types.txt:5 msgid "Melee Damage Min" @@ -58,6 +60,7 @@ #: ../engine/damage_types.txt:13 msgid "Increases the damage done with bows and other ranged weapons." msgstr "" +"Zwiększa obrażenia zadawane przez łuki i inne bronie do walki dystansowej." #: ../engine/damage_types.txt:14 msgid "Ranged Damage Min" @@ -74,6 +77,8 @@ #: ../engine/damage_types.txt:22 msgid "Increases the damage done with staves and other mental weapons." msgstr "" +"Zwiększa obrażenia zadawane przez kostury i inne bronie korzystające z mocy " +"umysłu." #: ../engine/damage_types.txt:23 msgid "Mental Damage Min" @@ -91,113 +96,9 @@ msgid "Lead Programmers" msgstr "Główni programiści" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Programiści" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +108,22 @@ msgid "Translators" msgstr "Tłumacze" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Paweł Puszczyński" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Dystrybutorzy" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Specjalne podziękowania" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "Za nieustające wsparcie i testowanie:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "Społeczność OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "Za Tiled i eksporter map Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.pot b/mods/default/languages/data.pot index 5c7f17f..ddee323 100644 --- a/mods/default/languages/data.pot +++ b/mods/default/languages/data.pot @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50+\n" +"POT-Creation-Date: 2021-05-23 20:34+\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -87,351 +87,35 @@ msgid "Lead Programmers" msgstr "" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "" -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "" - -#: ../cutscenes/credits.txt:44 +#: ../cutscenes/credits.txt:49 msgid "Default Art" msgstr "" -#: ../cutscenes/credits.txt:49 +#: ../cutscenes/credits.txt:54 msgid "Translators" msgstr "" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:118 msgid "Distributors" msgstr "" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:127 msgid "Special Thanks" msgstr "" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:131 msgid "For giving constant feedback and testing:" msgstr "" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:133 msgid "The community at OpenGameArt" msgstr "" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:137 msgid "For Tiled and the Flare map exporter:" msgstr "" -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" - diff --git a/mods/default/languages/data.pt.po b/mods/default/languages/data.pt.po index ba5c4f4..f556b7b 100644 --- a/mods/default/languages/data.pt.po +++ b/mods/default/languages/data.pt.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-14 00:57+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Rui , 2018\n" "Language-Team: Portuguese (https://www.transifex.com/flareorg/teams/84925/pt/)\n" @@ -92,113 +92,9 @@ msgid "Lead Programmers" msgstr "Programadores Principais" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Programadores" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -208,234 +104,22 @@ msgid "Translators" msgstr "Tradutores" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Emil" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "Fabio Loli" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "Marc Tormo i Bochaca" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "Mykola Franchuk" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui (xendez)" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Distribuidores" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Agradecimento Especial" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "Por fornecer opiniões constantes e testes:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "A comunidade do OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "Pelo Tiled e o exportador de mapas do Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.pt_BR.po b/mods/default/languages/data.pt_BR.po index 6b21297..35658bf 100644 --- a/mods/default/languages/data.pt_BR.po +++ b/mods/default/languages/data.pt_BR.po @@ -4,15 +4,14 @@ # FIRST AUTHOR , YEAR. # Translators: # Vicente Monteiro, 2018 -# Rui , 2018 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Rui , 2018\n" +"Last-Translator: Vicente Monteiro, 2018\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/flareorg/teams/84925/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -92,113 +91,9 @@ msgid "Lead Programmers" msgstr "Programadores Principais" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Programadores" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Andrew Engelbrecht" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -208,234 +103,22 @@ msgid "Translators" msgstr "Tradutores" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Denis Lysenko" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Emil" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "Fabio Loli" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Janet Hunt" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Sergiy Borodych" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Stefano Peris" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Vicente Monteiro" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Distribuidores" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Agradecimento Especial" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "Por constantes sugestões e testes:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "A comunidade do OpenGameArt:" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "Pelo Tiled editor e exportador de mapas do Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.ru.po b/mods/default/languages/data.ru.po index 0be5d55..7612567 100644 --- a/mods/default/languages/data.ru.po +++ b/mods/default/languages/data.ru.po @@ -3,15 +3,15 @@ # # FIRST AUTHOR , YEAR. # Translators: -# Justin Jacobs , 2018 +# Justin Jacobs , 2019 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Justin Jacobs , 2018\n" +"Last-Translator: Justin Jacobs , 2019\n" "Language-Team: Russian (https://www.transifex.com/flareorg/teams/84925/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,15 +41,15 @@ #: ../engine/damage_types.txt:4 msgid "Increases the damage done with swords and other melee weapons." -msgstr "" +msgstr "Увеличивает урон мечом и другим оружием ближнего боя." #: ../engine/damage_types.txt:5 msgid "Melee Damage Min" -msgstr "Мин. Урон" +msgstr "Мин. Урон ближнего боя" #: ../engine/damage_types.txt:6 msgid "Melee Damage Max" -msgstr "Макс. Урон" +msgstr "Макс. Урон ближнего боя" #: ../engine/damage_types.txt:12 msgid "Ranged Damage" @@ -57,15 +57,15 @@ #: ../engine/damage_types.txt:13 msgid "Increases the damage done with bows and other ranged weapons." -msgstr "" +msgstr "Увеличивает урон из лука и другим оружием дальнего боя." #: ../engine/damage_types.txt:14 msgid "Ranged Damage Min" -msgstr "Мин. Урон" +msgstr "Мин. Урон дальнего боя" #: ../engine/damage_types.txt:15 msgid "Ranged Damage Max" -msgstr "Макс. Урон" +msgstr "Макс. Урон дальнего боя" #: ../engine/damage_types.txt:21 msgid "Mental Damage" @@ -73,15 +73,15 @@ #: ../engine/damage_types.txt:22 msgid "Increases the damage done with staves and other mental weapons." -msgstr "" +msgstr "Увеличивает урон посохом и другим оружием ментального урона." #: ../engine/damage_types.txt:23 msgid "Mental Damage Min" -msgstr "Мин. Урон" +msgstr "Мин. Ментальный урон" #: ../engine/damage_types.txt:24 msgid "Mental Damage Max" -msgstr "Макс. Урон" +msgstr "Макс. Ментальный урон" #: ../cutscenes/credits.txt:7 msgid "Flare Engine Credits" @@ -91,113 +91,9 @@ msgid "Lead Programmers" msgstr "Ведущие Программисты" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Clint Bellanger" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Henrik Andersson" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Igor Paliychuk" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Stefan Beller" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Программисты" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Anton Golov" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "David Bariod" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Daniel Santos" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Joseph Bleu" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Kyle Belanger" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Matthew Krohn" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Pavel Kirpichyov" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +103,22 @@ msgid "Translators" msgstr "Переводчики" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Andrea Ranaldi" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Carlos Sanchez" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Evgen Pavlov" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Giovanni Dalla Torre" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Mikhail Karalevich" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Miro Jánošík" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Morgan Strauss" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Nikita Vanku" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Paul Wortmann" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Pawel Puszczynski" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Quentin Stievenart" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Sergey Basalaev" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Yannis Anthymidis" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Распространители" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Особая благодарность" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "За постоянные отзывы и тестирование:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Bart Kelsey" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "Сообщество OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "За Tiled и экспорт карт Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.sk.po b/mods/default/languages/data.sk.po index a0bc746..54be8a8 100644 --- a/mods/default/languages/data.sk.po +++ b/mods/default/languages/data.sk.po @@ -2,12 +2,16 @@ # This file is distributed under the same license as the FLARE package. # # FIRST AUTHOR , YEAR. +# Translators: +# MiroslavR , 2019 +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Last-Translator: MiroslavR , 2019\n" "Language-Team: Slovak (https://www.transifex.com/flareorg/teams/84925/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,420 +21,104 @@ #: ../engine/primary_stats.txt:3 msgid "Physical" -msgstr "" +msgstr "Fyzické" #: ../engine/primary_stats.txt:7 msgid "Mental" -msgstr "" +msgstr "Mentálne" #: ../engine/primary_stats.txt:11 msgid "Offense" -msgstr "" +msgstr "Útok" #: ../engine/primary_stats.txt:15 msgid "Defense" -msgstr "" +msgstr "Obrana" #: ../engine/damage_types.txt:3 msgid "Melee Damage" -msgstr "" +msgstr "Zranenie nablízko" #: ../engine/damage_types.txt:4 msgid "Increases the damage done with swords and other melee weapons." -msgstr "" +msgstr "Zvyšuje zranenie spôsobené mečmi a inými zbraňami nablízko." #: ../engine/damage_types.txt:5 msgid "Melee Damage Min" -msgstr "" +msgstr "Min. zranenie nablízko" #: ../engine/damage_types.txt:6 msgid "Melee Damage Max" -msgstr "" +msgstr "Max. zranenie nablízko" #: ../engine/damage_types.txt:12 msgid "Ranged Damage" -msgstr "" +msgstr "Zranenie na diaľku" #: ../engine/damage_types.txt:13 msgid "Increases the damage done with bows and other ranged weapons." -msgstr "" +msgstr "Zvyšuje zranenie spôsobené lukmi a inými zbraňami na diaľku." #: ../engine/damage_types.txt:14 msgid "Ranged Damage Min" -msgstr "" +msgstr "Min. zranenie na diaľku" #: ../engine/damage_types.txt:15 msgid "Ranged Damage Max" -msgstr "" +msgstr "Max. zranenie na diaľku" #: ../engine/damage_types.txt:21 msgid "Mental Damage" -msgstr "" +msgstr "Mentálne zranenie" #: ../engine/damage_types.txt:22 msgid "Increases the damage done with staves and other mental weapons." -msgstr "" +msgstr "Zvyšuje zranenie spôsobené palicami a inými mentálnymi zbraňami." #: ../engine/damage_types.txt:23 msgid "Mental Damage Min" -msgstr "" +msgstr "Min. mentálne zranenie" #: ../engine/damage_types.txt:24 msgid "Mental Damage Max" -msgstr "" +msgstr "Max. mentálne zranenie" #: ../cutscenes/credits.txt:7 msgid "Flare Engine Credits" -msgstr "" +msgstr "Autori Flare Engine" #: ../cutscenes/credits.txt:10 msgid "Lead Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" +msgstr "Hlavní programátori" #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "" +msgstr "Programátori" #: ../cutscenes/credits.txt:44 msgid "Default Art" -msgstr "" +msgstr "Predvolená grafika" #: ../cutscenes/credits.txt:49 msgid "Translators" -msgstr "" +msgstr "Prekladatelia" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" -msgstr "" - -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 -msgid "Special Thanks" -msgstr "" - -#: ../cutscenes/credits.txt:116 -msgid "For giving constant feedback and testing:" -msgstr "" +msgstr "Distribútori" #: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" +msgid "Special Thanks" +msgstr "Špeciálne poďakovanie" -#: ../cutscenes/credits.txt:118 -msgid "The community at OpenGameArt" -msgstr "" - -#: ../cutscenes/credits.txt:122 -msgid "For Tiled and the Flare map exporter:" -msgstr "" +#: ../cutscenes/credits.txt:121 +msgid "For giving constant feedback and testing:" +msgstr "Za pravidelné poskytovanie spätnej väzby a testovanie:" #: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" +msgid "The community at OpenGameArt" +msgstr "Komunita OpenGameArt" -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" +#: ../cutscenes/credits.txt:127 +msgid "For Tiled and the Flare map exporter:" +msgstr "Za nástroj Tiled a exportér máp Flare:" diff --git a/mods/default/languages/data.sv.po b/mods/default/languages/data.sv.po index 95c56e8..2c22439 100644 --- a/mods/default/languages/data.sv.po +++ b/mods/default/languages/data.sv.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Language-Team: Swedish (https://www.transifex.com/flareorg/teams/84925/sv/)\n" "MIME-Version: 1.0\n" @@ -87,112 +87,8 @@ msgid "Lead Programmers" msgstr "" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" - #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" msgstr "" #: ../cutscenes/credits.txt:44 @@ -203,234 +99,22 @@ msgid "Translators" msgstr "" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" diff --git a/mods/default/languages/data.uk.po b/mods/default/languages/data.uk.po index d5d43b8..5f7f391 100644 --- a/mods/default/languages/data.uk.po +++ b/mods/default/languages/data.uk.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-14 00:57+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: igorko , 2018\n" "Language-Team: Ukrainian (https://www.transifex.com/flareorg/teams/84925/uk/)\n" @@ -93,113 +93,9 @@ msgid "Lead Programmers" msgstr "Провідні програмісти" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "Клінт Беланжер" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "Генрік Андерсон" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "Ігор Палійчук" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "Justin Jacobs" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "Стефан Беллер" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "Thane Brimhall" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Програмісти" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "Ендрю Енгельбрехт" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "Антон Голов" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "Artur Rojek" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "blazindragon" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "Bonbadil" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "Chris Oelmueller" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "Девід Баріод" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "Даніель Сантос" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "Gallaecio" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "Жозеф Блю" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "Juan PabloTamayo" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "Kitano" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "Кайл Беланжер" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "LongerDev" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "Manuel A. Fernandez Montecelo" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "Метью Крон" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "Nojan" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "Павел Кірпічов" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "runtime-x86" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "Ryan Dansie" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -209,234 +105,22 @@ msgid "Translators" msgstr "Перекладачі" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "Ademaro" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "Adrian Chaves Fernandez" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "Андреа Ранальді" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "Andreas Berheim Brudin" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "Bas Doodeman" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "Карлос Санчез" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "Christoph J. Thompson" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "Денис Лисенко" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "Diego J. Romero López" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "dumaosen" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "Emil" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "Eric R" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "Євген Павлов" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "Фабіо Лолі" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "Gianfranco Del Borrello" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "Джованні Делла Торре" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "GunChleoc" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "Hans Joachim Desserud" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "hark34" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "Джанет Хант" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "Juan Pablo Tamayo" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "losine" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "Marc Tormo i Bochaca" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "Michael Papageorgiou" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "Михаїл Каралєвіч" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "Міро Яношик" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "Микола Франчук" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "MOB2" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "Морган Штраус" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "Nea Retrogamer" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "Nguyễn Gia Phong" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "Нікіта Ванку" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "Паул Вортман" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "Павел Пущинський" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "Квентін Стівенарт" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "Rui" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "Сергей Басалаєв" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "Сергій Бородич" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "Стефано Періс" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "sujiniku" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "Thomas Glamsch" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "Timo Sievänen" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "Вісенте Монтеіро" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "Wuzzy2" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "Яніс Антімідіс" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "Zmicer Turok" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Розповсюджувачі" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "Ablu" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "Feillyne" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "Jan-Hendrik Peters" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "miffe" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Особлива подяка" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" msgstr "За постійні відгуки і тестування:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "Барт Келсі" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "Спільноті OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" msgstr "За Tiled і експортер карт Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "Thorbjørn Lindeijer" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "Ranie Jade Ramiso" diff --git a/mods/default/languages/data.vi.po b/mods/default/languages/data.vi.po index d64aa58..c416262 100644 --- a/mods/default/languages/data.vi.po +++ b/mods/default/languages/data.vi.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Justin Jacobs , 2018\n" "Language-Team: Vietnamese (https://www.transifex.com/flareorg/teams/84925/vi/)\n" @@ -49,7 +49,7 @@ #: ../engine/damage_types.txt:6 msgid "Melee Damage Max" -msgstr "Sát thương tàm gần tối đa" +msgstr "Sát thương tầm gần tối đa" #: ../engine/damage_types.txt:12 msgid "Ranged Damage" @@ -91,113 +91,9 @@ msgid "Lead Programmers" msgstr "Các lập trình viên đứng đầu" -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" - #: ../cutscenes/credits.txt:20 msgid "Programmers" msgstr "Các lập trình viên" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "" #: ../cutscenes/credits.txt:44 msgid "Default Art" @@ -207,234 +103,22 @@ msgid "Translators" msgstr "Các dịch giả" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" msgstr "Các nhà phân phối" -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 +#: ../cutscenes/credits.txt:117 msgid "Special Thanks" msgstr "Đặc biệt cảm ơn" -#: ../cutscenes/credits.txt:116 +#: ../cutscenes/credits.txt:121 msgid "For giving constant feedback and testing:" -msgstr "Về việc thử nghiệm và phản hồi thường xuyên:" +msgstr "Trong việc thử nghiệm và phản hồi thường xuyên:" -#: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" - -#: ../cutscenes/credits.txt:118 +#: ../cutscenes/credits.txt:123 msgid "The community at OpenGameArt" msgstr "Cộng đồng ở OpenGameArt" -#: ../cutscenes/credits.txt:122 +#: ../cutscenes/credits.txt:127 msgid "For Tiled and the Flare map exporter:" -msgstr "Về Tiled và công cụ kết xuất bản đồ cho Flare:" - -#: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" - -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" +msgstr "Cho Tiled và công cụ kết xuất bản đồ cho Flare:" diff --git a/mods/default/languages/data.zh.po b/mods/default/languages/data.zh.po index f319018..98a8edb 100644 --- a/mods/default/languages/data.zh.po +++ b/mods/default/languages/data.zh.po @@ -2,12 +2,17 @@ # This file is distributed under the same license as the FLARE package. # # FIRST AUTHOR , YEAR. +# Translators: +# Justin Jacobs , 2019 +# 杜茂森 , 2019 +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-13 17:21+\n" +"POT-Creation-Date: 2019-07-29 09:34+\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Last-Translator: 杜茂森 , 2019\n" "Language-Team: Chinese (https://www.transifex.com/flareorg/teams/84925/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,420 +22,104 @@ #: ../engine/primary_stats.txt:3 msgid "Physical" -msgstr "" +msgstr "物理" #: ../engine/primary_stats.txt:7 msgid "Mental" -msgstr "" +msgstr "魔法" #: ../engine/primary_stats.txt:11 msgid "Offense" -msgstr "" +msgstr "攻击" #: ../engine/primary_stats.txt:15 msgid "Defense" -msgstr "" +msgstr "防御" #: ../engine/damage_types.txt:3 msgid "Melee Damage" -msgstr "" +msgstr "近身伤害" #: ../engine/damage_types.txt:4 msgid "Increases the damage done with swords and other melee weapons." -msgstr "" +msgstr "增加剑和其他近身类武器的伤害。" #: ../engine/damage_types.txt:5 msgid "Melee Damage Min" -msgstr "" +msgstr "近身伤害最小值" #: ../engine/damage_types.txt:6 msgid "Melee Damage Max" -msgstr "" +msgstr "近身伤害最大值" #: ../engine/damage_types.txt:12 msgid "Ranged Damage" -msgstr "" +msgstr "范围伤害" #: ../engine/damage_types.txt:13 msgid "Increases the damage done with bows and other ranged weapons." -msgstr "" +msgstr "增加弓和其他范围类武器的伤害。" #: ../engine/damage_types.txt:14 msgid "Ranged Damage Min" -msgstr "" +msgstr "范围伤害最小值" #: ../engine/damage_types.txt:15 msgid "Ranged Damage Max" -msgstr "" +msgstr "范围伤害最大值" #: ../engine/damage_types.txt:21 msgid "Mental Damage" -msgstr "" +msgstr "魔法伤害" #: ../engine/damage_types.txt:22 msgid "Increases the damage done with staves and other mental weapons." -msgstr "" +msgstr "增加杖和其他魔法类武器的伤害。" #: ../engine/damage_types.txt:23 msgid "Mental Damage Min" -msgstr "" +msgstr "魔法伤害最小值" #: ../engine/damage_types.txt:24 msgid "Mental Damage Max" -msgstr "" +msgstr "精神伤害最大值" #: ../cutscenes/credits.txt:7 msgid "Flare Engine Credits" -msgstr "" +msgstr "Flare Engine 致谢" #: ../cutscenes/credits.txt:10 msgid "Lead Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:12 -msgid "Clint Bellanger" -msgstr "" - -#: ../cutscenes/credits.txt:13 -msgid "Henrik Andersson" -msgstr "" - -#: ../cutscenes/credits.txt:14 -msgid "Igor Paliychuk" -msgstr "" - -#: ../cutscenes/credits.txt:15 -msgid "Justin Jacobs" -msgstr "" - -#: ../cutscenes/credits.txt:16 -msgid "Stefan Beller" -msgstr "" - -#: ../cutscenes/credits.txt:17 -msgid "Thane Brimhall" -msgstr "" +msgstr "首席程序员" #: ../cutscenes/credits.txt:20 msgid "Programmers" -msgstr "" - -#: ../cutscenes/credits.txt:22 -msgid "Andrew Engelbrecht" -msgstr "" - -#: ../cutscenes/credits.txt:23 -msgid "Anton Golov" -msgstr "" - -#: ../cutscenes/credits.txt:24 -msgid "Artur Rojek" -msgstr "" - -#: ../cutscenes/credits.txt:25 -msgid "blazindragon" -msgstr "" - -#: ../cutscenes/credits.txt:26 -msgid "Bonbadil" -msgstr "" - -#: ../cutscenes/credits.txt:27 -msgid "Chris Oelmueller" -msgstr "" - -#: ../cutscenes/credits.txt:28 -msgid "David Bariod" -msgstr "" - -#: ../cutscenes/credits.txt:29 -msgid "Daniel Santos" -msgstr "" - -#: ../cutscenes/credits.txt:30 -msgid "Gallaecio" -msgstr "" - -#: ../cutscenes/credits.txt:31 -msgid "Joseph Bleu" -msgstr "" - -#: ../cutscenes/credits.txt:32 -msgid "Juan PabloTamayo" -msgstr "" - -#: ../cutscenes/credits.txt:33 -msgid "Kitano" -msgstr "" - -#: ../cutscenes/credits.txt:34 -msgid "Kyle Belanger" -msgstr "" - -#: ../cutscenes/credits.txt:35 -msgid "LongerDev" -msgstr "" - -#: ../cutscenes/credits.txt:36 -msgid "Manuel A. Fernandez Montecelo" -msgstr "" - -#: ../cutscenes/credits.txt:37 -msgid "Matthew Krohn" -msgstr "" - -#: ../cutscenes/credits.txt:38 -msgid "Nojan" -msgstr "" - -#: ../cutscenes/credits.txt:39 -msgid "Pavel Kirpichyov" -msgstr "" - -#: ../cutscenes/credits.txt:40 -msgid "runtime-x86" -msgstr "" - -#: ../cutscenes/credits.txt:41 -msgid "Ryan Dansie" -msgstr "" +msgstr "程序员" #: ../cutscenes/credits.txt:44 msgid "Default Art" -msgstr "" +msgstr "默认素材" #: ../cutscenes/credits.txt:49 msgid "Translators" -msgstr "" +msgstr "翻译者" -#: ../cutscenes/credits.txt:51 -msgid "Ademaro" -msgstr "" - -#: ../cutscenes/credits.txt:52 -msgid "Adrian Chaves Fernandez" -msgstr "" - -#: ../cutscenes/credits.txt:53 -msgid "Andrea Ranaldi" -msgstr "" - -#: ../cutscenes/credits.txt:54 -msgid "Andreas Berheim Brudin" -msgstr "" - -#: ../cutscenes/credits.txt:55 -msgid "Bas Doodeman" -msgstr "" - -#: ../cutscenes/credits.txt:57 -msgid "Carlos Sanchez" -msgstr "" - -#: ../cutscenes/credits.txt:59 -msgid "Christoph J. Thompson" -msgstr "" - -#: ../cutscenes/credits.txt:60 -msgid "Denis Lysenko" -msgstr "" - -#: ../cutscenes/credits.txt:61 -msgid "Diego J. Romero López" -msgstr "" - -#: ../cutscenes/credits.txt:62 -msgid "dumaosen" -msgstr "" - -#: ../cutscenes/credits.txt:63 -msgid "Emil" -msgstr "" - -#: ../cutscenes/credits.txt:64 -msgid "Eric R" -msgstr "" - -#: ../cutscenes/credits.txt:65 -msgid "Evgen Pavlov" -msgstr "" - -#: ../cutscenes/credits.txt:66 -msgid "Fabio Loli" -msgstr "" - -#: ../cutscenes/credits.txt:67 -msgid "Gianfranco Del Borrello" -msgstr "" - -#: ../cutscenes/credits.txt:68 -msgid "Giovanni Dalla Torre" -msgstr "" - -#: ../cutscenes/credits.txt:69 -msgid "GunChleoc" -msgstr "" - -#: ../cutscenes/credits.txt:70 -msgid "Hans Joachim Desserud" -msgstr "" - -#: ../cutscenes/credits.txt:71 -msgid "hark34" -msgstr "" - -#: ../cutscenes/credits.txt:73 -msgid "Janet Hunt" -msgstr "" - -#: ../cutscenes/credits.txt:74 -msgid "Juan Pablo Tamayo" -msgstr "" - -#: ../cutscenes/credits.txt:75 -msgid "losine" -msgstr "" - -#: ../cutscenes/credits.txt:76 -msgid "Marc Tormo i Bochaca" -msgstr "" - -#: ../cutscenes/credits.txt:77 -msgid "Michael Papageorgiou" -msgstr "" - -#: ../cutscenes/credits.txt:78 -msgid "Mikhail Karalevich" -msgstr "" - -#: ../cutscenes/credits.txt:79 -msgid "Miro Jánošík" -msgstr "" - -#: ../cutscenes/credits.txt:80 -msgid "Mykola Franchuk" -msgstr "" - -#: ../cutscenes/credits.txt:81 -msgid "MOB2" -msgstr "" - -#: ../cutscenes/credits.txt:82 -msgid "Morgan Strauss" -msgstr "" - -#: ../cutscenes/credits.txt:83 -msgid "Nea Retrogamer" -msgstr "" - -#: ../cutscenes/credits.txt:84 -msgid "Nguyễn Gia Phong" -msgstr "" - -#: ../cutscenes/credits.txt:85 -msgid "Nikita Vanku" -msgstr "" - -#: ../cutscenes/credits.txt:86 -msgid "Paul Wortmann" -msgstr "" - -#: ../cutscenes/credits.txt:87 -msgid "Pawel Puszczynski" -msgstr "" - -#: ../cutscenes/credits.txt:88 -msgid "Quentin Stievenart" -msgstr "" - -#: ../cutscenes/credits.txt:89 -msgid "Rui" -msgstr "" - -#: ../cutscenes/credits.txt:90 -msgid "Sergey Basalaev" -msgstr "" - -#: ../cutscenes/credits.txt:91 -msgid "Sergiy Borodych" -msgstr "" - -#: ../cutscenes/credits.txt:93 -msgid "Stefano Peris" -msgstr "" - -#: ../cutscenes/credits.txt:94 -msgid "sujiniku" -msgstr "" - -#: ../cutscenes/credits.txt:95 -msgid "Thomas Glamsch" -msgstr "" - -#: ../cutscenes/credits.txt:96 -msgid "Timo Sievänen" -msgstr "" - -#: ../cutscenes/credits.txt:97 -msgid "Vicente Monteiro" -msgstr "" - -#: ../cutscenes/credits.txt:98 -msgid "Wuzzy2" -msgstr "" - -#: ../cutscenes/credits.txt:99 -msgid "Yannis Anthymidis" -msgstr "" - -#: ../cutscenes/credits.txt:100 -msgid "Zmicer Turok" -msgstr "" - -#: ../cutscenes/credits.txt:103 +#: ../cutscenes/credits.txt:108 msgid "Distributors" -msgstr "" - -#: ../cutscenes/credits.txt:105 -msgid "Ablu" -msgstr "" - -#: ../cutscenes/credits.txt:106 -msgid "Feillyne" -msgstr "" - -#: ../cutscenes/credits.txt:107 -msgid "Jan-Hendrik Peters" -msgstr "" - -#: ../cutscenes/credits.txt:109 -msgid "miffe" -msgstr "" - -#: ../cutscenes/credits.txt:112 -msgid "Special Thanks" -msgstr "" - -#: ../cutscenes/credits.txt:116 -msgid "For giving constant feedback and testing:" -msgstr "" +msgstr "发行者" #: ../cutscenes/credits.txt:117 -msgid "Bart Kelsey" -msgstr "" +msgid "Special Thanks" +msgstr "特别感谢" -#: ../cutscenes/credits.txt:118 -msgid "The community at OpenGameArt" -msgstr "" - -#: ../cutscenes/credits.txt:122 -msgid "For Tiled and the Flare map exporter:" -msgstr "" +#: ../cutscenes/credits.txt:121 +msgid "For giving constant feedback and testing:" +msgstr "给予不断反馈和测试的:" #: ../cutscenes/credits.txt:123 -msgid "Thorbjørn Lindeijer" -msgstr "" +msgid "The community at OpenGameArt" +msgstr "OpenGameArt 社区" -#: ../cutscenes/credits.txt:125 -msgid "Ranie Jade Ramiso" -msgstr "" +#: ../cutscenes/credits.txt:127 +msgid "For Tiled and the Flare map exporter:" +msgstr "关于 Tiled 和 Flare地图导出器:" diff --git a/mods/default/languages/engine.be.po b/mods/default/languages/engine.be.po index 12a9f0b..4db8dcf 100644 --- a/mods/default/languages/engine.be.po +++ b/mods/default/languages/engine.be.po @@ -5,16 +5,16 @@ # # Translators: # Justin Jacobs , 2018 -# Zmicer Turok , 2018 +# Źmicier Turok , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Zmicer Turok , 2018\n" +"Last-Translator: Źmicier Turok , 2020\n" "Language-Team: Belarusian (https://www.transifex.com/flareorg/teams/84925/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,78 +22,85 @@ "Language: be\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Ваша жыццё сыходзіць!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Віншуем, вы дасягнулі %d ўзроўня!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Вы можаце палепшыць адзін атрыбут у меню персанажа." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Вы зазналі паразу. Гульня завершана. Націсніце ${INPUT_CONTINUE}, каб выйсці" -" ў меню." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Вы зазналі паразу. Націсніце ${INPUT_CONTINUE}, каб працягнуць." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Вы можаце палепшыць адзін альбо некалькі атрыбутаў у меню персанажа." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Вы можаце разблакаваць адзін альбо некалькі талентаў у меню талентаў." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." -msgstr "Трансфармацыя завершана. Вы вярнуліся ў бяспечнае месца." - -#: ../../../src/CampaignManager.cpp:153 +msgstr "Трансфармацыя завершаная. Вы вярнуліся ў бяспечнае месца." + +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s прыбрана." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s прыбрана." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Вы атрымліваеце %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Вы атрымліваеце %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Вы атрымліваеце %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Вы атрымліваеце %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Вы атрымліваеце %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Вы атрымліваеце %d досведу." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Жыццё адноўлена." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." -msgstr "Мана адноўлена." - -#: ../../../src/CampaignManager.cpp:210 +msgstr "Мана адноўленая." + +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." -msgstr "Жыццё і мана адноўлены." - -#: ../../../src/CampaignManager.cpp:214 +msgstr "Жыццё і мана адноўленыя." + +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." -msgstr "Негатыўныя эфекты прыбраны." - -#: ../../../src/CampaignManager.cpp:220 +msgstr "Негатыўныя эфекты прыбраныя." + +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" -msgstr "Жыццё і мана адноўлены, негатыўныя эфекты зніклі" +msgstr "Жыццё і мана адноўленыя, негатыўныя эфекты зніклі" #: ../../../src/DeviceList.cpp:56 msgid "" @@ -113,158 +120,791 @@ "Апаратны адмалёўшчык SDL. Прадвызначаны адмалёўшчык, які найчасцей працуе " "хутчэй за праграмны адмалёўшчык SDL." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Вандроўнік" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "промах" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d жыцця" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d маны" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Невядомы накірунак" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Загрузка..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Выдаліць гульню" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Выдаліць захаваную гульню?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Выйсці ў меню" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Новая гульня" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Абярыце слот" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Уключыце сюжэтны мод, каб працягнуць" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Загрузіць гульню" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Уваход у гульнявы свет..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Загрузка захаванай гульні..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Хібная гульня" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Узровень %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Скасаваць" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Стварыць" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Перамяшаць" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Абярыце партрэт" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Абярыце імя" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Памерці можна толькі раз?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Абярыце клас" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Гуляць" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Уключыце асноўны мод, каб працягнуць" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Канфігурацыя" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Стваральнікі" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Выйсці" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Пагадзіцца" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Уверх" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Уніз" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Налева" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Направа" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Панэль1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Панэль2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Панэль3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Панэль4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Панэль5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Панэль6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Панэль7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Панэль8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Панэль9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Панэль0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Персанаж" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Інвентар" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Таленты" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Нататнік" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Галоўнае1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Галоўнае2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Delete" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Панэль дзеянняў: пагадзіцца" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Панэль дзеянняў: улева" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Панэль дзеянняў: управа" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Панэль дзеянняў: выкарыстаць" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Меню распрацоўшчыка" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Левая кнопка мышы" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Сярэдняя кнопка мышы" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Правая кнопка мышы" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Пракрутка ўверх" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Пракрутка ўніз" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Мыш х2" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Мыш х1" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Невядомы прадмет" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "Хуткасць %d%%" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "Хуткасць атакі %d%%" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Супраціўленне (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Патрабуецца %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Прадмет задання" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Якасць: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Паглынае: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Паглынае: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Патрабуецца %d узровень" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Патрабуецца %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Патрабуецца клас: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Кошт пакупкі: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Кошт пакупкі: %d %s за кожны" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Кошт продажу: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Кошт продажу: %d %s за кожны" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Набор:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d прадметаў:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Націсніце [%s], каб прачытаць" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Націсніце [%s], каб выкарыстаць" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Гарачая клавіша: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Не стае маны." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Засталося:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d кампанентаў" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Імя" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Узровень" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Памяншае ўрон ад \"%s\" стыхійных атак." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Досвед: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Наступны: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "базавае (%d), бонус (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Звязаныя ўменні:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "З кожным узроўнем даецца %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "З кожным пунктам %s даецца %d" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Ачысціць" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Прызначыць:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Прадвызначана" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Скінуць УСЕ налады?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Добра" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Скасаваць" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Працягнуць" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Прадвызначана" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Паказваць усе выплыўныя падказкі аб здабычы, за выключэннем схаваных гульцом" +" альбо ворагам. Часова паказваць усе выплыўныя падказкі клавішай \"Alt\"." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Паказваць усе" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Заўсёды паказваць выплыўныя падказкі аб здабычы. Часова хаваць падказкі " +"клавішай \"Alt\"." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Хаваць" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Заўсёды хаваць выплыўныя падказкі пра здабычу, за выключэннем калі частка " +"здабычы знаходзіцца пад курсорам мышы. Часова паказваць усе выплыўныя " +"падказкі «Alt»." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Паказваць" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Паказваць (2х)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Кіруе тыпам папярэджання, якое мусіць актывавацца калі ўзровень жыцця " +"апускаецца ніжэй за парог." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Вывесці паведамленне" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Прайграць гук" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Змяніць курсор" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Выключана" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Усё" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Паведамленне і курсор" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Паведамленне і гук" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Гук і курсор" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Паведамленне" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Курсор" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Гук" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Калі жыццё гульца зніжаецца за прызначаны парог, паведамленні выведуцца, " +"калі адно альбо некалькі з іх уключаныя." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Выйсці" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Відэа" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Аўдыё" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Інтэрфейс" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Увод" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Клавішы" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Моды" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Прыпыніць" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Час гульні" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Адмалёўшчык" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Поўнаэкранны рэжым" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Апаратныя паверхні" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "Вертыкальная сінхранізацыя" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Фільтрацыя тэкстур" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Маштабаванне DPI" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Пласты Parallax" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Дазволіць змяняць гаму" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Гама" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Гучнасць наваколля" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Гучнасць музыкі" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Гучнасць наваколля" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Мова" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Паказваць FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Апаратны курсор мышы" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Рэжым дальтанізму" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Апаратны курсор мышы" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Рэжым распрацоўшчыка" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" -msgstr "Субтытры" - -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Актыўныя моды" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Наяўныя моды" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Выключыць" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Уключыць >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Версія:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Гульня:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Версія рухавіка:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Патрабуюцца моды:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Ачысціць" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Прызначыць:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Відэа" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Увод" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Клавішы" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +msgstr "Субцітры" + +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Паказваць падказкі пра здабычу" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Рэжым мінімапы" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Заўсёды паказваць адмеціны ў радку стану" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Уключыць аўтаматычнае хаванне радку стану" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Паказваць тэкст бою" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Аўтаматычна апранаць прадметы" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Паказваць схаваныя пазнакі" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Апавяшчэнне пра нізкае жыццё" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Мінімальны парог жыцця" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Джойсцік" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Перамяшчаць героя мышшу" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Нацэльвацца мышшу" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Не выкарыстоўваць мыш" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Пераключыць кнопку руху мышы" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Атакаваць рухамі мышшу" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Мёртвая зона джойсціка" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Першасныя значэнні: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Альтэрнатыўныя значэнні: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Значэнні джойсціка: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -"Паспрабуйце апрацоўваць паверхні ў відэапамяці, а не ў сістэмнай памяці. " +"Спрабаваць апрацоўваць паверхні ў відэапамяці, а не ў сістэмнай памяці. " "Эфект залежыць ад адмалёўшчыка." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -272,7 +912,7 @@ "Прадухіляе разрывы экрану. Выключыце, калі ўзнікаюць праблемы з ўводам альбо" " ў аконным рэжыме." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -281,639 +921,222 @@ "Калі ўключана, дадаткова да маштабавання па памерах акна для адмалёўкі па " "раздзяляльнай здольнасці выкарыстоўваецца экран DPI." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Эксперыментальна" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Для мабільных прылад" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Адмалёўшчык" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Поўнаэкранны рэжым" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Перамяшчаць героя мышшу" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Апаратныя паверхні" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "Вертыкальная сінхранізацыя" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Фільтрацыя тэкстур" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "Маштабаванне DPI" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Дазволіць змяняць гаму" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Гама" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Вкарыстоўваць джойсцік" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Джойсцік" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Нацэльвацца мышшу" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Не выкарыстоўваць мыш" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Мёртвая зона джойсціка" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Загрузка..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Выдаліць гульню" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Выдаліць захаваную гульню?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Выйсці ў меню" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Новая гульня" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Абярыце слот" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Уключыце сюжэтны мод, каб працягнуць" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Загрузіць гульню" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Уваход у гульнявы свет..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Загрузка захаванай гульні..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Хібная гульня" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Узровень %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Стварыць" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Перамяшайце" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Абярыце партрэт" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Абярыце імя" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Памерці можна толькі раз?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Абярыце клас" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Гуляць" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Уключыце асноўны мод, каб працягнуць" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Канфігурацыя" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Стваральнікі" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Выйсці" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Пагадзіцца" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Уверх" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Уніз" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Налева" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Направа" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Панэль1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Панэль2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Панэль3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Панэль4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Панэль5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Панэль6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Панэль7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Панэль8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Панэль9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Панэль0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Персанаж" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Інвентар" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Таленты" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Нататнік" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Галоўнае1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Галоўнае2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Delete" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Панэль дзеянняў: пагадзіцца" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Панэль дзеянняў: улева" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Панэль дзеянняў: управа" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Панэль дзеянняў: выкарыстаць" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Меню распрацоўшчыка" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Левая кнопка мышы" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Сярэдняя кнопка мышы" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Правая кнопка мышы" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Пракрутка ўверх" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Пракрутка ўніз" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Мыш х2" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Мыш х1" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Невядомы прадмет" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "Хуткасць %d%%" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "Хуткасць атакі %d%%" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Патрабуецца %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Прадмет задання" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Якасць: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Паглынае: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Паглынае: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Патрабуецца %d узровень" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Патрабуецца %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Патрабуецца клас: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Кошт пакупкі: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Кошт пакупкі: %d %s за кожны" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Кошт продажу: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Кошт продажу: %d %s за кожны" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Набор:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d прадметаў:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Націсніце [%s], каб выкарыстаць" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Націсніце [%s], каб прачытаць" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Заўсёды паказваць адмеціны ў радку стану" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Паказваць тэкст бою" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Гарачая клавіша: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "Не стае маны." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Засталося:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d кампанентаў" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Імя" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Узровень" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d невыкарыстаны пункт уменняў" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d невыкарыстаных пунктаў уменняў" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Памяншае ўрон ад \"%s\" стыхійных атак." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Досвед: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Наступны: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "базавае (%d), бонус (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Звязаныя ўменні:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "З кожным узроўнем даецца %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "З кожным пунктам %s даецца %d" - -#: ../../../src/MenuDevConsole.cpp:63 +"Выключае пласты parallax. Выключэнне гэтага параметра ў некаторых выпадках " +"можа палепшыць прадукцыйнасць." + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Уключае параметр, што кіруе ўзроўнем гамы экрана. Паводзіны параметра могуць" +" змяняцца ў залежнасці ад платформы." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Падае дадатковы тэкст для інфармацыі, што пераважна падаецца праз колер." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Некаторыя мадыфікацыі аўтаматычна хаваюць радкі стану, калі яны неактыўныя. " +"Калі выключыць гэты параметр, то яны будуць адлюстроўвацца заўсёды." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Калі параметр уключаны, пустыя слоты будуць запаўняцца адпаведнымі " +"прадметамі пры іх атрыманні." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Паказвае адзнаку над ворагамі, сябрамі і гульцамі, калі яны схаваныя " +"высокімі аб'ектамі." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" +"Дазваляе поўнасцю кіраваць гульнёй пры дапамозе клавіятуры альбо джойсціка." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Калі параметр \"Перамяшчаць героя пры дапамозе мышы\" уключаны, то параметр " +"вызначае ці выкарыстоўваецца \"Галоўнае1\" ці \"Галоўнае2\" для перамяшчэння" +" героя. Калі ўключана \"Галоўнае2\" перамясціць героя замест \"Галоўнае1\"." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Калі параметр \"Перамяшчаць героя пры дапамозе мышы\" уключаны, то параметр " +"вызначае ці можна выкарыстоўваць талент, прызначаны кнопцы руху для " +"вызначэння ворага. Калі параметр выключаны, для гэтага неабходна " +"выкарыстоўваць \"Shift\"." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Калі ўключана, атакі гульца будуць накіроўваца адпаведна накірунка курсора " +"мышы." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Актыўныя моды" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Наяўныя моды" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Выключыць" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Уключыць >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Версія:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Гульня:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Версія рухавіка:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Патрабуюцца моды:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(няма)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Захаваць і выйсці" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Запусціць" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Кансоль распрацоўшчыка" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Выкарыстоўвайце \"%s\" для агляду з дапамогай курсора." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "Аргументы з прагаламі мусяць быць у падвойных двукоссях. Прыклад:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Увядзіце \"help\", каб атрымаць спіс загадаў." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "пікс" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Дыстанцыя" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Аб'ект" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "няма" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "перашкода" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "малая перашкода/яма" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "аб'ект" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" -msgstr "аб'ект/памочнік" - -#: ../../../src/MenuDevConsole.cpp:274 +msgstr "аб'ект/памагаты" + +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Плітка" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "дадае таленты на панэль дзеянняў" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:362 +msgstr "уключыць/выключыць адлюставанне лічыльніка FPS" + +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "пераключае адлюстраванне элементаў інтэрфейсу" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "пераключае інтэрфейс распрацоўшчыка" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" "Выводзіць спіс знойдзеных талентаў. Калі нічога не ўвесці - выведзе ўсе." -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "Выводзіць спіс усіх назваў файлаў мапаў з каталога \"maps\"." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -921,7 +1144,7 @@ "Выводзіць спіс знойдзеных статусаў актыўных кампаній. Калі нічога не ўвесці " "- выведзе спіс усіх статусаў" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -929,169 +1152,153 @@ "Выводзіць спіс знойдзеных прадметаў. Калі нічога не ўвесці - выведзе спіс " "усіх прадметаў" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "разбірае набор кампанентаў падзеі і выконвае іх як адну падзею" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "ачышчае гісторыю загадаў" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "выводзіць гэты тэкст" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Інтэрфейс распрацоўшчыка пераключаны" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Інтэрфейс пераключаны" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:534 +msgstr "Пераключыць лічыльнік FPS" + +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "ПАМЫЛКА: хібная колькасць аргументаў" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "ПАДКАЗКА:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "ПАМЫЛКА: \"%s\" - хібны ключ падзеі" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "ПАМЫЛКА: не стае аргументаў" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = …" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "ПАМЫЛКА: невядомы загад" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "ПАДКАЗКА: ўвядзіце help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s узровень %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Забіты" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Знішчана" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Прыпыніць" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Захаваць і выйсці" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Выйсці" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Працягнуць" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Аўтаматычна апранаць прадметы" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Страчана %d%% %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Страчана %d%% агульнага досведу." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Страчана %d%% бягучага ўзроўня досведу." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Страчана %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Паднята прадметаў:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Выкарыстаць альбо апрануць прадмет:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "%s мадыфікатараў" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Абраць колькасць прадметаў:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Перамясціць набор прадметаў у схованку:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Прадаць набор прадметаў:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Не стае патрэбных прадметаў." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Зараз вы не можаце выкарыстаць гэты прадмет." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Гэты прадмет можна выкарыстаць толькі з панэлі дзеянняў." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Інвентар поўны." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Не стае %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Гэты прадмет немагчыма прадаць." @@ -1103,347 +1310,485 @@ msgid "Quests" msgstr "Заданні" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Досвед: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Гэты прадмет немагчыма выкінуць." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Увядзіце колькасць:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Пасіўныя" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Каштуе %d маны" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Каштуе %d жыцця" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Аднаўленне:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Урон за секунду" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "Жыцця за секунду" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "Маны за секунду" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Зафіксаваць" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Устойлівасць" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Устойлівасць да перыядычнага ўрону" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Устойлівасць да запавольвання" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Устойлівасць да аглушэння" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Устойлівасць да выцягвання жыцця" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Устойлівасць да выцягвання маны" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Устойлівасць да скульвання" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Устойлівасць да адбіцця ўрону" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Аглушэнне" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Аўтаматычна адраджацца пасля смерці" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Пераўтварыць" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Страх" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Працягласць жыцця" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Магічны шчыт" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Лекаванне" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Скульванне" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% шанец" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Базавая трапнасць" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Базавы шанец крытычнага ўрону" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Не зважае на паглынанне" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Не зважае на ўхіленне" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% шанец нанесці крытычны ўрон запаволеным супраціўнікам" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1114 +msgstr "Стыхійны ўрон (%s)" + +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Патрабуецца %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Патрабуецца талент: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Пстрыкніце, каб разблакаваць (за 1 пункт уменняў)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Патрабуецца 1 пункт уменняў" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d невыкарыстаны пункт уменняў" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d невыкарыстаных пунктаў уменняў" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Наступны ўзровень:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Агульныя запасы" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Прадметы заданняў нельга захоўваць у схованцы." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Схованка" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "Асабістае" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "Абагульнена" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Гэты аб'ект немагчыма захоўваць у схованцы." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Гэты аб'ект немагчыма захоўваць у асабістай схованцы." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "Гэты аб'ект немагчыма захоўваць у агульнай схованцы." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Схованка поўная." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Немагчыма захоўваць у схованцы: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Гандляваць" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Выкуп" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Гандляр" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Шчыт" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." -msgstr "Вы ўжо трансфарміраваны, спачатку растрансфарміруўцеся." - -#: ../../../src/PowerManager.cpp:1404 +msgstr "Вы ўжо трансфарманыя, спачатку растрансфармуўцеся." + +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." -msgstr "Тут немагчыма растрансфарміравацца" +msgstr "Тут немагчыма растрансфармавацца" #: ../../../src/QuestLog.cpp:234 msgid "Completed Quests" msgstr "Завершаныя заданні" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." -msgstr "Гульня захавана." - -#: ../../../src/SDLInputState.cpp:582 +msgstr "Гульня захаваная." + +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Backspace" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "CapsLock" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "End" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Home" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Insert" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Левы Alt" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Левы Ctrl" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Левы Shift" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "NumLock" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "PageDown" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "PageUp" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pause" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "PrintScreen" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Правы Alt" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Правы Ctrl" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Enter" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Правы Shift" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "ScrollLock" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Прагал" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tab" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Мыш %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Вось %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Вось %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Кнопка %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(няма)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" -msgstr "" - -#: ../../../src/SDLInputState.cpp:701 +msgstr "Сэнсарнае кіраванне D-Pad" + +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" -msgstr "" - -#: ../../../src/SDLInputState.cpp:716 +msgstr "Сэнсарныя кнопкі кіравання" + +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Дакраніцеся" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Немагчыма прызначыць: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "\"%s\" больш не звязана з:" @@ -1606,16 +1951,16 @@ msgid "Base MP" msgstr "Базавая мана" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s секунда" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s секунд" diff --git a/mods/default/languages/engine.bg.po b/mods/default/languages/engine.bg.po index 6822f49..6cb48a2 100644 --- a/mods/default/languages/engine.bg.po +++ b/mods/default/languages/engine.bg.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: 48719d321e4b4a9c2ca8c6a1f8b9cba8, 2018\n" "Language-Team: Bulgarian (https://www.transifex.com/flareorg/teams/84925/bg/)\n" @@ -21,76 +21,83 @@ "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Поздравления, достигнахте ниво %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Можете да увеличите един атрибут през менюто за характер." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Вие сте победени. Играта приключи! ${INPUT_CONTINUE}, за да се върнете към " -"менюто." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Вие сте победени. ${INPUT_CONTINUE}, за да продължите." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "Преобразяването изтече. Върнахте се на сигурно място." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s е премахнато." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s е премахнат." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Получихте %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Получихте %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Получихте %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Получихте %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Получихте %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Получихте %d опит." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Здравето е възстановено." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Маната е възстановена." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "Здравето и маната са възстановени." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Негативните въздействия са премахнати." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "" "Здравето и маната са възстановени, негативните въздействия са премахнати." @@ -115,150 +122,772 @@ "\n" "Рендерът по подразбиране, който често е по-бърз от софтуерния рендер за SDL." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Авантюрист" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "пропуск" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d здраве" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d мана" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Непозната дестинация" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Зареждане…" + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Изтрий героя" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Изтриване на героя?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Назад" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Нов герой" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Избери герой" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Включете модификация на историята, за да продължите" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Зареди героя" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Влизане в игралния свят…" + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Зареждане на запазената игра…" + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Невалиден герой" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Ниво %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Отказ" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Създай" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Разбъркай" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Избери портрет" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Избери име" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Без прераждане?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Избери клас" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Играй" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Включете основна модификация, за да продължите" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Настройки" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Признания" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Изход" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Приемане" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Up" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Down" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Left" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Right" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Лента1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Лента2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Лента3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Лента4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Лента5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Лента6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Лента7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Лента8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Лента9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Лента0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Характер" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Инвентар" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Умения" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Дневник" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Главен1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Главен2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Delete" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "ActionBar Accept" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "ActionBar Left" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "ActionBar Right" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "ActionBar Use" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Developer меню" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Left Mouse" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Middle Mouse" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Right Mouse" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Wheel Up" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Wheel Down" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Mouse X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Mouse X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Непознат предмет" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Бързина" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Бързина на атака" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Изисква %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Предмет от куест" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Качество: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Абсорбиране: %d – %d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Абсорбиране: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Изисква ниво %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Изисква %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Изисква клас: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Цена за закупуване: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Цена за закупуване: %d %s за брой" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Продажна цена: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Продажна цена: %d %s за брой" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Комплект:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d предмета:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Натиснете [%s], за да прочетете" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Натиснете [%s], за да използвате" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Клавиш: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Нямате достатъчно мана." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Остават:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d стека" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Име" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Ниво" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Намалява понесените щети от стихийната атака „%s“." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Опит: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Следващо: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "основа (%d), бонус (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Свързани характеристики:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Всяко ниво дава %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Всяка точка от %s дава %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Изчисти" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Възложи" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Нулиране" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Нулирай всички настройки?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Добре" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Отказ" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Излез" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Видео" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Звук" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Интерфейс" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Вход" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Клавиши" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Модификации" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Пауза" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Рендер" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Режим на цял екран" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Хардуерни повърхности" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "Вертикална синхронизация (V-Sync)" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Текстурно филтриране" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "DPI мащабиране" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Разрешаване промяна на гамата" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Гама" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Сила на звука" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Сила на музиката" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Сила на звука" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Език" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Показване на FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Хардуер за курсора на мишката" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Режим за далтонисти" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Хардуер за курсора на мишката" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Режим за програмисти" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Субтитри" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Включени модификации" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Налични модификации" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Изключи" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Включи >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Версия:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Игра:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Engine версия:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Изисква модификации:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Изчисти" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Възложи" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Видео" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Вход" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Клавиши" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Винаги да се показват статистики" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Показване на боен текст" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Автоматично екипиране с предмети" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Джойстик" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Преместване на героя чрез мишка" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Прицелване чрез мишка" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Да не се използва мишка" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Мъртва зона на джойстик" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -267,7 +896,7 @@ "памет. Въздействието, което това има върху производителността зависи от " "рендера." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -275,7 +904,7 @@ "Предотвратява накъсването (screen tearing). Изключете, ако изпитвате " "проблеми в прозоречен режим или закъснение при въвеждане." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -285,628 +914,190 @@ " прозореца, за да мащабира разделителната способност на рендериране. В " "противен случай се използват само размерите на прозореца." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Експериментално" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "За преносими устройства" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Рендер" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Режим на цял екран" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Преместване на героя чрез мишка" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Хардуерни повърхности" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "Вертикална синхронизация (V-Sync)" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Текстурно филтриране" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "DPI мащабиране" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Разрешаване промяна на гамата" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Гама" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Използване на джойстик" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Джойстик" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Прицелване чрез мишка" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Да не се използва мишка" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Мъртва зона на джойстик" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Зареждане…" - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Изтрий героя" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Изтриване на героя?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Назад" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Нов герой" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Избери герой" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Включете модификация на историята, за да продължите" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Зареди героя" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Влизане в игралния свят…" - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Зареждане на запазената игра…" - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Невалиден герой" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Ниво %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Създай" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Разбъркай" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Избери портрет" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Избери име" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Без прераждане?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Избери клас" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Играй" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Включете основна модификация, за да продължите" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Настройки" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Признания" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Изход" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Приемане" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Up" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Down" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Left" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Right" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Лента1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Лента2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Лента3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Лента4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Лента5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Лента6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Лента7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Лента8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Лента9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Лента0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Характер" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Инвентар" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Умения" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Дневник" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Главен1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Главен2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Delete" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "ActionBar Accept" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "ActionBar Left" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "ActionBar Right" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "ActionBar Use" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Developer меню" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Left Mouse" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Middle Mouse" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Right Mouse" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Wheel Up" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Wheel Down" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Mouse X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Mouse X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Непознат предмет" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Бързина" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Бързина на атака" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Изисква %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Предмет от куест" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Качество: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Абсорбиране: %d – %d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Абсорбиране: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Изисква ниво %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Изисква %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Изисква клас: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Цена за закупуване: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Цена за закупуване: %d %s за брой" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Продажна цена: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Продажна цена: %d %s за брой" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Комплект:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d предмета:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Натиснете [%s], за да използвате" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Натиснете [%s], за да прочетете" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Винаги да се показват статистики" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Показване на боен текст" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Клавиш: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "Нямате достатъчно мана." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Остават:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d стека" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Име" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Ниво" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d неизразходвана точка за атрибути" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d неизразходвани точки за атрибути" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Намалява понесените щети от стихийната атака „%s“." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Опит: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Следващо: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "основа (%d), бонус (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Свързани характеристики:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Всяко ниво дава %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Всяка точка от %s дава %d." - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Включени модификации" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Налични модификации" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Изключи" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Включи >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Версия:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Игра:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Engine версия:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Изисква модификации:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(няма)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Запази и излез" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Изпълни" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Конзола за програмисти" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Използвайте '%s', за да инспектирате с курсора." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "Аргументи с интервали трябва да бъдат оградени в кавички. Пример:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Напишете 'help', за да получите списък с команди." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Distance" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Entity" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "none" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "wall" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "short wall / pit" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "entity" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "entity, ally" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Tile" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "добавя умение към лентата за действия" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "включва/изключва всички елементи на HUD" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "включва/изключва HUD за програмисти" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -914,12 +1105,12 @@ "Отпечатва списък с умения, които съответстват на термин за търсене. Без " "термин за търсене ще се отпечатат всички умения." -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" "Отпечатва всички имена на файлове, намиращи се в директорията „maps/“." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -927,7 +1118,7 @@ "Отпечатва активните състояния на кампания, които съответстват на термин за " "търсене. Без термин за търсене ще се отпечатат всички активни състояния." -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -935,171 +1126,155 @@ "Отпечатва списък с предмети, които съответстват на термин за търсене. Без " "термин за търсене ще се отпечатат всички предмети." -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "анализира поредица от компоненти на събитие и ги изпълнява като единично " "събитие" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "изчиства историята на командите" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "показва този текст" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "HUD за програмисти е превключен" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "HUD е превключен" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "ГРЕШКА: Неправилен брой аргументи" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "СЪВЕТ:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "ГРЕШКА: '%s' не е валиден ключ за събитие" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "ГРЕШКА: Твърде малко аргументи" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = …" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "ГРЕШКА: Непозната команда" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "СЪВЕТ: Напишете help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s ниво %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Мъртъв" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Разрушен" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Пауза" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Запази и излез" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Излез" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Продължи" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Автоматично екипиране с предмети" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Загубихте %d%% от %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Загубихте %d%% от общия опит." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Загубихте %d%% опит от текущото ниво." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Загубихте %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Вдигане на предмет:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Използване на предмет:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "Модификатори за %s" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Избиране на количество:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Скриване на предмет:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Продаване на предмет:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Нямате достатъчно от необходимия предмет." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Не можете да използвате този предмет точно сега." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Този предмет може да бъде използван само от лентата за действия." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Инвентарът е пълен." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Нямате достатъчно %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Този предмет не може да бъде продаден." @@ -1111,214 +1286,259 @@ msgid "Quests" msgstr "Куестове" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Опит: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Този предмет не може да бъде пуснат." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Въведи количество:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Пасивно" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Изразходва %d мана" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Изразходва %d здраве" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Време на изчакване:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Щети в секунда" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "Здраве в секунда" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "Мана в секунда" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Приковаване" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Имунитет" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Имунитет към щети за интервал от време" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Имунитет към забавяне" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Имунитет към зашеметяване" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Имунитет към крадене на здраве" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Имунитет към крадене на мана" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Имунитет към бутащ удар" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Имунитет към отразяване на щети" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Зашеметяване" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Автоматично прераждане при смърт" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Превръщане" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Страх" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Продължителност на живота" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Магически щит" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Излекуване" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Бутащ удар" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% шанс" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Основна точност" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Основен критичен шанс" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Игнорира абсорбиране" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Игнорира избягване" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% Шанс за критичен удар на забавени мишени" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Изисква %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Изисква умение: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Натиснете, за да отключите (използва 1 точка за умения)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Изисква 1 точка за умения" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d неизразходвана точка за умения" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d неизразходвани точки за умения" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Следващо ниво:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Споделен сандък" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Не могат да се скриват предмети от куестове." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Сандъка е пълен." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Търгувай" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Откупуване" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Продавач" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Щит" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Вече сте преобразени, първо се преобразете обратно." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Не можахте да се преобразите на това място." @@ -1326,132 +1546,225 @@ msgid "Completed Quests" msgstr "Завършени куестове" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Играта е запазена." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Backspace" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "CapsLock" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "End" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Home" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Insert" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Left Alt" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Left Ctrl" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Left Shift" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "NumLock" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "PageDown" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "PageUp" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pause" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "PrintScreen" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Right Alt" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Right Ctrl" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Return" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Right Shift" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "ScrollLock" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Space" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tab" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Mouse %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Axis %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Axis %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Бутон %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(няма)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Натискане" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "'%s' вече не е свързан с:" @@ -1614,16 +1927,16 @@ msgid "Base MP" msgstr "Основна мана" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "к" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s секунда" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s секунди" diff --git a/mods/default/languages/engine.ca.po b/mods/default/languages/engine.ca.po index f7acfdb..0087adc 100644 --- a/mods/default/languages/engine.ca.po +++ b/mods/default/languages/engine.ca.po @@ -4,16 +4,17 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Marc Tormo i Bochaca , 2018 +# Marc Tormo i Bochaca , 2019 +# Maria Cano , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Marc Tormo i Bochaca , 2018\n" +"Last-Translator: Maria Cano , 2020\n" "Language-Team: Catalan (https://www.transifex.com/flareorg/teams/84925/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,76 +22,83 @@ "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Tens la salut baixa!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" -msgstr "Felicitacions, has arribat al nivell %d!" - -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Podeu incrementar un atribut a través del Menú del Personatge." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Has estat vençut. El joc s'ha acabat! Prem ${INPUT_CONTINUE} per sortir al " -"títol." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Has estat vençut. Prem ${INPUT_CONTINUE} per continuar." - -#: ../../../src/Avatar.cpp:839 +msgstr "Felicitats, has pujat a nivell %d!" + +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Pots augmentar un atribut o més al Menú del Personatge." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Pots desbloquejar una habilitat o més al Menú de Poders." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "La transformació ha caducat. Us heu mogut a un lloc segur." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s eliminat." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "%s%d eliminat." + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s eliminat." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Reps %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Reps %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Reps %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Reps %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Reps %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Reps %d XP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "PV restaurats." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "PM restaurats." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "PV i PM restaurats." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Efectes negatius eliminats." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "Restaurats PV i PM, efectes negatius eliminats" @@ -114,150 +122,784 @@ "\n" "El renderitzador per defecte és sovint més ràpid que el renderitzat SDL per programari." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Aventurer" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" -msgstr "faltar" - -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +msgstr "fallar" + +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d PV" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d PM" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Destinació desconeguda" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Carregant..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Esborrar i Desar" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Eliminar aquesta partida desada?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Sortir als títols" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Partida nova" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Triar un espai" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Habilitar un mod d'història per continuar" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Carregar la partida" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Entrant al món del joc..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Carregant partida desada..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Desat erroni" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Nivell %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Cancel·lar" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Crear" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Aleatoritzar" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Tria un retrat" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Tria un nom" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Mort permanent?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Trieu una classe" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Jugar" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Activar un mod del nucli per a continuar" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Configuració" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Crèdits" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Sortir del Joc" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Acceptar" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Amunt" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Avall" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Esquerra" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Dreta" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Bar1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Bar2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Bar3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Bar4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Bar5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Bar6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Bar7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Bar8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Bar9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Bar0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Personatge" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventari" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Poders" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Registre" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Principal1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Principal2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Esborrar" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Acceptar barra d'acció" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Barra d'acció esquerra" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Barra d'acció dreta" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Utilitzar la barra d'acció" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menú de desenvolupadors" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Botó esquerre del ratolí" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Botó central del ratolí" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Botó dret del ratolí" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Roda amunt" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Roda avall" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Ratolí X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Ratolí X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Objecte desconegut" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Velocitat" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Velocitat d'atac" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Resistència (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Demana %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Objecte de missió" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Qualitat: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Amortidor: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorbir: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Fa falta el nivell %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Requereix%s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Requereix la classe: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Preu de compra: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Preu de compra: %d %s cadascun" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Preu de venda: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Preu de venda: %d %s cadascun" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Conjunt:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d objectes:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Prem [%s] per llegir" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Prem [%s] per utilitzar" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Drecera: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "PM insuficients." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Restants:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d piles" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Nom" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Nivell" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Redueix el dany rebut de \"%s\" als atacs elementals." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Experiència: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Següent: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "base (%d), bonificació (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Atributs relacionats:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Cada nivell concedeix %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Cada punt de %s concedeix %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Netejar" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Assignar:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Per defecte" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Restablir TOTS els ajustaments?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Acceptar" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Cancel·lar" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Continuar" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "Guardar la partida" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Per defecte" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Mostra tots els consells d'eines de saqueig, excepte aquells que serien " +"ocultats pel jugador o l'enemic. Mostra temporalment tots les consells " +"d'eines de saqueig prement la tecla 'Alt'." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Mostrar tot" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Sempre mostra consells d'eines de saqueig. Amaga temporalment tots els " +"consells d'eines de saqueig prement la tecla 'Alt'." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Ocult" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Amaga sempre els consells d'eines de saqueig excepte quan passis el cursor " +"per sobre d'una peça de saqueig. Mostra temporalment tots els consells " +"d'eines de saquieg prement la tecla 'Alt'." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Visible" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Visible (2x d'augment)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Controla el tipus d'avís que s'ha d'activar quan la salut del jugador està " +"per sota del llindar." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Mostra un missatge" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Fes sonar un soroll" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Canvia el cursor" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Desactivat" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Tots" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Missatge i Cursor" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Missatge i So" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "So i Cursor" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Missatge" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Cursor" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "So" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Quan la salut del jugador cau sota el llindar, es disparen les notificacions" +" si una o més d'elles estan activades." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Sortir" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Video" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Audio" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interfície" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Entrada" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Enllaços de teclat" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Pausat" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Temps de joc" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Renderitzador" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Mode Pantalla Complerta" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Superfícies de maquinari" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "V-Sync" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Filtre de Textura" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Escalat per PPP" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Capes Parallax" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Permetre canviar gamma" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Volum del so" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Volum de la música" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Volum del so" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Idioma" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Mostrar FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Cursos del ratolí per maquinari" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Mode per daltònics" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Cursos del ratolí per maquinari" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Mode de desenvolupadors" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Subtítols" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Mods Actius" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Mods disponibles" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Inhabilitar" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Habilitar >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Versió:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Joc:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Versió del motor de joc:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Mods demanats:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Netejar" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Assignar:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Video" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Entrada" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Enllaços de teclat" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Visibilitat de consells d'eines de saqueig" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Mode mini-mapa" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Mostrar sempre les etiquetes de la barra d'atributs" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Permet auto-amagar la barra d'estats" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Mostrar text de combat" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Equipar objectes automàticament" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Mostra els marcadors d'entitat ocults" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Notificació de salut baixa" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Llindar de salut baixa" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Mou l'heroi utilitzant el ratolí" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Objectiu amb ratolí" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "No utilitzar ratolí" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Moviment de ratolí per botó de canvi " + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Atacar amb moviment de ratolí" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Zona morta del joystick" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Vincle primari: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Vincle alternatiu: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Vincle del Joystick: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -266,7 +908,7 @@ "la memòria del sistema. L'efecte que això tindrà sobre el rendiment, variarà" " segons el renderitzador. " -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -274,7 +916,7 @@ "Evita l'esquinçament de la pantalla. Desactiveu si experimenteu " "\"tartamudesa\" en mode finestra o retràs en les entrades. " -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -284,813 +926,367 @@ "de la finestra per escalar la resolució. Contràriament, només s'usaran les " "mides de la pantalla." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Experimental" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Per a dispositius mòbils" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Renderitzador" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Mode Pantalla Complerta" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Mou l'heroi utilitzant el ratolí" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Superfícies de maquinari" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "V-Sync" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Filtre de Textura" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "Escalat per PPP" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Permetre canviar gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Utilitzar joystick " - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Objectiu amb ratolí" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "No utilitzar ratolí" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Zona morta del joystick" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Carregant..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Esborrar i Desar" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Eliminar aquesta partida desada?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Sortir als títols" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Joc Nou" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Elegiu un espai" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Habilitar un mod d'història per continuar" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Carregar Joc" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Entrant al mon del joc..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Carregant partida desada..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Desat erroni" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Nivell %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Crear" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Aleatoritzar" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Elegeix un retrat" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Tria un nom" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Mort permanent?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Trieu una classe" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Jugar" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Activar un mod del nucli per a continuar" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Configuració" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Crèdits" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Sortir del Joc" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Acceptar" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Amunt" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Avall" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Esquerra" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Dreta" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Bar1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Bar2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Bar3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Bar4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Bar5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Bar6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Bar7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Bar8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Bar9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Bar0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Personatge" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventari" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Poders" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Registre" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Principal1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Principal2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Esborrar" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Acceptació de la barra d'acció" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Barra d'acció esquerra" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Barra d'acció dreta" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Utilitzar la barra d'acció" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menú de desenvolupadors" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Botó esquerre del ratolí" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Botó central del ratolí" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Botó dret del ratolí" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Roda amunt" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Roda avall" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Ratolí X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Ratolí X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Objecte desconegut" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Velocitat" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Velocitat d'atac" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "Resistència (%s)" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Demana %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Objecte de missió" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Qualitat: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Amortidor: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorbir: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Demana nivell %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Demana %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Demana classe: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Preu de compra: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Preu de compra: %d %s cadascun" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Preu de venda: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Preu de venda: %d %s cadascun" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Conjunt:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d objectes:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Premi [%s] per utilitzar" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Premi [%s] per llegir" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Mostrar sempre les etiquetes de la barra d'atributs" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Mostrar text de combat" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Drecera: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "PM insuficients." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Restants:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d piles" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Nom" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Nivell" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d punt d'estat no gastat" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d punts d'estat no gastats" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Redueix el dany rebut de \"%s\" als atacs elementals." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Experiència: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Següent: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "base (%d), bonificació (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Atributs relacionats:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Cada nivell concedeix %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Cada punt de %s concedeix %d." - -#: ../../../src/MenuDevConsole.cpp:63 +"Això activa les capes parallax (sense rajoles). Desactivar aquesta opció pot" +" millorar el rendiment en alguns casos." + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Activa l'opció de sota que controla el nivel gamma de la pantalla. El " +"comportament de l'opció gamma pot variar entre plataformes." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"T'ofereix text addicional per informació que es transmet principalment a " +"través de color." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Alguns mods amagaran automàticament les barres d'estat quan estiguin " +"inactives. Deshabilitar aquesta opció lesmantindrà visibles en tot moment." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Mods Actius" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Mods disponibles" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Inhabilitar" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Habilitar >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Versió:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Joc:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Versió del motor de joc:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Mods demanats:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(cap)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Desar i sortir" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Executar" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Consola de desenvolupadors" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Usa '%s' per a inspeccionar amb el cursor." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Els arguments amb espais han d'estar entre cometes dobles. Per exemple:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Escrigui 'help' per a obtenir una llista d'ordres." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Distància" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Entitat" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "cap" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "mur" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "paret curta / pou" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "entitat" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "entitat, aliat" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Títol" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "afegeix un poder a la barra d'acció" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "mostra aquest text" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "CONSELL:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:552 +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:569 +msgstr "= = ..." + +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s nivell %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Mort" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Destruït" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Pausat" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Desar i sortir" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Sortir" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Continuar" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Equipar objectes automàticament" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Ha perdut %d%% de %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Ha perdut %d%% de PX." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Ha perdut %d%% del nivell de PX actual." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Ha perdut %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Agafar objecte(s):" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Utilitzar o equipar-se amb l'objecte:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "%s modificadors" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Selecciona la quantitat d'objectes:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Vendre la pila d'objectes:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "No en teniu prou del objecte requerit." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "No podeu utilitzar aquest objecte ara mateix." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "" -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." -msgstr "" - -#: ../../../src/MenuInventory.cpp:849 +msgstr "L'inventari està complert" + +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "" -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Aquest objecte no es pot vendre." @@ -1102,214 +1298,259 @@ msgid "Quests" msgstr "Missions" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "PX: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Aquest objecte no es pot deixar anar." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Introdueix l'import:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Passiu" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Costs %d PM" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Costs %d PV" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Refredar:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Dany per segon" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "PV per segon" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "PM per segon" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Immobilitzar" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Immunitat" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Immunitat al robatori de PV" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" -msgstr "" - -#: ../../../src/MenuPowers.cpp:926 +msgstr "Convertir" + +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Por" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Comerç" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "" -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1317,132 +1558,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "" -#: ../../../src/SDLInputState.cpp:582 -msgid "Backspace" -msgstr "" - -#: ../../../src/SDLInputState.cpp:583 -msgid "CapsLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:586 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 msgid "End" msgstr "Fi" -#: ../../../src/SDLInputState.cpp:587 -msgid "Escape" -msgstr "" - -#: ../../../src/SDLInputState.cpp:588 +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 msgid "Home" msgstr "" -#: ../../../src/SDLInputState.cpp:589 -msgid "Insert" -msgstr "" - -#: ../../../src/SDLInputState.cpp:590 -msgid "Left Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:591 -msgid "Left Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:593 -msgid "Left Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:594 -msgid "NumLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:595 -msgid "PageDown" -msgstr "" - -#: ../../../src/SDLInputState.cpp:596 -msgid "PageUp" -msgstr "" - -#: ../../../src/SDLInputState.cpp:597 +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 msgid "Pause" msgstr "Pausa" -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tabulador" + +#: ../../../src/SDLInputState.cpp:673 +msgid "Backspace" +msgstr "" + +#: ../../../src/SDLInputState.cpp:674 +msgid "CapsLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:678 +msgid "Escape" +msgstr "" + +#: ../../../src/SDLInputState.cpp:680 +msgid "Insert" +msgstr "" + +#: ../../../src/SDLInputState.cpp:681 +msgid "Left Alt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:682 +msgid "Left Ctrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:684 +msgid "Left Shift" +msgstr "" + +#: ../../../src/SDLInputState.cpp:685 +msgid "NumLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:686 +msgid "PageDown" +msgstr "" + +#: ../../../src/SDLInputState.cpp:687 +msgid "PageUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Espai" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tabulador" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1601,16 +1935,16 @@ msgid "Base MP" msgstr "PM base" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s segon" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s segons" diff --git a/mods/default/languages/engine.cs.po b/mods/default/languages/engine.cs.po index 00817cc..a5ca6c8 100644 --- a/mods/default/languages/engine.cs.po +++ b/mods/default/languages/engine.cs.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: a hark , 2018\n" "Language-Team: Czech (https://www.transifex.com/flareorg/teams/84925/cs/)\n" @@ -22,74 +22,83 @@ "Language: cs\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Dosáhl jsi levelu %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Můžete zvýšit jeden atribtu v Menu Postavy" - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Dostáváš %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Dostáváš %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Dostáváš %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Dostáváš %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Dostáváš %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Dostáváš %d XP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "HP obnoveno." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "MP obnoveno." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "HP a MP obnoveno." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Negativní účinky odstraněny." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "HP a MP obnoveno, negativní účtinky odstraněny" @@ -107,974 +116,1142 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Dobrodruh" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "minout" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "%d MP" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Neznámá lokace" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Nahrávám..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Vymazat uložené pozice" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Vymazat tuto pozici?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Ukončit do menu" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nová Hra" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Vyber si pozici" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Pro pokračování povol příběhový mod" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Nahrát Hru" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Vstupuji do herního světa..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Nahrávám uloženou pozici..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Zrušit" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Vytvořit" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Zvol si Portrét" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Zvol své Jméno" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Pernamentní smrt?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Zvol své povolání" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Hrát Hru" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Pro pokračování povol mod jádra" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Nastavení" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Ukončit Hru" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Příjmout" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Nahoru" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Dolů" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Doleva" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Doprava" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Postava" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventář" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Schopnosti" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Deník" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorbuje: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorbuje: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Potřebuje Level %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Nákupní Cena: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Nákupní Cena: %d %s každý" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Prodejní Cena: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Prodejní Cena: %d %s každý" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Jméno" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Další: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "základní (%d), bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Původní" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Vrátit původní nastavení?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Zrušit" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Konec" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Vstup" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Nastavení kláves" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mody" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Mod plné obrazovky" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Hardwarové povrchy" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Povolit změnu gammy" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Hlasitost Zvuku" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Hlasitost Hudby" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Hlasitost Zvuku" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Jazyk" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Zobraz FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Aktivní mody" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Mody k dispozici" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Zakázat" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Povolit >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Vstup" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Nastavení kláves" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Zobraz bojový text" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Chůze pomocí myši" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Míření myší" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Experimentální" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Mod plné obrazovky" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Chůze pomocí myši" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Hardwarové povrchy" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Povolit změnu gammy" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Použít joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Míření myší" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Nahrávám..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Vymazat uložené pozice" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Vymazat tuto pozici?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Ukončit do menu" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nová Hra" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Vyber si pozici" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Pro pokračování povol příběhový mod" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Nahrát Hru" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Vstupuji do herního světa..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Nahrávám uloženou pozici..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Vytvořit" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Zvol si Portrét" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Zvol své Jméno" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Pernamentní smrt?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Zvol své povolání" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Hrát Hru" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Pro pokračování povol mod jádra" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Nastavení" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Ukončit Hru" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Příjmout" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Nahoru" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Dolů" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Doleva" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Doprava" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Postava" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventář" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Schopnosti" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Deník" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorbuje: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorbuje: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Potřebuje Level %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Nákupní Cena: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Nákupní Cena: %d %s každý" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Prodejní Cena: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Prodejní Cena: %d %s každý" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Zobraz bojový text" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Jméno" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Další: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "základní (%d), bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Aktivní mody" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Mody k dispozici" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Zakázat" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Povolit >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Mrtvý" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Konec" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "" -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "" -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Tento předmět může být použit pouze z akčního menu" -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Inventář je plný." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "" -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "" @@ -1086,214 +1263,259 @@ msgid "Quests" msgstr "Úkoly" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Stojí %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Stojí %d HP" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Potřebuje Schopnost: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Sdílená Skrýš" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Obchodovat" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Koupit Zpět" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Obchodník" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "%d Štít" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Už jsi transformovaný, nejdřív se transformuj zpět." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1301,132 +1523,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "" -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1585,16 +1900,16 @@ msgid "Base MP" msgstr "" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "1%s sekunda" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "1%s sekundy" diff --git a/mods/default/languages/engine.de.po b/mods/default/languages/engine.de.po index 45addbb..8ccac3b 100644 --- a/mods/default/languages/engine.de.po +++ b/mods/default/languages/engine.de.po @@ -4,18 +4,18 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Justin Jacobs , 2018 -# Wuzzy , 2018 -# Fyrenic , 2018 +# Justin Jacobs , 2019 +# a287ca4390ac1060252ff7344e07cfb3_ddf63c0 <12d9bb92f00a9c2841133eeaac7a25bb_727560>, 2019 +# Wuzzy , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Fyrenic , 2018\n" +"Last-Translator: Wuzzy , 2020\n" "Language-Team: German (https://www.transifex.com/flareorg/teams/84925/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,80 +23,88 @@ "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Deine Gesundheit ist niedrig!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Glückwunsch, du hast Stufe %d erreicht!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Du kannst ein Attribut im Charaktermenü erhöhen." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Du wurdest besiegt, das Spiel ist vorbei! Kehre mit ${INPUT_CONTINUE} zum " -"Hauptmenü zurück." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Du wurdest besiegt. Drücke ${INPUT_CONTINUE} um fortzufahren" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Du kannst einen oder mehrere Attribute im Charakter-Menü erhöhen." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" +"Du kannst eine oder mehrere Fähigkeiten im Fähigkeiten-Menü freischalten." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" "Die Transformation ist aufgehoben. Du wurdest an einen sicheren Ort " "gebracht." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s entfernt." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "%s ×%d entfernt." + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s entfernt." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Du erhältst %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Du erhältst %s ×%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Du erhältst %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Du erhältst %s ×%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Du erhältst %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Du erhältst %d EP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "TP wiederhergestellt." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "MP wiederhergestellt." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "TP und MP wiederhergestellt." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Negative Wirkungen entfernt." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" -msgstr "TP und MP wiederhergestellt, Negativwirkungen entfernt." +msgstr "TP und MP wiederhergestellt, Negativwirkungen entfernt" #: ../../../src/DeviceList.cpp:56 msgid "" @@ -118,150 +126,781 @@ "\n" "Der Standard-Renderer, der oft schneller als der SDL-Software-Renderer ist." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Abenteurer" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "verfehlt" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d TP" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d MP" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Unbekanntes Ziel" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Laden ..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Spiel löschen" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Diesen Spielstand löschen?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Hauptmenü" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Neues Spiel" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Eintrag wählen" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Aktiviere eine Erzähl-Mod, um fortzufahren" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Spiel laden" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Spielwelt wird betreten ..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Spielstand wird geladen ..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Ungültiger Spielstand" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Stufe %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Abbrechen" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Erstellen" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Würfeln" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Wähle dein Porträt" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Wähle deinen Namen" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Dauerhafter Tod?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Wähle eine Klasse" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Spiel starten" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Aktiviere eine Kern-Mod, um fortzufahren" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Einstellungen" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Mitwirkende" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Beenden" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Bestätigen" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Hoch" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Runter" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Links" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Rechts" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Aktionsleiste 1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Aktionsleiste 2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Aktionsleiste 3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Aktionsleiste 4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Aktionsleiste 5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Aktionsleiste 6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Aktionsleiste 7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Aktionsleiste 8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Aktionsleiste 9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Aktionsleiste 0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Charakter" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventar" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Fähigkeiten" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Journal" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Aktionstaste 1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Aktionstaste 2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Strg" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Umschalt" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Entf" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Leiste Annehmen" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Leiste Links" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Leiste Rechts" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Leiste Benutzen" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Entwicklermenü" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Maus links" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Maus mittig" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Maus rechts" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Mausrad auf" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Mausrad ab" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Maus X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Maus X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Unbekannter Gegenstand" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Geschwindigkeit" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Angriffsgeschwindigkeit" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Widerstand (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Benötigt %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Aufgabengegenstand" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Qualität: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorbieren: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorbieren: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Benötigt Stufe %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Benötigt %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Benötigt Klasse: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Kaufpreis: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Kaufpreis: je %d %s" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Verkaufspreis: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Verkaufspreis: je %d %s" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Set:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d Gegenstände:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Drücke [%s] zum Lesen" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Drücke [%s] zum Verwenden" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Schnelltaste: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Nicht genügend MP." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "×%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Verbleibend:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "×%d Stapel" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Name" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Stufe" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Reduziert den Schaden von „%s“-Elementarangriffen." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "EP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Nächste: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "Basis (%d), Bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Verwandte Werte:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Jede Stufe gewährt %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Jeder Punkt %s gewährt %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Löschen" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Zuweisen:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Standard" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "ALLE Einstellungen zurücksetzen?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "OK" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Abbrechen" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Fortfahren" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "Spiel speichern" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Standard" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Zeige alle Beute-Hinweise, außer diejenigen, welche durch den Spieler oder " +"einen Gegner verdeckt werden. Zeige temporär alle Hinweise mit „Alt“." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Alles anzeigen" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Zeige alle Beute-Hinweise. Verstecke temporär alle Hinweise mit „Alt“." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Versteckt" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Verstecke alle Beute-Hinweise, außer der Mauszeiger zeigt auf den " +"Gegenstand. Zeige temporär alle Hinweise mit „Alt“." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Sichtbar" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Sichtbar (2×-Zoom)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Legt die Art der Warnung fest, die benutzt wird, wenn sich die " +"Spielergesundheit unter dem Niedrige-Gesundheit-Schwellwert befindet." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Nachricht anzeigen" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Ton abspielen" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Mauszeiger ändern" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Deaktiviert" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Alle" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Nachricht u. Mauszeiger" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Nachricht u. Ton" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Ton u. Mauszeiger" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Nachricht" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Mauszeiger" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Ton" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Wenn die Spielergesundheit unter den angegebenem Wert fällt, werden die " +"Warnungen für niedrige Gesundheit aktiviert, wenn eine davon aktiviert ist." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Beenden" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Grafik" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Ton" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interface" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Eingabe" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Tastenbelegung" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Pausiert" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Spielzeit" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Renderer" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Vollbildmodus" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Hardwareoberflächen" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "V-Sync" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Texturfilter" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "DPI-Skalierung" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Parallax-Ebenen" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Änderbarer Gamma-Wert" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma-Wert" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Soundlautstärke" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Musiklautstärke" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Soundlautstärke" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Sprache" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Framerate anzeigen" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Hardware-Mauszeiger" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Modus für Farbblinde" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Hardware-Mauszeiger" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Entwicklermodus" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Untertitel" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Aktive Mods" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Verfügbare Mods" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Deaktivieren" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Aktivieren >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Version:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Spiel:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Engine-Version:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Benötigte Mods:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Löschen" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Zuweisen:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Grafik" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Eingabe" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Tastenbelegung" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Sichtbarkeit der Beute-Hinweise" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Minikarten-Modus" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Immer Werteleistenbeschriftung anzeigen" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Erlaube automatisches Verstecken der Werteleiste" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Kampftexte anzeigen" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Automatisch ausrüsten" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Zeige versteckte Entitätsmarker" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Niedrige-Gesundheit-Warnung" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Niedrige-Gesundheit-Schwellwert" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Maus steuert Bewegung" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Zielen mit der Maus" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Maus nicht benutzen" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Maustasten zum Bewegen umschalten" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Mit Maussteuerung angreifen" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Joystick-Todeszone" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Primäre Belegung: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Alternative Belegung: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Joystick Belegung: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -269,7 +908,7 @@ "Wird versuchen, Oberflächen im Grafikspeicher anstelle des Systemspeichers " "zu speichern. Die Auswirkung auf die Performanz hängt vom Renderer ab." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -277,7 +916,7 @@ "Verhindert Screen Tearing. Deaktivieren, wenn du im Fenstermodus ein " "„Stottern“ oder Eingabeverzögerungen bemerkst." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -287,7 +926,7 @@ " anwenden, um die zum Zeichnen benutzte Auflösung zu skalieren. Ansonsten " "wird nur die Fenstergröße verwendet." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." @@ -295,624 +934,205 @@ "Aktiviert Parallax-Ebenen (Nicht-Kachel-Ebenen). Das Deaktivieren dieser " "Einstellung kann in einigen Fällen die Performanz erhöhen." -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Experimentell" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Für tragbare Geräte" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Renderer" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Vollbildmodus" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Maus steuert Bewegung" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Hardwareoberflächen" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "V-Sync" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Texturfilter" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "DPI-Skalierung" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "Parallax-Ebenen" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Änderbarer Gamma-Wert" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma-Wert" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Joystick benutzen" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Zielen mit der Maus" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Maus nicht benutzen" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Joystick-Deadzone" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Laden ..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Spiel löschen" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Diesen Spielstand löschen?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Hauptmenü" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Neues Spiel" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Eintrag wählen" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Aktiviere eine Erzähl-Mod um fortzufahren" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Spiel laden" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Spielwelt wird betreten ..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Spielstand wird geladen ..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Ungültiger Spielstand" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Stufe %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Erstellen" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Würfeln" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Wähle dein Porträt" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Wähle deinen Namen" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Dauerhafter Tod?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Wähle eine Klasse" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Spiel starten" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Aktiviere eine Kern-Mod um fortzufahren" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Einstellungen" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Mitwirkende" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Aktiviert die Möglichkeit, den Gammawert des Spiels zu ändern. Das Verhalten" +" dieser Einstellung schwankt stark zwischen Plattformen." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Zeigt zusätzlichen Text für Informationen, die hauptsächlich durch Farben " +"dargestellt werden." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Einige Mods verstecken automatisch die Werteleisten, wenn inaktiv. Das " +"Deaktivieren dieser Option wird sie durchgehend anzeigen." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Wenn aktiviert, werden leere Ausrüstungseinträge automatisch mit gefundenen " +"Gegenständen gefüllt." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Zeige einen Marker über Gegner, Verbündeten und dem Spieler, wenn sie von " +"großen Objekten verdeckt werden." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "Erlaubt Steuerung des gesamten Spiels mit Tastatur (oder Joystick)." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Wenn „Maus steuert Bewegung“ aktiviert ist, legt diese Einstellung fest, ob " +"„Aktionstaste 1“ oder „Aktionstaste 2“ benutzt wird, um den Helden zu " +"bewegen. Falls aktiviert, steuert „Aktionstaste 2“ statt „Aktionstaste 1“ " +"die Bewegung." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Wenn „Maus steuert Bewegung“ aktiviert ist, steuert diese Einstellung, ob " +"die auf Maustasten gelegte Attacke benutzt wird, indem auf einen Gegner " +"gezielt wird. Wenn diese Einstellung deaktiviert ist, muss „Umschalt“ " +"verwendet werden, um die auf Maustasten gelegte Attacke auszuführen." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Wenn aktiviert, greift der Spieler in die Richtung des Mauszeigers an." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Aktive Mods" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Verfügbare Mods" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Deaktivieren" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Aktivieren >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Version:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Spiel:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Engine-Version:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Benötigte Mods:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(keine)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" msgstr "Beenden" -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Bestätigen" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Hoch" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Runter" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Links" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Rechts" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Aktionsleiste 1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Aktionsleiste 2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Aktionsleiste 3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Aktionsleiste 4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Aktionsleiste 5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Aktionsleiste 6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Aktionsleiste 7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Aktionsleiste 8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Aktionsleiste 9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Aktionsleiste 0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Charakter" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventar" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Fähigkeiten" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Journal" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Aktionstaste 1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Aktionstaste 2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Strg" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Umschalt" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Entf" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Leiste Annehmen" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Leiste Links" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Leiste Rechts" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Leiste Benutzen" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Entwicklermenü" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Maus links" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Maus mittig" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Maus rechts" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Mausrad auf" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Mausrad ab" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Maus X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Maus X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Unbekannter Gegenstand" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Geschwindigkeit" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Angriffsgeschwindigkeit" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "Widerstand (%s)" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Benötigt %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Aufgabengegenstand" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Qualität: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorbieren: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorbieren: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Benötigt Stufe %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Benötigt %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Benötigt Klasse: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Kaufpreis: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Kaufpreis: je %d %s" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Verkaufspreis: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Verkaufspreis: je %d %s" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Set:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d Gegenstände:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Drücke [%s] zum Verwenden" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Drücke [%s] zum Lesen" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "Sichtbarkeit der Beute-Hinweise" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "Minikarten-Modus" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Immer Werteleistenbeschriftung anzeigen" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Kampftexte anzeigen" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Schnelltaste: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "Standard. Zeige vorübergehend alle Beute-Hinweise mit '%s'." - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "Zeige Alles. Verstecke vorübergehend alle Beute-Hinweise mit '%s'." - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "Verstecke Alles. Zeige vorübergehend alle Beute-Hinweise mit '%s'." - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "Sichtbar" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "Sichtbar (2x Zoom)" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "Versteckt" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "Aktiviert" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "Deaktiviert" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "Nicht genügend MP." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "×%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Verbleibend:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "×%d Stapel" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Name" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Stufe" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d verfügbarer Wertepunkt" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d verfügbare Wertepunkte" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Reduziert den Schaden von „%s“-Elementarangriffen." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "EP: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Nächste: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "Basis (%d), Bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Verwandte Werte: " - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Jede Stufe gewährt %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Jeder Punkt %s gewährt %d." - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Ausführen" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Entwicklerkonsole" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Benutze „%s“, um mit dem Mauszeiger zu untersuchen." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Argumente mit Leerzeichen sollten in doppelte Anführungszeichen gesetzt " -"sein. Beispiel: " - -#: ../../../src/MenuDevConsole.cpp:147 +"sein. Beispiel:" + +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "„help“ eingeben, um Liste an Befehlen zu erhalten." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Distanz" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" -msgstr "Entity" - -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +msgstr "Entität" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "kein" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "Wand" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "kurze Wand / Grube" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" -msgstr "Entity" - -#: ../../../src/MenuDevConsole.cpp:267 +msgstr "Entität" + +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" -msgstr "Entity, verbündet" - -#: ../../../src/MenuDevConsole.cpp:274 +msgstr "Entität, verbündet" + +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Kachel" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "fügt eine Fähigkeit zur Aktionsleiste hinzu" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "schaltet die FPS-Anzeige an/aus" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "schaltet alle HUD-Elemente an/aus" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "schaltet das Entwickler-HUD an/aus" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -920,11 +1140,11 @@ "Gibt eine Liste an Kräften aus, die auf einen Suchbegriff passen. Ohne " "Suchbegriff werden alle aufgelistet" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "Gibt alle Karten-Dateinamen der Dateien im „maps/“-Verzeichnis aus." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -932,7 +1152,7 @@ "Gibt die aktiven Kampagnen-Status, die auf einen Suchbegriff passen, aus. " "Ohne Suchbegriff werden die aktiven Status aufgelistet" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -940,171 +1160,155 @@ "Gibt eine Liste an Gegenständen, die auf einen Suchbegriff passen, aus. Ohne" " Suchbegriff werden alle Gegenstände aufgelistet" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "parst eine Reihe an Ereigniskomponenten und führt sie als ein einzelnes " "Ereignis aus" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "löscht die Befehlshistorie" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "zeigt diesen Text an" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Entwickler-HUD umgeschaltet" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "HUD umgeschaltet" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "FPS-Anzeige umgeschaltet" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "FEHLER: Ungültige Anzahl an Argumenten" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "TIPP:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:552 +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "FEHLER: „%s“ ist kein gültiger Ereignisschlüssel" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "FEHLER: zu wenig Argumente" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." -msgstr "= = ..." - -#: ../../../src/MenuDevConsole.cpp:569 +msgstr "= = ..." + +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "FEHLER: unbekannter Befehl" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "TIPP: Gib „help“ ein" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s Stufe %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Tot" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Zerstört" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Pausiert" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Beenden" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Beenden" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Fortsetzen" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Automatisch ausrüsten" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "%d%% an %s verloren." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "%d%% der gesamten EP verloren." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "%d%% EP der aktuellen Stufe verloren." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "%s verloren." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Aufnehmen:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Ausrüsten:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "Tastenkombinationen mit %s:" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Anzahl wählen:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Stapel einlagern:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Stapel verkaufen:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Du hast nicht genug von diesem Gegenstand." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Du kannst diesen Gegenstand jetzt nicht benutzen." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Dieser Gegenstand kann nur von der Aktionsleiste benutzt werden." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Inventar ist voll." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Nicht genug %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Dieser Gegenstand kann nicht verkauft werden." @@ -1116,214 +1320,260 @@ msgid "Quests" msgstr "Aufgaben" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "EP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Dieser Gegenstand kann nicht abgelegt werden." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Anzahl eingeben:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Passiv" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Kostet %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Kostet %d TP" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Abklingzeit:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Schaden je Sekunde" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "TP je Sekunde" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "MP je Sekunde" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Erstarren" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Immunität" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Immunität gegen Zeitschaden" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Immunität gegen Verzögerung" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Immunität gegen Schock" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Immunität gegen TP-Stehlen" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Immunität gegen MP-Stehlen" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Immunität gegen Rückschlag" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Immunität gegen Reflektionsschaden" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Schock" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Automatisch wiederbeleben" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Umwandeln" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Angst" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Lebenszeit" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Magischer Schild" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Heilung" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Rückschlag" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% Wahrscheinlichkeit" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" -msgstr "Basis-Genauigkeit:" - -#: ../../../src/MenuPowers.cpp:1082 +msgstr "Basis-Genauigkeit" + +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Basis-Chance für krit. Treffer" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Ignoriert Rüstung" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Ignoriert Ausweichen" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% Wahrsch. für krit. verlangsamte Ziele" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "Elementarschaden (%s)" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Benötigt: %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Benötigt Fähigkeit: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Klicken zum Freischalten (benutzt 1 Fertigkeitspunkt)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Benötigt 1 Fertigkeitspunkt" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d verfügbarer Fertigkeitspunkt" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d verfügbare Fertigkeitspunkte" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Nächste Stufe:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Gemeinschaftslager" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Aufgabengegenstände können nicht eingelagert werden." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Lagerraum" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "Privat" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "Gemeinsam" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Dieser Gegenstand kann nicht eingelagert werden." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Dieser Gegenstand kann nicht im privaten Lager eingelagert werden." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" +"Dieser Gegenstand kann nicht im Gemeinschaftslager eingelagert werden." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Lagerraum ist voll." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Gegenstand kann nicht eingelagert werden: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Handeln" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Rückkauf" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Verkäufer" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Schild" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Du bist bereits verwandelt, beende die Verwandlung zunächst." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "An diesem Ort ist eine Zurückverwandlung nicht möglich." @@ -1331,132 +1581,225 @@ msgid "Completed Quests" msgstr "Erledigte Aufgaben" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Spiel gespeichert." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "Rück" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "Festst" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "Entf" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "Ende" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "Esc" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Pos1" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "Einfg" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "LAlt" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "LStrg" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "LUmsch" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "Num" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "Bild↓" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "Bild↑" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "Druck" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "RAlt" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "RStrg" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "Enter" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "RUmsch" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "Rollen" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "Leer" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Rücktaste" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "Feststelltaste" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "Ende" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Pos1" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Einfügen" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Alt links" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Strg links" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Umschalt links" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "Numlock" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "Bild ab" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "Bild auf" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pause" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "Drucken" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Alt rechts" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Strg rechts" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Eingabe" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Umschalt rechts" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "Rollen" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Leertaste" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tab" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "M%d" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Maus %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "JX%d-" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Achse %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "JX%d+" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Achse %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "JB%d" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Taste %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(keine)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "Touchscreen Steuerkreuz" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "Touchscreen Tasten" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Antippen" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Kann nicht belegt werden: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "„%s“ ist nicht mehr zugewiesen auf:" @@ -1545,7 +1888,7 @@ #: ../../../src/Stats.cpp:84 msgid "Increases the XP gained per kill." -msgstr "Erhöht die EP für getötete Gegner" +msgstr "Erhöht die EP für getötete Gegner." #: ../../../src/Stats.cpp:88 #, c-format @@ -1555,7 +1898,7 @@ #: ../../../src/Stats.cpp:89 #, c-format msgid "Increases the %s found per drop." -msgstr "Erhöht die Chance auf %s" +msgstr "Erhöht die Chance auf %s." #: ../../../src/Stats.cpp:93 msgid "Item Find Chance" @@ -1622,16 +1965,16 @@ msgid "Base MP" msgstr "Basis-MP" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s Sekunde" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s Sekunden" diff --git a/mods/default/languages/engine.el.po b/mods/default/languages/engine.el.po index 0aafd9f..96b081d 100644 --- a/mods/default/languages/engine.el.po +++ b/mods/default/languages/engine.el.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Nea Retrogamer (nearetrogamer), 2018\n" "Language-Team: Greek (https://www.transifex.com/flareorg/teams/84925/el/)\n" @@ -22,74 +22,83 @@ "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Συγχαρητήρια, έφτασες στο επίπεδο %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Μπορείς να αυξήσεις μία ικανότητα μέσω του Μενού Χαρακτήρα." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s αφαιρέθηκαν." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "Αφαιρέθηκε: %s" -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Λαμβάνεις %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Λαμβάνεις %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Λαμβάνεις %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Λαμβάνεις %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Λαμβάνεις %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Λαμβάνεις %d XP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "HP αναζωογονήθηκαν." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "MP αναζωογονήθηκαν." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "HP και MP αναζωογονήθηκαν." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Αρνητικές επιδράσεις αφαιρέθηκαν." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "HP και MP αναζωογονήθηκαν, αρνητικές επιδράσεις αφαιρέθηκαν." @@ -107,975 +116,1143 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Τυχοδιώκτης" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "αστοχία" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d HP" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d MP" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Άγνωστος προορισμός" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Φόρτωση..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Διαγραφή" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Διαγραφή παιχνιδιού;" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Έξοδος προς Τίτλο" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Νέο Παιχνίδι" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Επίλεξε μία Θέση" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Ενεργοποίησε ένα πρόσθετο με σενάριο για να συνεχίσεις" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Φόρτωση Παιχνιδιού" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Είσοδος στο παιχνίδι..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Φόρτωση αποθηκευμένου παιχνιδιού..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Επίπεδο %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Ακύρωση" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Δημιουργία" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Επιλογή Πορτραίτου" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Επιλογή Ονόματος" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Μόνιμος θάνατος;" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Επιλογή Κλάσης" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Έναρξη Παιχνιδιού" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Ενεργοποίησε ένα πρόσθετο πυρήνα για να συνεχίσεις" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Ρυθμίσεις" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Μνεία" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Έξοδος" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Αποδοχή" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Πάνω" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Κάτω" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Αριστερά" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Δεξιά" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Μπάρα 1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Μπάρα 2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Μπάρα 3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Μπάρα 4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Μπάρα 5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Μπάρα 6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Μπάρα 7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Μπάρα 8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Μπάρα 9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Μπάρα 0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Χαρακτήρας" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Εξοπλισμός" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Δυνάμεις" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Ημερολόγιο" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Κύρια Ενέργεια 1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Κύρια Ενέργεια 2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Διαγραφή" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Μπάρα Ενεργειών Αποδοχή" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Μπάρα Ενεργειών Αριστερά" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Μπάρα Ενεργειών Δεξιά" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Μπάρα Ενεργειών Χρήση" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%%Ταχύτητα" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%%Ταχύτητα Επίθεσης" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Αντικείμενο Αποστολής" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Ποιότητα: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Απορρόφηση: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Απορρόφηση: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Χρειάζεται Επίπεδο %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Χρειάζεται %s%d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Τιμή Αγοράς: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Τιμή Αγοράς: %d %s έκαστο" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Τιμή Πώλησης: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Τιμή Πώλησης: %d %s έκαστο" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Όνομα" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Επίπεδο" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "XP (Πόντοι Εμπειρίας): %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Επόμενο: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "βάση (%d), μπόνους (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Προκαθορισμένα" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Επαναφορά ΌΛΩΝ των ρυθμίσεων;" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Εντάξει" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Ακύρωση" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Έξοδος" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Εικόνα" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Ήχος" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Περιβάλλον" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Εισαγωγή" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Πλήκτρα" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Πρόσθετα" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Λειτουργία πλήρους οθόνης" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Χρήση κάρτας γραφικών για επιφάνειες" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Επιτρέπεται η αλλαγή Φωτεινότητας" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Φωτεινότητα" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Ένταση Ήχου" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Ένταση Μουσικής" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Ένταση Ήχου" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Γλώσσα" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Εμφάνιση καρέ ανά δευτερόλεπτο" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Ρύθμιση Δυσχρωματοψίας" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Υπότιτλοι" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Ενεργά Πρόσθετα" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Διαθέσιμα Πρόσθετα" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Απενεργοποίηση" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Ενεργοποίηση >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Παιχνίδι:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Εικόνα" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Εισαγωγή" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Πλήκτρα" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Προβολή κειμένου μάχης" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Χειριστήριο" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Κίνηση ήρωα με ποντίκι" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Σκόπευση με το ποντίκι" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Απενεργοποίηση του ποντικιού" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Νεκρή Ζώνη Χειριστηρίου" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Πειραματικό" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Για φορητές συσκευές" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Λειτουργία πλήρους οθόνης" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Κίνηση ήρωα με ποντίκι" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Χρήση κάρτας γραφικών για επιφάνειες" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Επιτρέπεται η αλλαγή Φωτεινότητας" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Φωτεινότητα" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Χρήση χειριστηρίου" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Χειριστήριο" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Σκόπευση με το ποντίκι" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Απενεργοποίηση του ποντικιού" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Νεκρή Ζώνη Χειριστηρίου" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Φόρτωση..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Διαγραφή" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Διαγραφή παιχνιδιού;" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Έξοδος προς Τίτλο" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Νέο Παιχνίδι" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Επίλεξε μία Θέση" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Ενεργοποίησε ένα πρόσθετο με σενάριο για να συνεχίσεις" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Φόρτωση Παιχνιδιού" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Είσοδος στο παιχνίδι..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Φόρτωση αποθηκευμένου παιχνιδιού..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Επίπεδο %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Δημιουργία" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Επιλογή Πορτραίτου" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Επιλογή Ονόματος" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Μόνιμος θάνατος;" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Επιλογή Κλάσης" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Έναρξη Παιχνιδιού" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Ενεργοποίησε ένα πρόσθετο πυρήνα για να συνεχίσεις" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Ρυθμίσεις" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Μνεία" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Έξοδος" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Αποδοχή" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Πάνω" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Κάτω" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Αριστερά" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Δεξιά" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Μπάρα 1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Μπάρα 2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Μπάρα 3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Μπάρα 4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Μπάρα 5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Μπάρα 6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Μπάρα 7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Μπάρα 8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Μπάρα 9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Μπάρα 0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Χαρακτήρας" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Εξοπλισμός" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Δυνάμεις" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Ημερολόγιο" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Κύρια Ενέργεια 1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Κύρια Ενέργεια 2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Διαγραφή" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Μπάρα Ενεργειών Αποδοχή" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Μπάρα Ενεργειών Αριστερά" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Μπάρα Ενεργειών Δεξιά" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Μπάρα Ενεργειών Χρήση" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%%Ταχύτητα" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%%Ταχύτητα Επίθεσης" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Αντικείμενο Αποστολής" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Ποιότητα: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Απορρόφηση: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Απορρόφηση: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Χρειάζεται Επίπεδο %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Χρειάζεται %s%d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Τιμή Αγοράς: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Τιμή Αγοράς: %d %s έκαστο" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Τιμή Πώλησης: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Τιμή Πώλησης: %d %s έκαστο" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Προβολή κειμένου μάχης" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Όνομα" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Επίπεδο" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "XP (Πόντοι Εμπειρίας): %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Επόμενο: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "βάση (%d), μπόνους (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Ενεργά Πρόσθετα" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Διαθέσιμα Πρόσθετα" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Απενεργοποίηση" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Ενεργοποίηση >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Παιχνίδι:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Αποθήκευση & Έξοδος" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "==..." -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s επιπέδου %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Νεκρός" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Αποθήκευση & Έξοδος" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Έξοδος" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Συνέχιση" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Έχασες %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "" -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "" "Αυτό το αντικείμενο μπορεί να χρησιμοποιηθεί μόνο από την μπάρα ενεργειών." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Έχεις παραφορτωθεί." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Έλλειψη από %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "" @@ -1087,214 +1264,259 @@ msgid "Quests" msgstr "Αποστολές" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "XP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Κοστίζει %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Κοστίζει %d ΗP" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Χρειάζεται ένα %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Χρειάζεται Δύναμη: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Χρειάζεται 1 Πόντο Ικανότητας" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Επόμενο Επίπεδο:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Κοινόχρηστη Αποθήκη" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Εμπόριο" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Επαναγορά" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Πωλητής" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Άμυνα" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Έχεις ήδη μεταμορφωθεί, απομεταμορφώσου πρώτα." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1302,132 +1524,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "" -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Ποντίκι %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Άξονας %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Άξονας %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1586,16 +1901,16 @@ msgid "Base MP" msgstr "" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "κ" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s δευτερόλεπτο" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s δευτερόλεπτα" diff --git a/mods/default/languages/engine.es.po b/mods/default/languages/engine.es.po index fd442b5..6727ab7 100644 --- a/mods/default/languages/engine.es.po +++ b/mods/default/languages/engine.es.po @@ -6,16 +6,17 @@ # Translators: # Justin Jacobs , 2018 # Eric R, 2018 -# Diego J. Romero López , 2018 +# Agustin Ferrario , 2020 +# Diego J. Romero López , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Diego J. Romero López , 2018\n" +"Last-Translator: Diego J. Romero López , 2020\n" "Language-Team: Spanish (https://www.transifex.com/flareorg/teams/84925/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,76 +24,83 @@ "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Tu salud es baja" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "¡Felicidades, has alcanzado el nivel %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Puedes aumentar un atributo a través del Menú de Personaje." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Has sido derrotado y el juego ha terminado. Pulsa ${INPUT_CONTINUE} para " -"salir al título." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Has sido derrotado. Pulsa ${INPUT_CONTINUE} para continuar." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Puedes avanzar uno o más atributos desde el Menú de Personaje" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Puedes desbloquear una o más habilidades a través del Menú de Poderes" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "La transformación ha expirado. Se te ha movido a un lugar seguro." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s quitado." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "%s x%d quitado." + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s quitado." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Recibes %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Recibes %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Recibes %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Recibes %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Recibes %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Recibes %d XP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "PV restaurados." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "PM restaurados." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "PV y PM restaurados." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Efectos negativos eliminados." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "Restaurados PV y PM, efectos negativos eliminados" @@ -116,150 +124,784 @@ "\n" "El renderizador predeterminado que suele ser más rápido que el renderizador SDL por software." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Aventurero" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "fallo" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d PV" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d PM" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Destino desconocido" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Cargando..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Eliminar" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "¿Eliminar esta partida guardada?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Salir al Título" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nuevo Juego" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Elija una ranura" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Habilitar un mod de historia para continuar" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Cargar Juego" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Entrando en mundo del juego..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Cargando partida guardada..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Partida guardada inválida" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Nivel %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Cancelar" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Crear" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Aleatorizar" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Elige un retrato" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Elige un nombre" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "¿Muerte permanente?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Elige una clase" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Jugar" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Habilitar un mod de núcleo para continuar" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Configuración" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Créditos" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Salir del juego" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Aceptar" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Arriba" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Abajo" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Izquierda" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Derecha" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Bar1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Bar2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Bar3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Bar4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Bar5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Bar6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Bar7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Bar8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Bar9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Bar0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Personaje" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventario" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Poderes" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Registro" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Principal1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Principal2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Suprimir" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Aceptación de la barra de acción" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Barra de acción izquierda" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Barra de acción derecha" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Uso de la barra de acción" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menú de desarrolladores" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Botón izquierdo del ratón" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Botón central del ratón" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Botón derecho del ratón" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Rueda hacia arriba" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Rueda hacia abajo" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Ratón X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Ratón X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Objeto desconocido" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% velocidad" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% velocidad de ataque" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Resistencia (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Requiere %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Objeto de gesta" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Calidad: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorber: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorber: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Requiere nivel %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Requiere %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Requiere clase: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Precio de compra: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Precio de compra: %d %s cada" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Precio de venta: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Precio de venta: %d %s cada" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Conjunto:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d objetos:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Pulsa [%s] para leer" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Pulsa [%s] para usar" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Atajo: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "PM insuficientes." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Restantes:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d pilas" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Nombre" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Nivel" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Reduce el daño recibido de ataques elementales de \"%s\"." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Experiencia: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Siguiente: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "base (%d), bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Atributos relacionadas:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Cada nivel otorga %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Cada punto de %s otorga %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Limpiar" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Asignar:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Por defecto" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "¿Restablecer TODOS los ajustes?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Aceptar" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Cancelar" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Continuar" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "Guardar la partida" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Opción por defecto" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Mostrar los consejos referidos al botín, exceptuando aquellos ocultos por el" +" jugador o un enemigo. Para mostrar todos los consejos pulsa \"Alt\"." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Mostrar todos" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Siempre mostrar las ayudas del botín. Ocultar temporalmente todas las ayudas" +" del botín con \"Alt\"." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Oculto" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Ocultar siempre los consejos referidos al botín, exceptuando cuando uno de " +"los objetos tenga el cursor del ratón encima. Para mostrar todos los " +"consejos pulsa \"Alt\"." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Visible" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Visible (aumento: 2x)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Controla el tipo de aviso que se activará cuando la salud del jugador esté " +"por debajo del umbral de bajo nivel de salud." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Muestra un mensaje" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Reproduce un sonido" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Cambia el cursor" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Deshabilitado" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Todos" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Mensaje y cursor" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Mensaje y sonido" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Sonido y cursor" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Mensaje" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Cursor" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Sonido" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Cuando la salud del jugador esté por debajo de un umbral determinado, las " +"notificaciones de baja saludo se activarán si al menos una de de ellas están" +" activadas." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Salir" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Vídeo" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Audio" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interfaz" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Entrada" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Teclas" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Pausado" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Tiempo de juego" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Renderizador" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Modo de pantalla completa" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Superficies de hardware" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "V-Sync" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Filtro de textura" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Escalado por PPP" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Capas de paralaje" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Permitir cambiar gama" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gama" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Volumen de sonido" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Volumen de música" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Volumen de sonido" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Idioma" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Mostrar FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Cursor del ratón por hardware" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Modo para daltónicos" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Cursor del ratón por hardware" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Modo desarrollador" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Subtítulos" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Mods Activos" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Mods Disponibles" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Inhabilitar" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Habilitar >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Versión:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Juego:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Versión del motor de juego:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Mods requeridos:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Limpiar" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Asignar:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Vídeo" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Entrada" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Teclas" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Ayuda a la visibilidad del botín" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Modo minimapa" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Mostrar etiquetas en las barra de atributos" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Permitir ocultar automáticamente la barra de estado" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Mostrar texto de combate" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Automáticamente equipar con objetos" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Mostrar marcadores de entidad ocultos" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Notificación de salud baja" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Notificación de salud baja" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Mover héroe a través del ratón" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Ratón para apuntar" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "No usar ratón" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Intercambiar botón de movimiento de ratón" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Atacar con movimiento de ratón" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Zona sin joystick" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Vinculación primaria: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Vinculación alternativa: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Vinculación con Joystick: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -267,7 +909,7 @@ "Intentará almacenar las superficies en la memoria de vídeo en vez de en la " "memoria del sistema. Esto afectará de forma distinta según el renderizador." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -275,7 +917,7 @@ "Evita que la pantalla se muestre rota. Se puede desactivar si se detectan " "\"parpadeos\" de imagen en el modo ventana o retraso en las entradas" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -285,7 +927,7 @@ "dimensiones de la ventana para escalar la resolución. De lo contrario, sólo " "se usarán las dimensiones de la ventana." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." @@ -293,627 +935,207 @@ "Activa las capas de paralaje (sin teselas). Desactivar esta opción puede " "mejorar el rendimiento en algunos casos." -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Experimental" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Para dispositivos móviles" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Renderizador" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Modo de pantalla completa" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Mover héroe a través del ratón" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Superficies de hardware" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "V-Sync" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Filtro de textura" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "Escalado por PPP" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "Capas de paralaje" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Permitir cambiar gama" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gama" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Usar joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Ratón para apuntar" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "No usar ratón" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Zona sin joystick" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Cargando..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Eliminar" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "¿Eliminar esta partida guardada?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Salir al Título" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nuevo Juego" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Elija una ranura" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Habilitar un mod de historia para continuar" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Cargar Juego" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Entrando en mundo del juego..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Cargando partida guardada..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Partida guardada inválida" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Nivel %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Crear" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Aleatorizar" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Elige un retrato" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Elige un nombre" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "¿Muerte permanente?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Elige una clase" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Jugar" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Habilitar un mod de núcleo para continuar" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Configuración" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Créditos" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Salir del juego" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Aceptar" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Arriba" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Abajo" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Izquierda" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Derecha" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Bar1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Bar2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Bar3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Bar4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Bar5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Bar6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Bar7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Bar8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Bar9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Bar0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Personaje" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventario" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Poderes" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Registro" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Principal1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Principal2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Suprimir" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Aceptación de la barra de acción" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Barra de acción izquierda" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Barra de acción derecha" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Uso de la barra de acción" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menú de desarrolladores" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Botón izquierdo del ratón" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Botón central del ratón" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Botón derecho del ratón" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Rueda hacia arriba" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Rueda hacia abajo" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Ratón X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Ratón X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Objeto desconocido" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% velocidad" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% velocidad de ataque" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "Resistencia (%s)" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Requiere %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Objeto de gesta" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Calidad: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorber: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorber: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Requiere nivel %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Requiere %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Requiere clase: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Precio de compra: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Precio de compra: %d %s cada" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Precio de venta: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Precio de venta: %d %s cada" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Conjunto:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d objetos:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Pulsa [%s] para usar" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Pulsa [%s] para leer" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "Ayuda a la visibilidad del botín" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "Modo minimapa" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Mostrar etiquetas en las barra de atributos" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Mostrar texto de combate" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Atajo: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" -"Predeterminado. Muestra temporalmente todas las ayudas de botín con '%s'." - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" -"Mostrar todas. Muestra temporalmente todas las ayudas de botín con '%s'." - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" -"Ocultar todas. Muestra temporalmente todas las ayudas de botín con '%s'." - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "Visible" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "Visible (aumento: 2x)" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "Oculto" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "Habilitado" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "Deshabilitado" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "PM insuficientes." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Restantes:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d pilas" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Nombre" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Nivel" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d punto de atributo restante" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d puntos de atributos restantes" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Reduce el daño recibido de ataques elementales de \"%s\"." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Experiencia: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Siguiente: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "base (%d), bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Atributos relacionadas:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Cada nivel otorga %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Cada punto de %s otorga %d." - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Activa la opción inferior que controla el nivel de transparencia de la " +"pantalla. El comportamiento de transparencia puede variar entre plataformas." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Proporciona text adicional para la información que se muestra principalmente" +" mediante colores." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Algunos mods ocultan automáticamente las barras de estado cuando no están " +"activas. Desactivar esta opción hace que se muestren siempre." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Cuando está activado, las ranuras de equipamiento libres se asignarán con " +"elementos que se puedan usar en cuanto se obtengan." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Muestra un marcador por encima de los enemigos, aliados y el jugador cuando " +"se vean tapados por objetos de gran altura." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" +"Esto permite controlar el juego por completo con el teclado (o con un " +"joystick)." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Cuando \"Mover héroe usando el ratón\" está activado, esta opción controla " +"si \"Principal1\" o \"Principal2\" se usan para moverlo. Si activado, se " +"usará \"Principal2\" en vez de \"Principal1\"." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Cuando la opción de \"Mover héroe usando el ratón\" está activa, esta opción" +" controla si el Poder asignado al botón de movimiento puede usarse en cuanto" +" se apunta a un enemigo. Si esta opción está desactivada, se necesita usar " +"el botón \"Mayús\" para acceder al Poder asignado al botón de movimiento." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Los ataques del jugador se dirigirán a la dirección del cursor del ratón " +"cuando esta opción esté activada." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Mods Activos" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Mods Disponibles" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Inhabilitar" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Habilitar >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Versión:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Juego:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Versión del motor de juego:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Mods requeridos:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(ninguno)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Guardar y salir" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Ejecutar" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Consola de desarrollador" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Usa '%s' para inspeccionar con el cursor." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Los argumentos con espacios deben estar entre comillas dobles. Ejemplo:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Escriba 'help' para una lista de las órdenes disponibles." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Distancia" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Entidad" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "ninguno" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "muro" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "muro bajo/pozo" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "entidad" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "entidad, aliado" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Título" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "añade poder a la barra de acción" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "enciende/apaga el contador de FPS" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "Activa/Desactiva todos los elementos con información en pantalla" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" "Activa/Desactiva todos la información en pantalla para desarrolladores" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -921,11 +1143,11 @@ "Muestra una lista de poderes que se emparejan con un término de búsqueda. Si" " no hay ningún término, se listarán todos los elementos" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "Muestra todos los ficheros de mapa del directorio \"maps/\"." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -933,7 +1155,7 @@ "Muestra los estados de la campaña activa que emparejan con un término de " "búsqueda. Si no hay ningún término, se listarán todos los estados activos" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -941,171 +1163,155 @@ "Muestra una lista de todos los objetos que emparejan con un término de " "búsqueda. Si no hay ningún término de búsqueda, listará todos los objetos" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "analiza una serie de componentes de eventos y los ejecuta como un solo " "evento" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "limpia el histórico de órdenes" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "muestra este texto" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Activar/Desactivar información para desarrolladores" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Estado de información en pantalla cambiado" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "Conmutador del contador de FPS" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "ERROR: número de argumentos incorrecto" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "CONSEJO:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "ERROR: '%s' no es una clave válida de evento" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "ERROR: muy pocos argumentos" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = ..." -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "ERROR: orden desconocida" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "CONSEJO: escribe help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s nivel%d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Muerto" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Destruido" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Pausado" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Guardar y salir" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Salir" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Continuar" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Automáticamente equipar con objetos" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Perdió %d%% de %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Perdió %d%% de PX." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Perdió %d%% del nivel de PX actual." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Perdió %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Coger objeto/s:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Usar o equiparse con objeto:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "modificadores %s" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Selecciona la cantidad de elementos:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" -msgstr "Devolver un objeto a la pila:" - -#: ../../../src/MenuInventory.cpp:325 +msgstr "Devolver un objeto al almacén:" + +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Vender pila de objetos:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "No tienes suficiente del objeto requerido." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Ahora no puedes usar este objeto." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Este elemento sólo se puede utilizar en la barra de acción." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "El inventario esta completo." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "No hay suficientes %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Este objeto no se puede vender." @@ -1117,214 +1323,259 @@ msgid "Quests" msgstr "Gestas" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Experiencia: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Este objeto no se puede soltar." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Introduce cantidad:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Pasivo" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Costos %d PM" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Costos %d HP" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Enfriar:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Daño por segundo" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "PV por segundo" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "PM por segundo" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Inmovilizar" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Inmunidad" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Inmunidad al daño durante un tiempo" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Inmunidad a la lentidud" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Inmunidad al aturdimiento" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Inmunidad al robo de PV" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Inmunidad al robo de PM" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Inmunidad al contragolpe" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Inmunidad a la reflexión de daño" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Aturdir" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Revivir automáticamente al morir" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Convertir" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Miedo" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Vida" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Armadura mágica" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Sanación" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Contragolpe" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% probabilidad " -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Exactitud base" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Probabilidad base de crítico" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Ignora absorción" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Ignora evitación" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% Probabilidad de crítico en objetivos lentos" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "Daño elemental (%s)" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Requiere un/a %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Requiere Poder: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Pulsa para desbloquear (usa 1 punto de habilidad)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Requiere 1 punto de habilidad" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d punto de habilidad restante" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d puntos de habilidad restantes" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Siguiente nivel:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Almacén compartido" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "No puedes guardar objetos de gesta en tu almacén." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Almacén" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "Privado" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "Compartido" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Este objeto no se puede guardar en el almacén." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Este objeto no se puede guardar en el almacén privado." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "Este objeto no se puede guardar en el almacén compartido." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Almacén lleno." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "No se puede guardar objeto en el amacén: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Comerciar" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Recompra" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Vendedor" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Escudo" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Usted ya está transformado, destransformase primero." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "No se puede quitar la transformación en esta posición." @@ -1332,132 +1583,225 @@ msgid "Completed Quests" msgstr "Gestas completadas" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Partida guardada." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "Retroceso" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "BloqMayús" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "Suprimir" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "Fin" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "Esc" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Inicio" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "Ins" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "AltIzq" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "CtrlIzq" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "MayúsIzq" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "BloqNum" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "AvPág" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "RePág" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pausar" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "Impr" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "AltDch" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "CtrlDch" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "Intro" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "MayúsDch" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "BloqDespl" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "Esp" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tabulador" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Retroceso" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "BloqMayús" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "Fin" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Inicio" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Insertar" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Alt Izquierdo" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Ctrl Izquierdo" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Mayús Izquierdo" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "BloqueoDeNúmeros" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "Avanzar Página" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "Retroceder Página" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pausar" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "Imprimir Pantalla" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Alt Derecho" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Ctrl Derecho" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Retorno" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Mayús. derecho" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "BloqDesplazamiento" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Espacio" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tabulador" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "M%d" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Ratón %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "JX%d-" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Eje %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "JX%d+" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Eje %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "JB%d" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Botón %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(ninguno)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "Cruceta direccional" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "Botones de control táctiles" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Palmadita" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "No se puede vincular: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "'%s' no está ligado más a:" @@ -1621,16 +1965,16 @@ msgid "Base MP" msgstr "PM base" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "Aceptar" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s segundo" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s segundos" diff --git a/mods/default/languages/engine.eu.po b/mods/default/languages/engine.eu.po new file mode 100644 index 0000000..dc962ac --- /dev/null +++ b/mods/default/languages/engine.eu.po @@ -0,0 +1,1918 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" +"PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Language-Team: Basque (https://www.transifex.com/flareorg/teams/84925/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 +#, c-format +msgid "Congratulations, you have reached level %d!" +msgstr "" + +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 +msgid "Transformation expired. You have been moved back to a safe place." +msgstr "" + +#: ../../../src/CampaignManager.cpp:152 +#, c-format +msgid "%d %s removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 +#, c-format +msgid "%s removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "" + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "" + +#: ../../../src/CampaignManager.cpp:193 +#, c-format +msgid "You receive %s." +msgstr "" + +#: ../../../src/CampaignManager.cpp:210 +#, c-format +msgid "You receive %d XP." +msgstr "" + +#: ../../../src/CampaignManager.cpp:216 +msgid "HP restored." +msgstr "" + +#: ../../../src/CampaignManager.cpp:220 +msgid "MP restored." +msgstr "" + +#: ../../../src/CampaignManager.cpp:225 +msgid "HP and MP restored." +msgstr "" + +#: ../../../src/CampaignManager.cpp:229 +msgid "Negative effects removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:235 +msgid "HP and MP restored, negative effects removed" +msgstr "" + +#: ../../../src/DeviceList.cpp:56 +msgid "" +"SDL software renderer\n" +"\n" +"Often slower, but less likely to have issues." +msgstr "" + +#: ../../../src/DeviceList.cpp:59 +msgid "" +"SDL hardware renderer\n" +"\n" +"The default renderer that is often faster than the SDL software renderer." +msgstr "" + +#: ../../../src/EngineSettings.cpp:586 +msgid "Adventurer" +msgstr "" + +#: ../../../src/Entity.cpp:527 +msgid "miss" +msgstr "" + +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 +#, c-format +msgid "+%d HP" +msgstr "" + +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 +#, c-format +msgid "+%d MP" +msgstr "" + +#: ../../../src/EventManager.cpp:792 +msgid "Unknown destination" +msgstr "" + +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 +msgid "Defaults" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 +msgid "Reset ALL settings?" +msgstr "" + +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 +msgid "OK" +msgstr "" + +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "" + +#: ../../../src/MenuConfig.cpp:336 +msgid "Audio" +msgstr "" + +#: ../../../src/MenuConfig.cpp:337 +msgid "Interface" +msgstr "" + +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "" + +#: ../../../src/MenuConfig.cpp:340 +msgid "Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "" + +#: ../../../src/MenuConfig.cpp:372 +msgid "Music Volume" +msgstr "" + +#: ../../../src/MenuConfig.cpp:374 +msgid "Language" +msgstr "" + +#: ../../../src/MenuConfig.cpp:375 +msgid "Show FPS" +msgstr "" + +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 +msgid "Colorblind Mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:378 +msgid "Developer Mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:379 +msgid "Subtitles" +msgstr "" + +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 +msgid "" +"Will try to store surfaces in video memory versus system memory. The effect " +"this has on performance depends on the renderer." +msgstr "" + +#: ../../../src/MenuConfig.cpp:512 +msgid "" +"Prevents screen tearing. Disable if you experience \"stuttering\" in " +"windowed mode or input lag." +msgstr "" + +#: ../../../src/MenuConfig.cpp:513 +msgid "" +"When enabled, this uses the screen DPI in addition to the window dimensions " +"to scale the rendering resolution. Otherwise, only the window dimensions are" +" used." +msgstr "" + +#: ../../../src/MenuConfig.cpp:514 +msgid "" +"This enables parallax (non-tile) layers. Disabling this setting can improve " +"performance in some cases." +msgstr "" + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:65 +msgid "Execute" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 +msgid "Developer Console" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:143 +#, c-format +msgid "Use '%s' to inspect with the cursor." +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:148 +msgid "Arguments with spaces should be enclosed with double quotes. Example:" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:149 +msgid "Type 'help' to get a list of commands." +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 +msgid "px" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:226 +msgid "Distance" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 +msgid "Entity" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 +msgid "none" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 +msgid "wall" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 +msgid "short wall / pit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:268 +msgid "entity" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:269 +msgid "entity, ally" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:276 +msgid "Tile" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:377 +msgid "adds a power to the action bar" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:378 +msgid "turns on/off the display of the FPS counter" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:379 +msgid "turns on/off all of the HUD elements" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:380 +msgid "turns on/off the developer hud" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:381 +msgid "" +"Prints a list of powers that match a search term. No search term will list " +"all items" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:382 +msgid "Prints out all the map filenames located in the \"maps/\" directory." +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:383 +msgid "" +"Prints out the active campaign statuses that match a search term. No search " +"term will list all active statuses" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:384 +msgid "" +"Prints a list of items that match a search term. No search term will list " +"all items" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:385 +msgid "" +"parses a series of event components and executes them as a single event" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:386 +msgid "clears the command history" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:387 +msgid "displays this text" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:394 +msgid "Toggled the developer hud" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:398 +msgid "Toggled the hud" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:402 +msgid "Toggled the FPS counter" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:552 +msgid "ERROR: Incorrect number of arguments" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 +msgid "HINT:" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:554 +msgid "" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:570 +#, c-format +msgid "ERROR: '%s' is not a valid event key" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:580 +msgid "ERROR: Too few arguments" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:582 +msgid "= = ..." +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:587 +msgid "ERROR: Unknown command" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:589 +msgid "HINT: Type help" +msgstr "" + +#: ../../../src/MenuEnemy.cpp:162 +#, c-format +msgid "%s level %d" +msgstr "" + +#: ../../../src/MenuEnemy.cpp:186 +msgid "Dead" +msgstr "" + +#: ../../../src/MenuEnemy.cpp:188 +msgid "Destroyed" +msgstr "" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 +#, c-format +msgid "Lost %d%% of %s." +msgstr "" + +#: ../../../src/MenuInventory.cpp:185 +#, c-format +msgid "Lost %d%% of total XP." +msgstr "" + +#: ../../../src/MenuInventory.cpp:190 +#, c-format +msgid "Lost %d%% of current level XP." +msgstr "" + +#: ../../../src/MenuInventory.cpp:216 +#, c-format +msgid "Lost %s." +msgstr "" + +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 +#, c-format +msgid "%d %s" +msgstr "" + +#: ../../../src/MenuInventory.cpp:301 +msgid "Pick up item(s):" +msgstr "" + +#: ../../../src/MenuInventory.cpp:302 +msgid "Use or equip item:" +msgstr "" + +#: ../../../src/MenuInventory.cpp:303 +#, c-format +msgid "%s modifiers" +msgstr "" + +#: ../../../src/MenuInventory.cpp:304 +msgid "Select a quantity of item:" +msgstr "" + +#: ../../../src/MenuInventory.cpp:307 +msgid "Stash item stack:" +msgstr "" + +#: ../../../src/MenuInventory.cpp:309 +msgid "Sell item stack:" +msgstr "" + +#: ../../../src/MenuInventory.cpp:576 +msgid "You don't have enough of the required item." +msgstr "" + +#: ../../../src/MenuInventory.cpp:588 +msgid "You can't use this item right now." +msgstr "" + +#: ../../../src/MenuInventory.cpp:600 +msgid "This item can only be used from the action bar." +msgstr "" + +#: ../../../src/MenuInventory.cpp:718 +msgid "Inventory is full." +msgstr "" + +#: ../../../src/MenuInventory.cpp:843 +#, c-format +msgid "Not enough %s." +msgstr "" + +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 +msgid "This item can not be sold." +msgstr "" + +#: ../../../src/MenuLog.cpp:91 +msgid "Notes" +msgstr "" + +#: ../../../src/MenuLog.cpp:92 +msgid "Quests" +msgstr "" + +#: ../../../src/MenuManager.cpp:305 +#, c-format +msgid "XP: %d/%d" +msgstr "" + +#: ../../../src/MenuManager.cpp:875 +msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" + +#: ../../../src/MenuNumPicker.cpp:59 +msgid "Enter amount:" +msgstr "" + +#: ../../../src/MenuPowers.cpp:872 +msgid "Passive" +msgstr "" + +#: ../../../src/MenuPowers.cpp:879 +#, c-format +msgid "Costs %d MP" +msgstr "" + +#: ../../../src/MenuPowers.cpp:883 +#, c-format +msgid "Costs %d HP" +msgstr "" + +#: ../../../src/MenuPowers.cpp:887 +msgid "Cooldown:" +msgstr "" + +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 +msgid "Damage per second" +msgstr "" + +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 +msgid "HP per second" +msgstr "" + +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 +msgid "MP per second" +msgstr "" + +#: ../../../src/MenuPowers.cpp:957 +msgid "Immobilize" +msgstr "" + +#: ../../../src/MenuPowers.cpp:965 +msgid "Immunity" +msgstr "" + +#: ../../../src/MenuPowers.cpp:968 +msgid "Immunity to damage over time" +msgstr "" + +#: ../../../src/MenuPowers.cpp:971 +msgid "Immunity to slow" +msgstr "" + +#: ../../../src/MenuPowers.cpp:974 +msgid "Immunity to stun" +msgstr "" + +#: ../../../src/MenuPowers.cpp:977 +msgid "Immunity to HP steal" +msgstr "" + +#: ../../../src/MenuPowers.cpp:980 +msgid "Immunity to MP steal" +msgstr "" + +#: ../../../src/MenuPowers.cpp:983 +msgid "Immunity to knockback" +msgstr "" + +#: ../../../src/MenuPowers.cpp:986 +msgid "Immunity to damage reflection" +msgstr "" + +#: ../../../src/MenuPowers.cpp:992 +msgid "Stun" +msgstr "" + +#: ../../../src/MenuPowers.cpp:995 +msgid "Automatic revive on death" +msgstr "" + +#: ../../../src/MenuPowers.cpp:998 +msgid "Convert" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1001 +msgid "Fear" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1004 +msgid "Lifespan" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1028 +msgid "Magical Shield" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1057 +msgid "Healing" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1060 +msgid "Knockback" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1084 +#, c-format +msgid "%d%% chance" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1136 +msgid "Base Accuracy" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1156 +msgid "Base Critical Chance" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1164 +msgid "Ignores Absorbtion" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1169 +msgid "Ignores Avoidance" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1174 +#, c-format +msgid "%d%% Chance to crit slowed targets" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1179 +#, c-format +msgid "Elemental Damage (%s)" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1188 +#, c-format +msgid "Requires a %s" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 +#, c-format +msgid "Requires Power: %s" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1238 +msgid "Click to Unlock (uses 1 Skill Point)" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 +msgid "Requires 1 Skill Point" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 +msgid "Next Level:" +msgstr "" + +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 +msgid "Stash is full." +msgstr "" + +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 +msgid "Trade" +msgstr "" + +#: ../../../src/MenuVendor.cpp:60 +msgid "Buyback" +msgstr "" + +#: ../../../src/MenuVendor.cpp:283 +msgid "Vendor" +msgstr "" + +#: ../../../src/PowerManager.cpp:1208 +#, c-format +msgid "+%d Shield" +msgstr "" + +#: ../../../src/PowerManager.cpp:1465 +msgid "You are already transformed, untransform first." +msgstr "" + +#: ../../../src/PowerManager.cpp:1477 +msgid "Could not untransform at this position." +msgstr "" + +#: ../../../src/QuestLog.cpp:234 +msgid "Completed Quests" +msgstr "" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 +msgid "Game saved." +msgstr "" + +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 +msgid "Backspace" +msgstr "" + +#: ../../../src/SDLInputState.cpp:674 +msgid "CapsLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:678 +msgid "Escape" +msgstr "" + +#: ../../../src/SDLInputState.cpp:680 +msgid "Insert" +msgstr "" + +#: ../../../src/SDLInputState.cpp:681 +msgid "Left Alt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:682 +msgid "Left Ctrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:684 +msgid "Left Shift" +msgstr "" + +#: ../../../src/SDLInputState.cpp:685 +msgid "NumLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:686 +msgid "PageDown" +msgstr "" + +#: ../../../src/SDLInputState.cpp:687 +msgid "PageUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:689 +msgid "PrintScreen" +msgstr "" + +#: ../../../src/SDLInputState.cpp:690 +msgid "Right Alt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:691 +msgid "Right Ctrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:692 +msgid "Return" +msgstr "" + +#: ../../../src/SDLInputState.cpp:694 +msgid "Right Shift" +msgstr "" + +#: ../../../src/SDLInputState.cpp:695 +msgid "ScrollLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:696 +msgid "Space" +msgstr "" + +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 +#, c-format +msgid "Mouse %d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 +#, c-format +msgid "Axis %d -" +msgstr "" + +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 +#, c-format +msgid "Axis %d +" +msgstr "" + +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 +#, c-format +msgid "Button %d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:787 +msgid "Touch control D-Pad" +msgstr "" + +#: ../../../src/SDLInputState.cpp:810 +msgid "Touch control buttons" +msgstr "" + +#: ../../../src/SDLInputState.cpp:824 +msgid "Tap" +msgstr "" + +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 +#, c-format +msgid "'%s' is no longer bound to:" +msgstr "" + +#: ../../../src/Stats.cpp:38 +msgid "Max HP" +msgstr "" + +#: ../../../src/Stats.cpp:39 +msgid "Total amount of HP." +msgstr "" + +#: ../../../src/Stats.cpp:43 +msgid "HP Regen" +msgstr "" + +#: ../../../src/Stats.cpp:44 +msgid "Ticks of HP regen per minute." +msgstr "" + +#: ../../../src/Stats.cpp:48 +msgid "Max MP" +msgstr "" + +#: ../../../src/Stats.cpp:49 +msgid "Total amount of MP." +msgstr "" + +#: ../../../src/Stats.cpp:53 +msgid "MP Regen" +msgstr "" + +#: ../../../src/Stats.cpp:54 +msgid "Ticks of MP regen per minute." +msgstr "" + +#: ../../../src/Stats.cpp:58 +msgid "Accuracy" +msgstr "" + +#: ../../../src/Stats.cpp:59 +msgid "" +"Accuracy rating. The enemy's Avoidance rating is subtracted from this value " +"to calculate your likeliness to land a direct hit." +msgstr "" + +#: ../../../src/Stats.cpp:63 +msgid "Avoidance" +msgstr "" + +#: ../../../src/Stats.cpp:64 +msgid "" +"Avoidance rating. This value is subtracted from the enemy's Accuracy rating " +"to calculate their likeliness to land a direct hit." +msgstr "" + +#: ../../../src/Stats.cpp:68 +msgid "Absorb Min" +msgstr "" + +#: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 +msgid "Reduces the amount of damage taken." +msgstr "" + +#: ../../../src/Stats.cpp:73 +msgid "Absorb Max" +msgstr "" + +#: ../../../src/Stats.cpp:78 +msgid "Critical Hit Chance" +msgstr "" + +#: ../../../src/Stats.cpp:79 +msgid "Chance for an attack to do extra damage." +msgstr "" + +#: ../../../src/Stats.cpp:83 +msgid "Bonus XP" +msgstr "" + +#: ../../../src/Stats.cpp:84 +msgid "Increases the XP gained per kill." +msgstr "" + +#: ../../../src/Stats.cpp:88 +#, c-format +msgid "Bonus %s" +msgstr "" + +#: ../../../src/Stats.cpp:89 +#, c-format +msgid "Increases the %s found per drop." +msgstr "" + +#: ../../../src/Stats.cpp:93 +msgid "Item Find Chance" +msgstr "" + +#: ../../../src/Stats.cpp:94 +msgid "Increases the chance that an enemy will drop an item." +msgstr "" + +#: ../../../src/Stats.cpp:98 +msgid "Stealth" +msgstr "" + +#: ../../../src/Stats.cpp:99 +msgid "Increases your ability to move undetected." +msgstr "" + +#: ../../../src/Stats.cpp:103 +msgid "Poise" +msgstr "" + +#: ../../../src/Stats.cpp:104 +msgid "Reduces your chance of stumbling when hit." +msgstr "" + +#: ../../../src/Stats.cpp:108 +msgid "Missile Reflect Chance" +msgstr "" + +#: ../../../src/Stats.cpp:109 +msgid "Increases your chance of reflecting missiles back at enemies." +msgstr "" + +#: ../../../src/Stats.cpp:113 +msgid "Damage Reflection" +msgstr "" + +#: ../../../src/Stats.cpp:114 +msgid "Deals a percentage of damage taken back to the attacker." +msgstr "" + +#: ../../../src/Stats.cpp:118 +msgid "HP Steal" +msgstr "" + +#: ../../../src/Stats.cpp:119 +msgid "Percentage of HP stolen per hit." +msgstr "" + +#: ../../../src/Stats.cpp:123 +msgid "MP Steal" +msgstr "" + +#: ../../../src/Stats.cpp:124 +msgid "Percentage of MP stolen per hit." +msgstr "" + +#: ../../../src/Stats.cpp:128 +msgid "Base HP" +msgstr "" + +#: ../../../src/Stats.cpp:133 +msgid "Base MP" +msgstr "" + +#: ../../../src/Utils.cpp:365 +msgid "k" +msgstr "" + +#: ../../../src/Utils.cpp:635 +#, c-format +msgid "%s second" +msgstr "" + +#: ../../../src/Utils.cpp:638 +#, c-format +msgid "%s seconds" +msgstr "" + +#: ../../../src/Version.cpp:139 +msgid "or newer" +msgstr "" + +#: ../../../src/Version.cpp:142 +msgid "or older" +msgstr "" diff --git a/mods/default/languages/engine.fi.po b/mods/default/languages/engine.fi.po index 019a224..8faae10 100644 --- a/mods/default/languages/engine.fi.po +++ b/mods/default/languages/engine.fi.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Justin Jacobs , 2018\n" "Language-Team: Finnish (https://www.transifex.com/flareorg/teams/84925/fi/)\n" @@ -21,74 +21,83 @@ "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Onnittelut, olet päässyt tasolle %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Voit nostaa yhtä kyvyistäsi hahmovalikossa." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Saat %d %s" + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Saat %s x%d" + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Hallussasi on nyt %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Saat %s x%d" - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Saat %d %s" - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Saat %d kokemusta." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Osumapisteet palautuneet." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Mentaalipisteet palautuneet." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "OP ja MP palautuneet." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Haitalliset vaikutukset poistuneet." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "OP ja MP palautuneet ja haitalliset vaikutukset poistuneet." @@ -106,974 +115,1142 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Seikkailija" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "ohi" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d OP" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d MP" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Tuntematon määränpää" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Ladataan..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Poista tallennus" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Poistetaanko tallennus?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Palaa päävalikkoon" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Uusi peli" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Valitse ura" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Salli tarinamodin jatkaa" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Lataa peli" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Saavutaan pelimaailmaan..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Ladataan tallennettu peli..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Taso %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Peru" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Aloita" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Valitse muotokuva" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Valitse nimi" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Lopullinen kuolema?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Valitse luokka" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Pelaa" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Salli ydinmodin jatkaa" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Asetukset" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Lopeta peli" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Hyväksy" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Ylös" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Alas" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Vasen" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Oikea" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Hahmo" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Tavaraluettelo" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Voimat" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Loki" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Vaihto" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Vaimennus: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Vaimennus: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Vaatii tason %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Ostohinta: %d kultaa" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Ostohinta: á %d kultaa" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Myyntihinta: %d kultaa" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Myyntihinta: á %d kultaa" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Nimi" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Taso" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Kokemus: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Seuraava: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "perus (%d), lisä (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Oletukset" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Palauta KAIKKI asetukset?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "OK" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Peru" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Poistu" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Video" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Audio" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Käyttöliittymä" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Ohjaus" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Näppäimet" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Modit" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Täysi ruutu" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Hardware surfaces" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Salli gamma-muutokset" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "äänenvoimakkuus" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Musiikin voimakkuus" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "äänenvoimakkuus" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Kieli" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Näytä päivitystaso (FPS)" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Käytössäolevat modit" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Saatavilla olevat modit" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Poista käytöstä" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Ota käyttöön >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Video" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Ohjaus" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Näppäimet" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Näytä taisteluteksti" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Peliohjain" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Liikuta sankaria hiirellä" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Hiiritähtäys" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Kokeellinen" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Täysi ruutu" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Liikuta sankaria hiirellä" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Hardware surfaces" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Salli gamma-muutokset" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Käytä peliohjainta" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Peliohjain" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Hiiritähtäys" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Ladataan..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Poista tallennus" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Poistetaanko tallennus?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Palaa päävalikkoon" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Uusi peli" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Valitse ura" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Salli tarinamodin jatkaa" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Lataa peli" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Saavutaan pelimaailmaan..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Ladataan tallennettu peli..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Taso %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Aloita" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Valitse muotokuva" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Valitse nimi" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Lopullinen kuolema?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Valitse luokka" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Pelaa" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Salli ydinmodin jatkaa" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Asetukset" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Lopeta peli" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Hyväksy" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Ylös" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Alas" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Vasen" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Oikea" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Hahmo" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Tavaraluettelo" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Voimat" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Loki" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Vaihto" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Vaimennus: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Vaimennus: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Vaatii tason %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Ostohinta: %d kultaa" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Ostohinta: á %d kultaa" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Myyntihinta: %d kultaa" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Myyntihinta: á %d kultaa" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Näytä taisteluteksti" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Nimi" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Taso" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Kokemus: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Seuraava: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "perus (%d), lisä (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Käytössäolevat modit" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Saatavilla olevat modit" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Poista käytöstä" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Ota käyttöön >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s taso %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Kuollut" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Poistu" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "" -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "" -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Tätä tavaraa voit käyttää vain toimintapalkista." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Tavaraluettelo on täynnä." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "" -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "" @@ -1085,214 +1262,259 @@ msgid "Quests" msgstr "Etsinnät" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Kokemus: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Kustannus %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Kustannus %d OP" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Vaatii voiman: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Jaettu kätkö" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Tee kaupat" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Takaisinosto" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Kauppias" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d kilpi" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Olet jo muuntunut, palaa ensin entisellesi." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1300,132 +1522,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "" -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1584,16 +1899,16 @@ msgid "Base MP" msgstr "" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "" diff --git a/mods/default/languages/engine.fr.po b/mods/default/languages/engine.fr.po index d8643dd..e94317f 100644 --- a/mods/default/languages/engine.fr.po +++ b/mods/default/languages/engine.fr.po @@ -5,15 +5,17 @@ # # Translators: # Justin Jacobs , 2018 +# syl_, 2019 +# Christophe Nemo , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Justin Jacobs , 2018\n" +"Last-Translator: Christophe Nemo , 2020\n" "Language-Team: French (https://www.transifex.com/flareorg/teams/84925/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,74 +23,84 @@ "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Votre santé est basse !" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Félicitations, vous avez atteint le niveau %d !" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Vous pouvez améliorer un attribut via le menu Personnage." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" +"Vous pouvez améliorer un ou plusieurs attributs via le menu Personnage." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Vous pouvez débloquer une ou plusieurs capacités via le menu Pouvoirs" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "Transformation expirée. On vous a ramené à un endroit sûr." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s supprimé." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "%s x%d supprimés." + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s supprimé." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Vous recevez %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Vous recevez %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Vous recevez %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Vous recevez %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Vous recevez %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Vous recevez %d points d'expérience." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "PV restaurés." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "PM restaurés." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "PV et PM restaurés." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Effet négatif supprimé" -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "PV et PM restaurés, effet négatif supprimé" @@ -98,6 +110,9 @@ "\n" "Often slower, but less likely to have issues." msgstr "" +"Rendu SDL logiciel\n" +"\n" +"Souvent plus lent, mais plus stable." #: ../../../src/DeviceList.cpp:59 msgid "" @@ -105,803 +120,1035 @@ "\n" "The default renderer that is often faster than the SDL software renderer." msgstr "" - -#: ../../../src/EngineSettings.cpp:561 +"Rendu SDL matériel\n" +"\n" +"Le rendu par défaut souvent plus rapide que le rendu SDL logiciel." + +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Aventurier" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "manqué" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d PV" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d PM" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Destination inconnue" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Chargement..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Suppr. sauvegarde" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Supprimer cette sauvegarde ?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Retour au menu" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nouvelle partie" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Choisir une partie" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Activez un mod scénario pour continuer" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Charger la partie" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Entrée dans le monde du jeu..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Chargement d'une partie..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Sauvegarde invalide" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Niveau %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Annuler" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Créer" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Aléatoire" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Choisissez un portrait" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Choisissez un nom" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Mort permanente ? " + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Choisissez une classe" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Jouer" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Activez un mod de base pour continuer" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Configuration" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Crédits" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Quitter" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Accepter" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Haut" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Bas" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Gauche" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Droite" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Emplacement 1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Emplacement 2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Emplacement 3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Emplacement 4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Emplacement 5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Emplacement 6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Emplacement 7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Emplacement 8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Emplacement 9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Emplacement 0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Personnage" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventaire" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Pouvoirs" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Journal" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Principal 1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Principal 2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Maj" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Supprimer" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Barre d'action Accepter" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Barre d'action Gauche" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Barre d'action Droite" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Barre d'action Utiliser" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menu développeur" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Clic gauche" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Clic molette" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Clic droit" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Molette haut" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Molette bas" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Souris X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Souris X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Objet inconnu" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Vitesse" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%%Vitesse d'attaque" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Résistance (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Nécessite %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Objet de quête" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Qualité : %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorbe : %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorbe : %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Nécessite le niveau %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Nécessite %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Classe nécessaire : %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Prix d'achat : %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Prix d'achat : %d %s par pièce" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Prix de vente : %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Prix de vente : %d %s par pièce" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Ensemble :" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%dobjets :" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Appuyer sur [%s] pour lire" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Appuyer sur [%s] pour utiliser" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Touche : %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Pas assez de PM." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Restants :" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%dpiles d'objets" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Nom" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Niveau" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Réduit la quantité de dégât reçue des attaques élémentaires \"%s\"." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "XP : %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Prochain : %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "base (%d), bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Statistiques liées : " + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Chaque niveau donne %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Chaque point de %s donne %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Effacer" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Assigner :" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Par défaut" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Réinitaliser TOUS les réglages ?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "OK" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Annuler" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Continuer" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "Sauvegarder la partie" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Défaut" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Montrer toutes les infobulles de butin, sauf celles qui pourraient être " +"masquées par le joueur ou un ennemi. Afficher toutes les infobulles de butin" +" temporairement avec la touche 'Alt'." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Afficher tout" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Toujours montrer les infobulles de butin. Cacher temporairement les " +"infobulles de butin avec la touche 'Alt'." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Caché" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Toujours masquer les infobulles de butin, sauf lorsqu'une pièce du butin est" +" survolée par la souris. Montrer temporairement toutes les infobulles de " +"butin avec la touche 'Alt'." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Visible" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Visible (zoom x2)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Contrôle le type d'alerte activée lorsque la santé du joueur est sous le " +"seuil de santé bas." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Afficher un message" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Jouer un son" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Changer le curseur" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Désactivé" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Tout" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Message & Curseur" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Message & Son" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Son & Curseur" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Message" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Curseur" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Son" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Lorsque la santé du joueur tombe en dessous du seuil donné, les " +"notifications de santé basse sont déclenchées si au moins l'une d'entre " +"elles est activée." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Quitter" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Vidéo" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Audio" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interface" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Entrée" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Commandes" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "En pause" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Temps de jeu" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Rendu" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Mode plein écran" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Surfaces matérielles" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "V-Sync" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Filtrage de textures" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Echelonnage DPI" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Couches parallax" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Régler le gamma" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Volume des sons" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Volume de la musique" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Volume des sons" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Langues" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Afficher les FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Curseur matériel" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Mode daltonien" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Mode développeur" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Mods actifs" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Mods disponibles" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Désactiver" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Activer >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Effacer" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Vidéo" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Entrée" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Commandes" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +msgstr "Sous-titres" + +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Visibilité infobulle butin" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Mode mini-carte" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Toujours montrer les étiquettes de la barre de statistiques" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Autorise le masquage auto de la barre de statut" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Afficher le texte des combats" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Équiper automatiquement les objets" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Montre les marqueurs d'entité cachés" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Notification de santé basse" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Seuil de santé basse" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Manette" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Déplacement du héro à la souris" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Visée à la souris" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Ne pas utiliser la souris" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Inverser les boutons de mouvement de la souris" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Attaquer avec les mouvement de la souris" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Zone morte du joystick" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Affectation principale : %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Affectation secondaire : %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Affectation de la manette : %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:189 +"Tentera de stocker les surfaces dans la mémoire vidéo plutôt que la mémoire " +"du système. L'effet sur les performances dépend de la carte vidéo." + +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:190 +"Evite l'apparition de déchirement d'écran. A désactiver si vous subissez des" +" 'bégaiements' en mode fenêtré ou des retards de saisie. " + +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:191 +"Si activé, utilise le DPI de votre écran en plus de la taille de la fenêtre " +"pour échelonner la résolution de rendu. Autrement, seule les dimensions de " +"la fenêtre sont utilisées." + +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Expérimental" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Pour les terminaux portables" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Mode plein écran" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Déplacement du héro à la souris" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Hardware surfaces" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "V-Sync" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Filtrage de textures" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Régler le gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Utiliser une manette" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Manette" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Visée à la souris" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Chargement..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Suppr. sauvegarde" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Supprimer cette sauvegarde ?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Retour au menu" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nouvelle partie" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Choisir une partie" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Activez un mod scenario pour continuer" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Charger la partie" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Entrée dans le monde du jeu..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Chargement d'une partie..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Niveau %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Créer" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Choisissez un portrait" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Choisissez un nom" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Mort permanente ? " - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Choisir une classe" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Jouer" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Activez un mod de base pour continuer" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Configuration" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Crédits" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Quitter" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Accepter" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Haut" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Bas" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Gauche" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Droite" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Emplacement 1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Emplacement 2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Emplacement 3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Emplacement 4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Emplacement 5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Emplacement 6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Emplacement 7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Emplacement 8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Emplacement 9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Emplacement 0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Personnage" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventaire" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Pouvoirs" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Journal" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Principal 1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Principal 2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Maj" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Supprimer" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Barre d'action Gauche" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Barre d'action Droite" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Utilisation de la barre d'action" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menu du développeur" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Clic gauche" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Clic molette" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Objet inconnu" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Qualité: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorbe : %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorbe : %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Nécessite le niveau %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Prix d'achat : %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Prix d'achat : %d %s par pièce" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Prix de vente : %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Prix de vente : %d %s par pièce" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Toujours montrer les étiquettes de la bare de statistiques" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Afficher le texte des combats" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Touche: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Nom" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Niveau" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "XP : %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Prochain : %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "base (%d), bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Statistiques liées: " - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +"Active les couches parallax. La désactivation de cette option peut améliorer" +" les performances dans certains cas." + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Active le réglage ci-dessous qui contrôle le niveau gamma de l'écran. Le " +"comportement du paramètre gamma peut varier selon les plateformes." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Fournit du texte supplémentaire aux informations principalement transmises " +"par la couleur." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Certains mods cachent automatiquement les barres de statistiques quand ils " +"sont inactifs. Désactiver cette option les affichera en permanence." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"En activant cette option, les emplacements d'équipement vides seront remplis" +" des objets adéquats obtenus." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Place un marqueur au-dessus des ennemis, des alliés et du joueur lorsqu'ils " +"sont masqués par de grands objets." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" +"Cela permet au jeu d'être entièrement contrôlé via le clavier (ou le " +"joystick)." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Lorsque 'Déplacer le héros à la souris' est activé, ce paramètre contrôle si" +" 'Principal1' ou 'Principal2' est utilisé pour déplacer le héros. S'il est " +"activé, 'Principal2' déplacera le héros à la place de 'Principal1'." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Si 'Déplacer le héros avec la souris' est activé, ce paramètre contrôle si " +"la Pouvoir assigné au bouton de mouvement peut être utilisé pour cibler un " +"ennemi. S'il est désactivé, il est nécessaire d'utiliser la touche 'Shift' " +"pour activer le Pouvoir assigné au bouton de mouvement." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"L'attaque du joueur sera dirigée dans la direction du curseur de la souris " +"si ce paramètre est activé." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Mods actifs" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Mods disponibles" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Désactiver" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Activer >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Version :" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Jeu :" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Version du moteur :" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Mods nécessaires :" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(rien)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Sauvegarder & Quitter" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Éxécuter" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Console de développement" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:146 +msgstr "Utilisez '%s' pour inspecter avec le curseur." + +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Les arguments contenants des espaces devraient être mis entre guillemets. " "Exemple :" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +msgstr "Tapez 'help' pour obtenir une liste des commandes." + +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:224 +msgstr "px" + +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +msgstr "Distance" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +msgstr "Entité" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +msgstr "aucun" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +msgstr "mur" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:266 +msgstr "petit mur / fossé" + +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:267 +msgstr "entité" + +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:274 +msgstr "entité, allié" + +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:360 +msgstr "Tuile" + +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:361 +msgstr "ajoute un pouvoir à la barre d'action" + +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:362 +msgstr "allume ou éteint l'affichage du compteur de FPS" + +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "Activer/Désactiver tous les éléments de l'affichage HUD" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "Activer/Désactiver l'affichage HUD" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" - -#: ../../../src/MenuDevConsole.cpp:365 +"Imprime une liste des pouvoirs correspondant au terme recherché. Sans terme " +"recherché, affiche tous les objets." + +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:366 +msgstr "Imprime tous les fichiers cartes situés dans le répertoire \"/maps\"." + +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -910,7 +1157,7 @@ "recherché. L'absence de terme de recherche affichera la liste de tous les " "états actifs" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -918,173 +1165,157 @@ "Affiche une liste des objets qui correspondent au terme recherché. L'absence" " de terme de recherche affichera tous les objets" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "parcourt une série de composants d'événements et les exécutent en tant " "qu'événement unique" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "Effacer l'historique de commandes" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "affiche ce texte" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Affichage HUD développeur basculé" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Affichage HUD basculé" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:534 +msgstr "Alterne le compteur FPS" + +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +msgstr "ERREUR : nombre d'arguments incorrect" + +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 +msgstr "SUGGESTION :" + +#: ../../../src/MenuDevConsole.cpp:554 msgid "" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:552 +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" -msgstr "ERREUR: '%s' n'est pas une clé d'évènement valide" - -#: ../../../src/MenuDevConsole.cpp:562 +msgstr "ERREUR : '%s' n'est pas une clé d'évènement valide" + +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" -msgstr "ERREUR: Trop peu d'arguments" - -#: ../../../src/MenuDevConsole.cpp:564 +msgstr "ERREUR : Trop peu d'arguments" + +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:569 +msgstr "= = ..." + +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" -msgstr "ERREUR: Commande inconnue" - -#: ../../../src/MenuDevConsole.cpp:571 +msgstr "ERREUR : Commande inconnue" + +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "SUGGESTION : tapez help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s niveau %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Mort" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" -msgstr "" - -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "En pause" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Sauvegarder & Quitter" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Quitter" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Continuer" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Équiper automatiquement les objets" - -#: ../../../src/MenuInventory.cpp:188 +msgstr "Détruit" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:195 +msgstr "Perte %d %% de %s." + +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:200 +msgstr "Perte de %d %% des XP totaux." + +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:226 +msgstr "Perte de %d %% du niveau d'XP actuel." + +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Perdu %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" -msgstr "Rammaser les objet(s):" - -#: ../../../src/MenuInventory.cpp:318 +msgstr "Ramasser les objet(s) :" + +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" -msgstr "Utilisez ou équipez un objet:" - -#: ../../../src/MenuInventory.cpp:319 +msgstr "Utiliser ou équiper un objet :" + +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" -msgstr "modificateurs de %s" - -#: ../../../src/MenuInventory.cpp:320 +msgstr "Modificateurs de %s" + +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" -msgstr "Sélectionnez une quantitée d'objet:" - -#: ../../../src/MenuInventory.cpp:323 +msgstr "Sélectionner une quantité d'objet :" + +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Mettre au coffre la pile d'objets :" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Vendre la pile d'objets :" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Vous n'avez pas l'objet nécessaire en quantité suffisante." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." -msgstr "" - -#: ../../../src/MenuInventory.cpp:611 +msgstr "Vous ne pouvez pas utiliser cet objet maintenant." + +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Cet objet ne peut être utilisé que depuis la barre d'action." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "L'inventaire est complet." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +msgstr "Pas assez de %s." + +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." -msgstr "" +msgstr "Cet objet ne peut pas être vendu." #: ../../../src/MenuLog.cpp:91 msgid "Notes" @@ -1094,414 +1325,556 @@ msgid "Quests" msgstr "Quêtes" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" -msgstr "XP: %d/%d" - -#: ../../../src/MenuManager.cpp:827 +msgstr "XP : %d/%d" + +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "Cet objet ne peut pas être abandonné." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Saisir la quantité :" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" -msgstr "" - -#: ../../../src/MenuPowers.cpp:792 +msgstr "Passif" + +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Consomme %d PM" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Consomme %d PV" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" -msgstr "" - -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +msgstr "Rechargement :" + +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" -msgstr "Dommages par secondes" - -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +msgstr "Dégâts par seconde" + +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "PV par seconde" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "PM par seconde" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Immobilise" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Immunité" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Immunité aux dommages progressifs" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Immunité à la lenteur" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Immunité à l'étourdissement" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Immunité au vol de PV" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Immunité au vol de PM" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Immunité au recul" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Immunité au renvoi de dommage" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Étourdissement" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Résurection automatique lors de la mort" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Convertir" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Peur" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Durée de vie" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Bouclier magique" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Soin" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Recul" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1082 +msgstr "Précision de base" + +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Chance criticales de base" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" -msgstr "Ignore l'Absorption" - -#: ../../../src/MenuPowers.cpp:1095 +msgstr "Ignore l'absorption" + +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1100 +msgstr "Ignore l'esquive" + +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% chances de coup critique sur les cibles lentes" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1114 +msgstr "Dégâts élémentaires (%s)" + +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +msgstr "Nécessite un(e) %s" + +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" -msgstr "Nécessite le pouvoir: %s" - -#: ../../../src/MenuPowers.cpp:1163 +msgstr "Nécessite le pouvoir : %s" + +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Cliquez pour débloquer (utilise 1 point de compétence)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +msgstr "Nécessite 1 point de compétence" + +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" -msgstr "" - -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Coffre commun" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Impossible de stocker l'objet d'une quête dans le coffre." - -#: ../../../src/MenuStash.cpp:219 +msgstr "Niveau suivant :" + +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Coffre" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "Privé" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "Partagé" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Cet objet ne peut pas être placé dans le coffre." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Cet objet ne peut pas être placé dans le coffre privé." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "Cet objet ne peut pas être placé dans le coffre partagé." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." -msgstr "" - -#: ../../../src/MenuTalker.cpp:454 +msgstr "le coffre est complet." + +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Impossible de placer l'objet dans le coffre : %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Commercer" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Racheter" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Vendeur" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "Bouclier +%d" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Vous êtes deja transformé, reprenez forme humaine avant." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Vous ne pouvez pas reprendre forme humaine à cette position." #: ../../../src/QuestLog.cpp:234 msgid "Completed Quests" -msgstr "" - -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +msgstr "Quêtes terminées" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Jeu sauvegardé." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "RetArr" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "Maj" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "Suppr" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "Fin" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "Ech" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Orig" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "Ins" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "AltG" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "CtrlG" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "ShfG" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "Num" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "PgDn" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "PgUp" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "Imp" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "AltD" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "CtrlD" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "Ret" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "ShfD" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "ArrDefil" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "Esp" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" -msgstr "" - -#: ../../../src/SDLInputState.cpp:583 +msgstr "Retour arrière" + +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +msgstr "Verr Maj" + +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" -msgstr "" - -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +msgstr "Échap" + +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" -msgstr "" - -#: ../../../src/SDLInputState.cpp:590 +msgstr "Inser" + +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:591 +msgstr "Alt gauche" + +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:593 +msgstr "Ctrl gauche" + +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:594 +msgstr "Maj gauche" + +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:595 +msgstr "Ver Num" + +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" -msgstr "" - -#: ../../../src/SDLInputState.cpp:596 +msgstr "PgSuiv" + +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" -msgstr "" - -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +msgstr "PgPréc" + +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" -msgstr "" - -#: ../../../src/SDLInputState.cpp:599 +msgstr "Impr Écran" + +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:600 +msgstr "Alt droit" + +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:601 +msgstr "Ctrl droit" + +#: ../../../src/SDLInputState.cpp:692 msgid "Return" -msgstr "" - -#: ../../../src/SDLInputState.cpp:603 +msgstr "Entrée" + +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:604 +msgstr "Maj droit" + +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:605 +msgstr "Arrêt défil" + +#: ../../../src/SDLInputState.cpp:696 msgid "Space" -msgstr "" - -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +msgstr "Espace" + +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "M%d" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" -msgstr "" - -#: ../../../src/SDLInputState.cpp:628 +msgstr "Souris %d" + +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "JX%d-" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Axe %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "JX%d+" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Axe %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "JB%d" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Bouton %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(rien)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" -msgstr "" - -#: ../../../src/SDLInputState.cpp:701 +msgstr "Touch control D-Pad" + +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" -msgstr "" - -#: ../../../src/SDLInputState.cpp:716 +msgstr "Touch control buttons" + +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Touchez" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Impossible d'affecter : %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" -msgstr "" +msgstr "'%s' n'est plus assigné à :" #: ../../../src/Stats.cpp:38 msgid "Max HP" -msgstr "" +msgstr "PV max" #: ../../../src/Stats.cpp:39 msgid "Total amount of HP." -msgstr "" +msgstr "Nombre total de PV." #: ../../../src/Stats.cpp:43 msgid "HP Regen" -msgstr "" +msgstr "Régénération PV" #: ../../../src/Stats.cpp:44 msgid "Ticks of HP regen per minute." -msgstr "Quantité de PV regénérés par minute." +msgstr "Quantité de PV régénérés par minute." #: ../../../src/Stats.cpp:48 msgid "Max MP" -msgstr "" +msgstr "PM max" #: ../../../src/Stats.cpp:49 msgid "Total amount of MP." -msgstr "" +msgstr "Nombre total de PM." #: ../../../src/Stats.cpp:53 msgid "MP Regen" -msgstr "" +msgstr "Régénération PM" #: ../../../src/Stats.cpp:54 msgid "Ticks of MP regen per minute." -msgstr "Quanité de PM regénérés par minute." +msgstr "Quantité de PM régénérés par minute." #: ../../../src/Stats.cpp:58 msgid "Accuracy" -msgstr "" +msgstr "Précision" #: ../../../src/Stats.cpp:59 msgid "" "Accuracy rating. The enemy's Avoidance rating is subtracted from this value " "to calculate your likeliness to land a direct hit." msgstr "" +"Score de précision. Le score d'esquive de l'ennemi est soustrait à cette " +"valeur pour calculer votre probabilité de porter un coup direct." #: ../../../src/Stats.cpp:63 msgid "Avoidance" -msgstr "" +msgstr "Esquive" #: ../../../src/Stats.cpp:64 msgid "" "Avoidance rating. This value is subtracted from the enemy's Accuracy rating " "to calculate their likeliness to land a direct hit." msgstr "" +"Score d'esquive. Cette valeur est soustraite au score de précision de " +"l'ennemi pour calculer sa probabilité de porter un coup direct." #: ../../../src/Stats.cpp:68 msgid "Absorb Min" -msgstr "" +msgstr "Absorption min" #: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 msgid "Reduces the amount of damage taken." -msgstr "" +msgstr "Réduit la quantité de dégât reçue." #: ../../../src/Stats.cpp:73 msgid "Absorb Max" -msgstr "" +msgstr "Absorption max" #: ../../../src/Stats.cpp:78 msgid "Critical Hit Chance" @@ -1509,49 +1882,49 @@ #: ../../../src/Stats.cpp:79 msgid "Chance for an attack to do extra damage." -msgstr "" +msgstr "Chance pour une attaque de faire des dégâts supplémentaires." #: ../../../src/Stats.cpp:83 msgid "Bonus XP" -msgstr "" +msgstr "Bonus XP" #: ../../../src/Stats.cpp:84 msgid "Increases the XP gained per kill." -msgstr "" +msgstr "Augmente l'XP gagnée pour chaque mort." #: ../../../src/Stats.cpp:88 #, c-format msgid "Bonus %s" -msgstr "" +msgstr "Bonus %s" #: ../../../src/Stats.cpp:89 #, c-format msgid "Increases the %s found per drop." -msgstr "" +msgstr "Augmente %s trouvé dans chaque butin." #: ../../../src/Stats.cpp:93 msgid "Item Find Chance" -msgstr "" +msgstr "Chance de trouver un objet" #: ../../../src/Stats.cpp:94 msgid "Increases the chance that an enemy will drop an item." -msgstr "" +msgstr "Augmente les chances qu'un ennemi laisse un objet." #: ../../../src/Stats.cpp:98 msgid "Stealth" -msgstr "" +msgstr "Furtivité" #: ../../../src/Stats.cpp:99 msgid "Increases your ability to move undetected." -msgstr "" +msgstr "Augmente votre capacité à vous déplacer sans être détecté." #: ../../../src/Stats.cpp:103 msgid "Poise" -msgstr "" +msgstr "Équilibre" #: ../../../src/Stats.cpp:104 msgid "Reduces your chance of stumbling when hit." -msgstr "" +msgstr "Réduit vos risques de trébucher quand vous êtes touché." #: ../../../src/Stats.cpp:108 msgid "Missile Reflect Chance" @@ -1563,7 +1936,7 @@ #: ../../../src/Stats.cpp:113 msgid "Damage Reflection" -msgstr "Renvoi de Dommages" +msgstr "Renvoi de dégâts" #: ../../../src/Stats.cpp:114 msgid "Deals a percentage of damage taken back to the attacker." @@ -1571,19 +1944,19 @@ #: ../../../src/Stats.cpp:118 msgid "HP Steal" -msgstr "" +msgstr "Vol de PV" #: ../../../src/Stats.cpp:119 msgid "Percentage of HP stolen per hit." -msgstr "" +msgstr "Pourcentage de PV volé par coup." #: ../../../src/Stats.cpp:123 msgid "MP Steal" -msgstr "" +msgstr "Vol de PM" #: ../../../src/Stats.cpp:124 msgid "Percentage of MP stolen per hit." -msgstr "" +msgstr "Pourcentage de PM volé par coup." #: ../../../src/Stats.cpp:128 msgid "Base HP" @@ -1593,24 +1966,24 @@ msgid "Base MP" msgstr "PM de base" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" -msgstr "" - -#: ../../../src/Utils.cpp:580 +msgstr "k" + +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" -msgstr "" - -#: ../../../src/Utils.cpp:583 +msgstr "%s seconde" + +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" -msgstr "" +msgstr "%s secondes" #: ../../../src/Version.cpp:139 msgid "or newer" -msgstr "" +msgstr "ou plus récent" #: ../../../src/Version.cpp:142 msgid "or older" -msgstr "" +msgstr "ou plus ancien" diff --git a/mods/default/languages/engine.gd.po b/mods/default/languages/engine.gd.po index cea748e..42b81d3 100644 --- a/mods/default/languages/engine.gd.po +++ b/mods/default/languages/engine.gd.po @@ -5,16 +5,16 @@ # # Translators: # Justin Jacobs , 2018 -# GunChleoc, 2018 +# GunChleoc, 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: GunChleoc, 2018\n" +"Last-Translator: GunChleoc, 2020\n" "Language-Team: Gaelic, Scottish (https://www.transifex.com/flareorg/teams/84925/gd/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,77 +22,87 @@ "Language: gd\n" "Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Tha droch-shlàinte ort!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Meal do naidheachd, ràinig thu leibheil %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Faodaidh tu buadh àrdachadh air clàr-taice a’ phearsa." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Chaidh do ruaig. Crìoch a’ gheama! ${INPUT_CONTINUE} gus fàgail gun tiotal." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Chaidh do ruaig. ${INPUT_CONTINUE} gus leantainn air adhart." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Faodaidh tu buadh no dhà àrdachadh air clàr-taice a’ phearsa." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" +"Faodaidh tu a’ ghlas a thoirt far comas no dhà air clàr-taice nan " +"cumhachdan." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" "Dh’fhalbh an ùine air a’ chruth-atharrachadh. Chaidh do ghluasad air ais gu " "ionad sàbhailte." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "Chaidh %d %s a thoirt air falbh." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "Chaidh %s x%d a thoirt air falbh." + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "Chaidh %s a thoirt air falbh." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Fhuair thu %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Fhuair thu %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Fhuair thu %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Fhuair thu %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Fhuair thu %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Fhuair thu %d puing-eòlais." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Chaidh puingean-beatha a leigheas." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Chaidh puingean-gluasaid a leigheas." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "Chaidh puingean-beatha is puingean-gluasaid a leigheas." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Chaidh èifeachdan dona a thoirt air falbh." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "" "Chaidh puingean-beatha is puingean-gluasaid a leigheas is èifeachdan dona a " @@ -118,150 +128,785 @@ "\n" "An t-inneal-reandaraidh tùsail a bhios nas luaithe mar as trice na an t-inneal-reandaraidh bathair-bhog SDL." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Baoghlair" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "mì-amais" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d puingean-beatha" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d puingean-gluasaid" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Ceann-uidhe neo-aithnichte" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "’Ga luchdadh…" + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Sguab às" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "An sguab sinn an geama às?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Fàg gun tiotal" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Geama ùr" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Tagh slot" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Cuir tuilleadan sgeulachd an comas gus leantainn air adhart" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Luchdaich" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "A’ dol a-steach do shaoghal a’ gheama…" + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "A’ luchdadh geama air a shàbhaladh…" + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Geama air a shàbhaladh mì-dhligheach" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Leibheil %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Sguir dheth" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Cruthaich" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Cuir air thuaiream" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Tagh dealbh" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Tagh ainm" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Bàs maireannach?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Tagh clas" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Cluich geama" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Cuir bun-thuilleadan an comas gus leantainn air adhart" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Rèiteachadh" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Urram" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Fàg an geama" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Gabh ris" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Suas" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Sìos" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Gu clì" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Gu deas" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Bàr 1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Bàr 2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Bàr 3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Bàr 4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Bàr 5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Bàr 6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Bàr 7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Bàr 8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Bàr 9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Bàr 0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Pearsa" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Tasgadh" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Cumhachdan" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Leabhar-latha" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Prìomh-ghnìomh" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Gnìomh dàrnach" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Delete" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Bàr – Gabh ris" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Bàr – Gu clì" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Bàr – Gu deas" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Bàr – Cleachd" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Clàr-taice an luchd-leasachaidh" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Clì na luchaige" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Meadhanach na luchaige" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Deas na luchaige" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Cuibhle suas" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Cuibhle sìos" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "X1 na luchaige" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "X2 na luchaige" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Nì nach aithne dhuinn" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "Luaths de %d%%" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "Luaths ionnsaighe de %d%%" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Comas-seasaimh (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Feumach air %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Nì cinn-thurais" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Càileachd: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Ceapadh: %d–%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Ceapadh: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Feum air leibheil %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Feum air: %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Feum air a’ chlas: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Prìs ceannaich: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Prìs ceannaich: %d %s an urra" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Prìs reic: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Prìs reic: %d %s an urra" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Seata:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d nithean:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Brùth air [%s] gus a leughadh" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Brùth air [%s] gus a chleachdadh" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Grad-iuchair: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Chan fhoghainn na PG." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Air fhàgail:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d cruach(an)" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Ainm" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Leibheil" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" +"Ìslichidh seo an dochann a dh’fhulaingeas tu o ionnsaighean dùileach “%s”." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Puingean-eòlais: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "An ath-fhear: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "bunait (%d), duais (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Stadastaireachd cho-cheangailte:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Bheir gach leibheil %d dhut." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Bheir gach puing dhe %s %d dhut." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Falamhaich" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Sònraich:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Bun-roghainnean" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "A bheil thu airson GACH roghainn ath-shuidheachadh?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Ceart ma-thà" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Sguir dheth" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Lean air adhart" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "Sàbhail an geama" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Bun-roghainn" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Seall a h-uile gliocas-sgrìn air spùinn ach an fheadhainn a rachadh fhalach " +"leis a’ cluicheadair no le nàmhaid. Seall a h-uile gliocas-sgrìn air spùinn " +"rè seal le “Alt”." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Seall na h-uile" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Seall gliocasan-sgrìn air spùinn an-còmhnaidh. Falaich a h-uile gliocas-" +"sgrìn air spùinn rè seal le “Alt”." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Falaichte" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Falaich gliocasan-sgrìn air spùinn an-còmhnaidh ach nuair a chumas tu an " +"luchag air cuid spùinne. Seall a h-uile gliocas-sgrìn air spùinn rè seal le " +"“Alt”." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Ri fhaicinn" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Ri fhaicinn (sùm 2x)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Stiùirichidh seo an seòrsa de rabhadh a gheibh an cluicheadair nuair a bhios" +" an t-slàinte nas ìsle na an stairsneach." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Seall teachdaireachd" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Cluich fuaim" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Atharraich an cùrsair" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "À comas" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Na h-uile" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Teachdaireachd ⁊ cùrsair" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Teachdaireachd ⁊ fuaim" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Fuaim ⁊ cùrsair" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Teachdaireachd" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Cùrsair" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Fuaim" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Nuair a thèid slàinte a’ chluicheadair nas ìsle na an stairsneach, nochdaidh" +" na brathan droch-shlàinte a tha an comas." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Fàg an geama" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Video" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Fuaim" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Eadar-aghaidh" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Ion-chur" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Nasgadh iuchraichean" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Tuilleadain" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "’Na stad" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Ùine air a chluich" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Inneal-reandaraidh" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Modh làn-sgrìn" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Uachdaran bathair-chruaidh" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "Sioncronachadh-V" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Criathrag innich" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Sgèileadh DPI" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Breathan paraileige" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Faodar gamma atharrachadh" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Àirde na fuaime" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Àirde a’ chiùil" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Àirde na fuaime" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Cànan" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Seall FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Cùrsair luchaige bathair-chruaidh" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Modh dath-dhoille" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Cùrsair luchaige bathair-chruaidh" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Modh an luchd-leasachaidh" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Fo-thiotalan" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Tuilleadain ghnìomhach" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Tuilleadain ri làimh" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Cuir à comas" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Cuir an comas >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Tionndadh:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Geama:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Tionndadh an einnsein:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Feum air tuilleadain:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Falamhaich" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Sònraich:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Video" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Ion-chur" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Nasgadh iuchraichean" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Faicsinneachd gliocasan-sgrìn nam spùinn" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Modh a’ mheanbh-mhapa" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Seall leubailean bàr na stadastaireachd an-còmhnaidh" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Ceadaich falach fèin-obrachail air bàr na stadastaireachd" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Seall teacsa na còmhraige" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Uidheamaich nithean gu fèin-obrachail" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Seall comharraidhean nan nithean falaichte" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Brath na droch-shlàinte" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Stairsneach na droch-shlàinte" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Gluais an gaisgeach leis an luchag" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Amas luchaige" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Na cleachd an luchag" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Suaip putan luchaige a’ ghluasaid" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Thoir ionnsaigh le gluasad na luchaige" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Marbh-sòn an joystick" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Prìomh-nasgadh: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Nasgadh eile: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Nasgadh joystick: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -270,7 +915,7 @@ "t-siostaim. Tha a’ bhuaidh a th’ aige air an dèanadas a-rèir an inneil-" "reandaraidh." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -278,7 +923,7 @@ "Tha seo an aghaidh reubadh na sgrìn. cuir à comas e ma tha a modh uinneagach" " “stadach” no ma tha maille air an ion-chur." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -288,634 +933,219 @@ "na h-uinneige airson dùmhlachd-bhreacaidh an reandaraidh a sgèileadh. Mur " "eil, cha dèid ach meud na h-uinneige a chleachdadh." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Deuchainneil" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Airson innealan-làimhe" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Inneal-reandaraidh" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Modh làn-sgrìn" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Gluais an gaisgeach le luchag" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Uachdaran bathair-chruaidh" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "Sioncronachadh-V" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Criathrag innich" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "Sgèileadh DPI" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Faodar gamma atharrachadh" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Cleachd joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Amas luchaige" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Na cleachd an luchag" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Marbh-sòn an joystick" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "’Ga luchdadh…" - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Sguab às" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "An sguab sinn an geama às?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Fàg gun tiotal" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Geama ùr" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Tagh slot" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Cuir tuilleadan sgeulachd an comas gus leantainn air adhart" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Luchdaich" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "A’ dol a-steach do shaoghal a’ gheama…" - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "A’ luchdadh geama air a shàbhaladh…" - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Geama air a shàbhaladh mì-dhligheach" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Leibheil %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Cruthaich" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Cuir air thuaiream" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Tagh dealbh" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Tagh ainm" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Bàs maireannach?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Tagh clas" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Cluich geama" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Cuir bun-thuilleadan an comas gus leantainn air adhart" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Rèiteachadh" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Urram" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Fàg an geama" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Gabh ris" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Suas" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Sìos" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Gu clì" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Gu deas" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Bàr 1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Bàr 2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Bàr 3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Bàr 4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Bàr 5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Bàr 6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Bàr 7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Bàr 8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Bàr 9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Bàr 0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Pearsa" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Tasgadh" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Cumhachdan" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Leabhar-latha" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Prìomh-ghnìomh" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Gnìomh dàrnach" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Delete" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Bàr – Gabh ris" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Bàr – Gu clì" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Bàr – Gu deas" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Bàr – Cleachd" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Clàr-taice an luchd-leasachaidh" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Clì na luchaige" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Meadhanach na luchaige" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Deas na luchaige" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Cuibhle suas" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Cuibhle sìos" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "X1 na luchaige" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "X2 na luchaige" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Nì nach aithne dhuinn" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "Luaths de %d%%" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "Luaths ionnsaighe de %d%%" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "Comas-seasaimh (%s)" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Feumach air %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Nì cinn-thurais" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Càileachd: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Ceapadh: %d–%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Ceapadh: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Feum air leibheil %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Feum air: %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Feum air a’ chlas: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Prìs ceannaich: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Prìs ceannaich: %d %s an urra" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Prìs reic: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Prìs reic: %d %s an urra" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Seata:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d nithean:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Brùth air [%s] gus a chleachdadh" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Brùth air [%s] gus a leughadh" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "Faicsinneachd gliocasan-sgrìn nam spùinn" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "Modh a’ mheanbh-mhapa" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Seall leubailean bàr na stadastaireachd an-còmhnaidh" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Seall teacsa na còmhraige" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Grad-iuchair: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "Tùsail. Seall a h-uile gliocas-sgrìn nam spùinn rè seal le “%s”." - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" -"Seall na h-uile. Falaich a h-uile gliocas-sgrìn nam spùinn rè seal le “%s”." - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" -"Falaich na h-uile. Falaich a h-uile gliocas-sgrìn nam spùinn rè seal le " -"“%s”." - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "Ri fhaicinn" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "Falaichte" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "An comas" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "À comas" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "Chan fhoghainn na PG." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Air fhàgail:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d cruach(an)" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Ainm" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Leibheil" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d phuing-pearsa nach deach a chleachdadh" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d puing(ean)-pearsa nach deach a chleachdadh" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" -"Ìslichidh seo an dochann a dh’fhulaingeas tu o ionnsaighean dùileach “%s”" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Puingean-eòlais: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "An ath-fhear: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "bunait (%d), duais (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Stadastaireachd cho-cheangailte:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Bheir gach leibheil %d dhut." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Bheir gach puing dhe %s %d dhut." - -#: ../../../src/MenuDevConsole.cpp:63 +"Cuiridh seo breathan paraileige (nach eil ’nan leacagan) an comas. " +"Dh’fhaoidte gum faigh thu barrachd dèanadais ma chuireas tu seo à comas." + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Cuiridh seo an comas an roghainn gu h-ìosal air leibheil gamma na sgrìn. " +"Dh’fhaoidte gum bi giùlan eadar-dhealaichte na roghainn gamma air ùrlaran " +"eadar-dhealaichte." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Solairidh seo teacsa a bharrachd airson fiosrachadh a thèid a shealltainn le" +" dath gu h-àraidh." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Falaichidh cuid a thuilleadain bàraichean na stadastaireachd nuair a bhios " +"iad à comas. Ma chuireas tu an roghainn seo à comas, thèid an sealltainn an-" +"còmhnaidh." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Nuair a bhios seo an comas, thèid slotaichean uidheamachd falamh a lìonadh " +"le nithean iomchaidh nuair a gheibh thu iad." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Seallaidh seo comharra os cionn nan nàimhdean, nan caidreabhach ’s a’ " +"chluicheadair nuair a thèid am falach le nithean mòra." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" +"Nuair a bhiod seo air, ’s urrainn dhut an geama a stiùireadh leis a’ mheur-" +"chlàr (no joystick) a-mhàin." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Nuair a bhios “Gluais an gaisgeach leis an luchag” an comas, stiùirichidh an" +" roghainn seo co-dhiù an dèid “Prìomh-ghnìomh” no “Gnìomh dàrnach” a " +"chleachdadh airson an gaisgeach a ghluasad. Ma bhios e an comas, gluaisidh " +"“Gnìomh dàrnach” seach “Prìomh-ghnìomh” an gaisgeach." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Nuair a bhios “Gluais an gaisgeach leis an luchag” an comas, stiùirichidh an" +" roghainn seo ma ghabhas a’ chumhachd a chaidh iomruineadh do phutan a’ " +"ghluasaid a chleachdadh le amas air nàmhaid. Ma tha an roghainn seo à comas," +" feumaidh tu “Shift” a chleachdadh ach an cleachd thu a’ chumhachd a chaidh " +"iomruineadh do phutan a’ ghluasaid." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Thèid ionnsaighean a’ chluicheadair a dh’amas an comhair cùrsair na luchaige" +" nuair a bhios seo an comas." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Tuilleadain ghnìomhach" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Tuilleadain ri làimh" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Cuir à comas" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Cuir an comas >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Tionndadh:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Geama:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Tionndadh an einnsein:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Feum air tuilleadain:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(chan eil gin)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Sàbhail is fàg" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Gnìomhaich" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Modh an luchd-leasachaidh" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Cleachd “%s” gus a sgrùdadh leis a’ chùrsair." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Bu chòir dhut comharran-labhairt dùbailte a chur timcheall air argamaidean " "sa bheil geal-spàs. Mar eisimpleir:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Sgrìobh “help” gus liosta de na h-àitheantan fhaighinn." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Astar" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Nì" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "chan eil gin" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "balla" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "balla goirid / sloc" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "nì" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "nì, caidreabhach" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Leacag" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "cuiridh seo cumhachd ri bàr nan gnìomh" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:362 +msgstr "seallaidh/falaichidh seo cunntas nan FPS" + +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "cuiridh seo a h-uile nì a’ HUD air no dheth" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "cuiridh seo HUD an luchd-leasachaidh air no dheth" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -923,12 +1153,12 @@ "Seallaidh seo liosta nan cumhachdan a fhreagras ris an fhacal-luirg. Mur eil" " facal-luirg ann, thèid gach nì a shealltainn" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" "Seallaidh seo ainmean faidhle nam mapaichean uile a tha sa phasgan “maps/”." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -936,7 +1166,7 @@ "Seallaidh seo staidean gnìomhach nan iomairtean a fhreagras ris an fhacal-" "luirg. Mur eil facal-luirg ann, thèid gach staid ghnìomhach a shealltainn" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -944,171 +1174,155 @@ "Seallaidh seo liosta nan nithean a fhreagras ris an fhacal-luirg. Mur eil " "facal-luirg ann, thèid gach nì a shealltainn" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "parsaidh seo sreath dhe cho-phàirtean thachartasan agus ruithidh e ann an " "aon tachartas iad" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "falamhaichidh seo eachdraidh nan àitheantan" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "seallaidh seo an teacsa seo" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Chaidh HUD an luchd-leasachaidh a thoglachadh" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Chaidh an HUD a thoglachadh" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:534 +msgstr "Chaidh cunntar nan FPS a thoglachadh" + +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "MEARACHD: Chan eil argamaidean gu leòr ann" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "OIDHEAM:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "MEARACHD: Chan eil “%s” ’na h-iuchair tachartais dhligheach" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "MEARACHD: Chan eil argamaidean gu leòr ann" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = …" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "MEARACHD: Àithne nach aithne dhuinn" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "OIDHEAM: Sgrìobh “help”" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s leibheil %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Marbh" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Air a mhilleadh" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "’Na stad" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Sàbhail is fàg" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Fàg an geama" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Lean air adhart" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Uidheamaich nithean gu fèin-obrachail" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Chaill thu %d%% dhe %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Chaill thu %d%% dhe na puingean-eòlais iomlan." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Chaill thu %d%% dhe na puingean-eòlais airson an leibheil seo." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Chaill thu %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Tog nì:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Cleachd no uidheamaich nì:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "Atharraichearan air %s" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Tagh uiread dhen nì:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Cuir stac nan nithean dhan stòr:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Reic stac nan nithean:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Chan eil gu leòr dhen nì riatanach agad." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Chan urrainn dhut an nì seo a chleachdadh an-dràsta." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Cha ghabh an nì seo cleachdadh ach on bhàr-ghnìomhan." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Tha an tasgadh làn." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Chan eil %s gu leòr agad." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Cha ghabh an nì seo reic." @@ -1120,216 +1334,261 @@ msgid "Quests" msgstr "Cinn-thurais" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Puingean-eòlais: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Chan urrainn dhut an nì seo a leigeil às." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Cuir a-steach àireamh:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Fulangach" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Cosgaidh e %d puingean-gluasaid" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Cosgaidh e %d puingean-beatha" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Fuarachadh:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Dochann gach diog" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "Puingean-beatha gach diog" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "Puingean-gluasaid gach diog" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Do-ghluasad" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Dìonachd" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Dìonachd an aghaidh dochainn rè ùine" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Dìonachd an aghaidh maille" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Dìonachd an aghaidh tuainealaich" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Dìonachd an aghaidh goid phuingean-beatha" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Dìonachd an aghaidh goid phuingean-gluasaid" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Dìonachd an aghaidh bualaidh air ais" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Dìonachd an aghaidh frith-thilgeil dochainn" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Tuainealaich" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Ath-ghin fèin-obrachail seach bàs" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Iompaich" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Eagal" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Faid-bheatha" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Sgiath dhraoidheach" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Slànachadh" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Bualadh air ais" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "teans de %d%%" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Pongalachd bhunasach" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Teans bunasach air bualadh èiginneach" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Leigidh seo seachad an ceapadh" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Leigidh seo seachad an seachnadh" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "Teans dhe %d%% gun dèan thu bualadh èiginneach air amas le maille air" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "Dochann dùile (%s)" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Feum air: %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Feum air cumhachd: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Briog gus a neo-ghlasadh (cleachdaidh seo 1 phuing-sgil)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Feum air 1 phuing-sgil" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%dphuing-sgil nach deach a chleachdadh" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d puing(ean)-sgil nach deach a chleachdadh" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "An t-ath leibheil:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Stòr co-roinnte" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Cha ghabh nithean cinn-thurais a chur dhan stòr." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Stòr" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "Prìobhaideach" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "Co-roinnte" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Cha ghabh an nì seo a chur dhan stòr." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Cha ghabh an nì seo a chur dhan stòr phrìobhaideach." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "Cha ghabh an nì seo a chur dhan stòr cho-roinnte." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Tha an stòr làn." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Cha ghabh an nì a chur dhan stòr: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Malart" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Na reic thu roimhe" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Reiceadair" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "Sgiath +%d" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "" "Tha thu air cruth-atharrachadh mar-thà, feumaidh tu an cruth tùsail agad a " "ghabhail an toiseach." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Cha b’ urrainn dhut neo-chruth-atharrachadh air an ionad seo." @@ -1337,132 +1596,225 @@ msgid "Completed Quests" msgstr "Cinn-thurais air a choileanadh" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Chaidh an geama a shàbhaladh." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "BkSp" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "Caps" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "Del" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "Esc" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "Ins" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "Alt clì" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "Ctrl clì" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "Shift clì" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "Num" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "PgDn" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "PgUp" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "Print" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "Alt deas" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "Ctrl deas" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "Return" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "Shift deas" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "SLock" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "Spc" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Backspace" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "CapsLock" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "End" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Home" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Insert" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Alt clì" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Ctrl clì" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Shift clì" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "NumLock" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "PageDown" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "PageUp" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pause" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "PrintScreen" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Alt deas" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Ctrl deas" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Return" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Shift deas" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "ScrollLock" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Space" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tab" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "Luch%d" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "%d na luchaige" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "BiorX%d-" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Aiseal %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "BiorX%d+" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Aiseal %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "BiorPut%d" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Putan %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(chan eil gin)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "Pada-D an t-suathaidh" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "Putanan an t-suathaidh" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Gnogadh" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Cha ghabh a nasgadh: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "Chan eil “%s” naisgte tuilleadh ri:" @@ -1627,16 +1979,16 @@ msgid "Base MP" msgstr "Puingean-gluasaid bunasach" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s diog" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s diog(an)" diff --git a/mods/default/languages/engine.gl.po b/mods/default/languages/engine.gl.po index 884a95e..5243cd8 100644 --- a/mods/default/languages/engine.gl.po +++ b/mods/default/languages/engine.gl.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Justin Jacobs , 2018\n" "Language-Team: Galician (https://www.transifex.com/flareorg/teams/84925/gl/)\n" @@ -21,74 +21,83 @@ "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Parabéns, chegaches ao nivel %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Podes aumentar un atributo desde o menú da personaxe." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s menos." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s menos." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Obtiveches %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Obtiveches %d unidades de %s." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Obtiveches unha unidade de %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Obtiveches %d unidades de %s." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Obtiveches %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "A túa experiencia aumentou %d puntos." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Recuperaches a vida." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Recuperaches a enerxía." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "Recuperaches a vida e a enerxía." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Elimináronse os efectos negativos." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "Recuperaches a vida e a enerxía, e elimináronse os efectos negativos." @@ -106,974 +115,1142 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Aventureiro" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "fallo" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d de vida" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d de enerxía" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Destino descoñecido." -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Cargando…" + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Borrar a partida" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Estás seguro?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Menú principal" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nova partida" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Escolla un espazo" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Activa unha modificación de historia para continuar." + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Cargar a partida" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Cargando o mundo…" + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Cargando a partida..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Nivel %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Cancelar" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Crear" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Retrato:" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Nome:" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Perder a partida ao morrer." + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Clase:" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Xogar" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Activa unha modificación base para continuar." + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Configuración" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Autores" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Saír" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Aceptar" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Arriba" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Abaixo" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Esquerda" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Dereita" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Acción 1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Acción 2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Acción 3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Acción 4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Acción 5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Acción 6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Acción 7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Acción 8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Acción 9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Acción 0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Personaxe" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventario" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Habilidades" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Rexistro" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Acción principal" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Acción secundaria" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Control" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Maiúsculas" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Suprimir" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Aceptar (barra de accións)" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Esquerda (barra de accións)" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Dereita (barra de accións)" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Usar (barra de accións)" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menú de desenvolvedor" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Elemento descoñecido" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% velocidade" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Obxecto dunha misión" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Calidade: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorción: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorción: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Require o nivel %d." + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Require a clase «%s»." + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Prezo de compra: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Prezo de compra: %d %s por unidade" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Prezo de venda: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Prezo de venda: %d %s por unidade" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Nome" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Nivel" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Experiencia: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Seguinte nivel: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "Base: %d. Bonificación: %d." + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Baleirar" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Restablecer" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Volver á configuración inicial?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Aceptar" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Cancelar" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Volver ao menú" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Vídeo" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Son" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interface" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Entrada" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Controis" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Pantalla completa:" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Superficies por hardware:" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Permitir cambiar o gamma:" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma:" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Volume dos sons:" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Volume da música:" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Volume dos sons:" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Idioma:" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Mostrar os FPS:" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Cursor do rato por hardware:" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Modo daltónico:" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Cursor do rato por hardware:" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Modo de desenvolvedor" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Mods activos:" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Mods dispoñíbeis:" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "← Desactivar" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Activar →" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Baleirar" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Vídeo" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Entrada" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Controis" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Mostrar texto de combate:" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Mando:" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Mover a personaxe co cursor:" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Apuntar co rato:" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Non usar o rato:" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Límite do mando" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Experimental." - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Para dispositivos móbiles." - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Pantalla completa:" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Mover a personaxe co cursor:" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Superficies por hardware:" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Permitir cambiar o gamma:" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma:" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Empregar un mando:" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Mando:" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Apuntar co rato:" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Non usar o rato:" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Límite do mando" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Cargando…" - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Borrar a partida" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Estás seguro?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Menú principal" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nova partida" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Escolla un espazo" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Activa unha modificación de historia para continuar." - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Cargar a partida" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Cargando o mundo…" - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Cargando a partida..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Nivel %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Crear" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Retrato:" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Nome:" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Perder a partida ao morrer." - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Clase:" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Xogar" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Activa unha modificación base para continuar." - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Configuración" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Autores" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Saír" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Aceptar" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Arriba" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Abaixo" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Esquerda" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Dereita" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Acción 1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Acción 2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Acción 3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Acción 4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Acción 5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Acción 6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Acción 7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Acción 8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Acción 9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Acción 0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Personaxe" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventario" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Habilidades" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Rexistro" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Acción principal" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Acción secundaria" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Control" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Maiúsculas" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Suprimir" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Aceptar (barra de accións)" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Esquerda (barra de accións)" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Dereita (barra de accións)" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Usar (barra de accións)" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menú de desenvolvedor" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Elemento descoñecido" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% velocidade" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Obxecto dunha misión" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Calidade: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorción: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorción: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Require o nivel %d." - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Require a clase «%s»." - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Prezo de compra: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Prezo de compra: %d %s por unidade" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Prezo de venda: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Prezo de venda: %d %s por unidade" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Mostrar texto de combate:" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Nome" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Nivel" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Experiencia: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Seguinte nivel: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "Base: %d. Bonificación: %d." - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Mods activos:" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Mods dispoñíbeis:" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "← Desactivar" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Activar →" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(ningún)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Gardar e saír" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Executar" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Consola de desenvolvedor" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "Activa ou desactiva a interface do desenvolvedor." -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "Baleira o historial de ordes." -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "Mostra este texto." -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Activou ou desactivou a interface de desenvolvedor." -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "Erro: Non hai argumentos dabondo." -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "Erro: Orde descoñecida" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s (nivel %d)" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Morto" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Gardar e saír" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Volver ao menú" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Perdiches %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Non ten unha cantidade suficiente do elemento necesario." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Este obxecto só pode empregarse desde a barra de acción." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "O inventario está cheo." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Non tes %s dabondo." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "" @@ -1085,214 +1262,259 @@ msgid "Quests" msgstr "Misións" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Experiencia: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Consume %d de enerxía" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Consume %d de vida" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Require unha unidade de %s." -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Require a habilidade «%s»." -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Seguinte nivel:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Reserva compartida" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Comercio" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Recuperar" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Vendedor" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d de escudo" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Xa estás transformado, primeiro recupera a forma orixinal." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1300,132 +1522,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Gardouse a partida." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Botón %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(ningún)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1584,16 +1899,16 @@ msgid "Base MP" msgstr "" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "" diff --git a/mods/default/languages/engine.he.po b/mods/default/languages/engine.he.po index 83f6e6a..327b08d 100644 --- a/mods/default/languages/engine.he.po +++ b/mods/default/languages/engine.he.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Language-Team: Hebrew (https://www.transifex.com/flareorg/teams/84925/he/)\n" "MIME-Version: 1.0\n" @@ -17,74 +17,83 @@ "Language: he\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "" - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "" + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "" + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "" -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "" - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "" - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "" -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "" -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "" @@ -102,974 +111,1142 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "" - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "" - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "" - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "" -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "" -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "" -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "" -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "" -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "" @@ -1081,214 +1258,259 @@ msgid "Quests" msgstr "" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "" -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1296,132 +1518,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "" -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1580,16 +1895,16 @@ msgid "Base MP" msgstr "" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "" diff --git a/mods/default/languages/engine.hu.po b/mods/default/languages/engine.hu.po new file mode 100644 index 0000000..38ff1e4 --- /dev/null +++ b/mods/default/languages/engine.hu.po @@ -0,0 +1,1934 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Justin Jacobs , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" +"PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Last-Translator: Justin Jacobs , 2019\n" +"Language-Team: Hungarian (https://www.transifex.com/flareorg/teams/84925/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 +#, c-format +msgid "Congratulations, you have reached level %d!" +msgstr "Gratulálunk, %d szintre léptél!" + +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 +msgid "Transformation expired. You have been moved back to a safe place." +msgstr "A transzformáció elmúlt. Visszakerültél egy biztonságos helyre." + +#: ../../../src/CampaignManager.cpp:152 +#, c-format +msgid "%d %s removed." +msgstr "%d %s eltávolítva." + +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 +#, c-format +msgid "%s removed." +msgstr "%s eltávolítva." + +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Kaptál: %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Kaptál: %s x%d" + +#: ../../../src/CampaignManager.cpp:193 +#, c-format +msgid "You receive %s." +msgstr "Kaptál: %s" + +#: ../../../src/CampaignManager.cpp:210 +#, c-format +msgid "You receive %d XP." +msgstr "Kaptál %d TP-t." + +#: ../../../src/CampaignManager.cpp:216 +msgid "HP restored." +msgstr "ÉP visszaállítva." + +#: ../../../src/CampaignManager.cpp:220 +msgid "MP restored." +msgstr "MP visszaállítva." + +#: ../../../src/CampaignManager.cpp:225 +msgid "HP and MP restored." +msgstr "ÉP és MP visszaállítva." + +#: ../../../src/CampaignManager.cpp:229 +msgid "Negative effects removed." +msgstr "Negatív hatások elmúltak." + +#: ../../../src/CampaignManager.cpp:235 +msgid "HP and MP restored, negative effects removed" +msgstr "ÉP és MP visszaállítva, negatív hatások elmúltak" + +#: ../../../src/DeviceList.cpp:56 +msgid "" +"SDL software renderer\n" +"\n" +"Often slower, but less likely to have issues." +msgstr "" +"SDL szoftver megjelenítő\n" +"Általában lassabb, de tutira működik." + +#: ../../../src/DeviceList.cpp:59 +msgid "" +"SDL hardware renderer\n" +"\n" +"The default renderer that is often faster than the SDL software renderer." +msgstr "" +"SDL hardver megjelenítő\n" +"Alapértelmezett, általában gyorsabb, mint a szoftveres." + +#: ../../../src/EngineSettings.cpp:586 +msgid "Adventurer" +msgstr "Kalandozó" + +#: ../../../src/Entity.cpp:527 +msgid "miss" +msgstr "elvétve" + +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 +#, c-format +msgid "+%d HP" +msgstr "+%d ÉP" + +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 +#, c-format +msgid "+%d MP" +msgstr "" + +#: ../../../src/EventManager.cpp:792 +msgid "Unknown destination" +msgstr "Ismeretlen célállomás" + +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Betöltés..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Állás törlése" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Letöröljem ezt a mentést?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Vissza" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Új Játék" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Válassz rekeszt" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Engedélyezz egy sztori mod-ot a folytatáshoz" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Betöltés" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Belépés a játék világába..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Elmentett játék betöltése..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Hibás mentés" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "%d. szint" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Mégsem" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Létrehoz" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Válassz arcot" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Válassz nevet" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Végleges halál?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Válassz hivatást" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Játék indítása" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Engedélyezd a mag mod-ot a folytatáshoz" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Konfiguráció" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Készítők" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Kilépés" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Elfogad" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Fel" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Le" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Balra" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Jobbra" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Karakter" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Felszerelés" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Erők" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Jegyzetek" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Támad1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Támad2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Törlés" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "AkcióSáv Elfogad" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Akciósáv Bal" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "AkcióSáv Jobb" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "AkcióSáv Használ" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Fejlesztői Menü" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Bal egér" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Középső egér" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Jobb egér" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Görgetés fel" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Görgetés le" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Egér X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Egér X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Ismeretlen tárgy" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% sebesség" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% támadás sebesség" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Küldetéstárgy" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Gyakoriság: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Felfog: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Felfog: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "%d szint kell hozzá" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "%s %d kell hozzá" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "%s hivatás kell hozzá" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Vételár: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Vételár: %d %s per db" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Eladási ár: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Eladási ár: %d %s per db" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Gyűjtemény:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d tárgy:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Üsd le a [%s]-t az elolvasáshoz" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Üsd le a [%s]-t a használathoz" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Gyorsgomb: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Visszavan:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d dugihely" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Név" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Szint" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "TP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Következő: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "alap (%d), bónusz (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Kapcsolódó statisztika:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Minden szint %d-t ad." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Minden %s pont ad %d-t." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Törlés" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Hozzáad:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 +msgid "Defaults" +msgstr "Alapértelmezés" + +#: ../../../src/MenuConfig.cpp:123 +msgid "Reset ALL settings?" +msgstr "Minden beállítást visszaállítsak?" + +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 +msgid "OK" +msgstr "" + +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Folytatás" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Kilépés" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Videó" + +#: ../../../src/MenuConfig.cpp:336 +msgid "Audio" +msgstr "Hang" + +#: ../../../src/MenuConfig.cpp:337 +msgid "Interface" +msgstr "Felület" + +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Bemenet" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Billentyűk" + +#: ../../../src/MenuConfig.cpp:340 +msgid "Mods" +msgstr "Modok" + +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Megállítva" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Megjelenítő" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Teljes képernyő" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Hardveres felületek" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Textúra szűrő" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "DPI skálázás" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Gamma korrekció engedélyezés" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Effektek hangereje" + +#: ../../../src/MenuConfig.cpp:372 +msgid "Music Volume" +msgstr "Zene hangereje" + +#: ../../../src/MenuConfig.cpp:374 +msgid "Language" +msgstr "Nyelv" + +#: ../../../src/MenuConfig.cpp:375 +msgid "Show FPS" +msgstr "FPS mutatása" + +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Hardveres egérmutató" + +#: ../../../src/MenuConfig.cpp:377 +msgid "Colorblind Mode" +msgstr "Színvak mód" + +#: ../../../src/MenuConfig.cpp:378 +msgid "Developer Mode" +msgstr "Fejlesztői mód" + +#: ../../../src/MenuConfig.cpp:379 +msgid "Subtitles" +msgstr "Feliratok" + +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Mindig mutassa a státusz cimkéit" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Küzdelem kiírása szövegesen" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Automatikusan használja a tárgyakat" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Botkormány" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Hős mozgatása egérrel" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Egérrel célzás" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Ne használja az egeret" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Botkormány holttér" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 +msgid "" +"Will try to store surfaces in video memory versus system memory. The effect " +"this has on performance depends on the renderer." +msgstr "" +"A felületeket a videó memóriában próbálja tárolni a rendszermemória " +"helyett.A sebességnövekedés a megjelenítőtől is függ." + +#: ../../../src/MenuConfig.cpp:512 +msgid "" +"Prevents screen tearing. Disable if you experience \"stuttering\" in " +"windowed mode or input lag." +msgstr "" +"Megakadályozza a villogást. Kapcsold ki, ha szaggat ablakosmódban vagy " +"lassan reagál a bemenetre." + +#: ../../../src/MenuConfig.cpp:513 +msgid "" +"When enabled, this uses the screen DPI in addition to the window dimensions " +"to scale the rendering resolution. Otherwise, only the window dimensions are" +" used." +msgstr "" +"Ha be van kapcsolva, a képernyő DPI-t is használja a felbontás mellé, hogy a" +" végleges megjelenítést kiszámolja. Máskülönben csak az ablak mérete számít." + +#: ../../../src/MenuConfig.cpp:514 +msgid "" +"This enables parallax (non-tile) layers. Disabling this setting can improve " +"performance in some cases." +msgstr "" + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Aktív modok" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Rendelkezésreálló modok" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Kikapcsol" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Bekapcsol >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Verzió:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Játék:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Motor verzió:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Szükséges modok:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(nincs)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Mentés, kilépés" + +#: ../../../src/MenuDevConsole.cpp:65 +msgid "Execute" +msgstr "Végrehajt" + +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 +msgid "Developer Console" +msgstr "Fejlesztői Konzol" + +#: ../../../src/MenuDevConsole.cpp:143 +#, c-format +msgid "Use '%s' to inspect with the cursor." +msgstr "Használd a '%s'-t majd a kurzort a megvizsgáláshoz" + +#: ../../../src/MenuDevConsole.cpp:148 +msgid "Arguments with spaces should be enclosed with double quotes. Example:" +msgstr "A szóközöket tartalmazó paramétereket idézőjelbe kell tenni, pl:" + +#: ../../../src/MenuDevConsole.cpp:149 +msgid "Type 'help' to get a list of commands." +msgstr "A 'help'-re kilistázza a parancsokat." + +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 +msgid "px" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:226 +msgid "Distance" +msgstr "Távolság" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 +msgid "Entity" +msgstr "Entitás" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 +msgid "none" +msgstr "nincs" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 +msgid "wall" +msgstr "fal" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 +msgid "short wall / pit" +msgstr "rövid fal / verem" + +#: ../../../src/MenuDevConsole.cpp:268 +msgid "entity" +msgstr "entitás" + +#: ../../../src/MenuDevConsole.cpp:269 +msgid "entity, ally" +msgstr "entitás, barát" + +#: ../../../src/MenuDevConsole.cpp:276 +msgid "Tile" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:377 +msgid "adds a power to the action bar" +msgstr "hozzáad egy erőt az akció sávhoz" + +#: ../../../src/MenuDevConsole.cpp:378 +msgid "turns on/off the display of the FPS counter" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:379 +msgid "turns on/off all of the HUD elements" +msgstr "ki/bekapcsolja az összes infót" + +#: ../../../src/MenuDevConsole.cpp:380 +msgid "turns on/off the developer hud" +msgstr "ki/bekapcsolja a fejlesztői infókat" + +#: ../../../src/MenuDevConsole.cpp:381 +msgid "" +"Prints a list of powers that match a search term. No search term will list " +"all items" +msgstr "Kilistázza a keresésnek megfelelő erőket. Keresés nélkül az összeset." + +#: ../../../src/MenuDevConsole.cpp:382 +msgid "Prints out all the map filenames located in the \"maps/\" directory." +msgstr "Kilistázza a 'maps' mappában található térképeket." + +#: ../../../src/MenuDevConsole.cpp:383 +msgid "" +"Prints out the active campaign statuses that match a search term. No search " +"term will list all active statuses" +msgstr "" +"Kilistázza a keresésnek megfelelő aktív kampány státuszokat. Keresés " +"nélkülmindet" + +#: ../../../src/MenuDevConsole.cpp:384 +msgid "" +"Prints a list of items that match a search term. No search term will list " +"all items" +msgstr "Kilistázza a keresésnek megfelelő tárgyakat. Keresés nélkül mindet" + +#: ../../../src/MenuDevConsole.cpp:385 +msgid "" +"parses a series of event components and executes them as a single event" +msgstr "kiértékel egy eseménysort, és egy egységes eseményként hajta végre" + +#: ../../../src/MenuDevConsole.cpp:386 +msgid "clears the command history" +msgstr "törli a parancssor történetet" + +#: ../../../src/MenuDevConsole.cpp:387 +msgid "displays this text" +msgstr "megjeleníti ezt" + +#: ../../../src/MenuDevConsole.cpp:394 +msgid "Toggled the developer hud" +msgstr "Fejlesztői infók kapcsolva" + +#: ../../../src/MenuDevConsole.cpp:398 +msgid "Toggled the hud" +msgstr "Infók kapcsolva" + +#: ../../../src/MenuDevConsole.cpp:402 +msgid "Toggled the FPS counter" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:552 +msgid "ERROR: Incorrect number of arguments" +msgstr "HIBA: hibás paraméterszám" + +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 +msgid "HINT:" +msgstr "TIPP:" + +#: ../../../src/MenuDevConsole.cpp:554 +msgid "" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:570 +#, c-format +msgid "ERROR: '%s' is not a valid event key" +msgstr "HIBA: '%s' nem egy eseménykulcs" + +#: ../../../src/MenuDevConsole.cpp:580 +msgid "ERROR: Too few arguments" +msgstr "HIBA: túl kevés paraméter" + +#: ../../../src/MenuDevConsole.cpp:582 +msgid "= = ..." +msgstr "=<érték> =<érték> ..." + +#: ../../../src/MenuDevConsole.cpp:587 +msgid "ERROR: Unknown command" +msgstr "HIBA: ismeretlen parancs" + +#: ../../../src/MenuDevConsole.cpp:589 +msgid "HINT: Type help" +msgstr "TIPP: használd a 'help'-et" + +#: ../../../src/MenuEnemy.cpp:162 +#, c-format +msgid "%s level %d" +msgstr "%s %d. szint" + +#: ../../../src/MenuEnemy.cpp:186 +msgid "Dead" +msgstr "Halott" + +#: ../../../src/MenuEnemy.cpp:188 +msgid "Destroyed" +msgstr "" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 +#, c-format +msgid "Lost %d%% of %s." +msgstr "Elveszett %d%% a %s-ból." + +#: ../../../src/MenuInventory.cpp:185 +#, c-format +msgid "Lost %d%% of total XP." +msgstr "Elveszett %d%% a teljes TP-ból." + +#: ../../../src/MenuInventory.cpp:190 +#, c-format +msgid "Lost %d%% of current level XP." +msgstr "Elveszett %d%% a szinten gyűjtött TP-ból." + +#: ../../../src/MenuInventory.cpp:216 +#, c-format +msgid "Lost %s." +msgstr "Elveszett %s." + +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 +#, c-format +msgid "%d %s" +msgstr "" + +#: ../../../src/MenuInventory.cpp:301 +msgid "Pick up item(s):" +msgstr "Tárgyak felvétele:" + +#: ../../../src/MenuInventory.cpp:302 +msgid "Use or equip item:" +msgstr "Használd vagy hord:" + +#: ../../../src/MenuInventory.cpp:303 +#, c-format +msgid "%s modifiers" +msgstr "%s módosító" + +#: ../../../src/MenuInventory.cpp:304 +msgid "Select a quantity of item:" +msgstr "Válassz mennyiséget:" + +#: ../../../src/MenuInventory.cpp:307 +msgid "Stash item stack:" +msgstr "Dugihelyre helyez:" + +#: ../../../src/MenuInventory.cpp:309 +msgid "Sell item stack:" +msgstr "Tárgy eladása:" + +#: ../../../src/MenuInventory.cpp:576 +msgid "You don't have enough of the required item." +msgstr "Nincs elegendő a szükséges tárgyból." + +#: ../../../src/MenuInventory.cpp:588 +msgid "You can't use this item right now." +msgstr "Most nem tudod ezt a tárgyat használni." + +#: ../../../src/MenuInventory.cpp:600 +msgid "This item can only be used from the action bar." +msgstr "Ezt csak az akció sávról használhatod." + +#: ../../../src/MenuInventory.cpp:718 +msgid "Inventory is full." +msgstr "Tele a hátizsák." + +#: ../../../src/MenuInventory.cpp:843 +#, c-format +msgid "Not enough %s." +msgstr "Nincs elég %s." + +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 +msgid "This item can not be sold." +msgstr "Ezt nem lehet eladni." + +#: ../../../src/MenuLog.cpp:91 +msgid "Notes" +msgstr "Jegyzetek" + +#: ../../../src/MenuLog.cpp:92 +msgid "Quests" +msgstr "Küldetések" + +#: ../../../src/MenuManager.cpp:305 +#, c-format +msgid "XP: %d/%d" +msgstr "TP: %d/%d" + +#: ../../../src/MenuManager.cpp:875 +msgid "This item can not be dropped." +msgstr "Ezt nem tudod lerakni." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" + +#: ../../../src/MenuNumPicker.cpp:59 +msgid "Enter amount:" +msgstr "Add meg a mennyiséget:" + +#: ../../../src/MenuPowers.cpp:872 +msgid "Passive" +msgstr "Passzív" + +#: ../../../src/MenuPowers.cpp:879 +#, c-format +msgid "Costs %d MP" +msgstr "%d MP-be kerül" + +#: ../../../src/MenuPowers.cpp:883 +#, c-format +msgid "Costs %d HP" +msgstr "%d ÉP-be kerül" + +#: ../../../src/MenuPowers.cpp:887 +msgid "Cooldown:" +msgstr "Lehűlés:" + +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 +msgid "Damage per second" +msgstr "Sebzés per másodperc" + +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 +msgid "HP per second" +msgstr "ÉP per másodperc" + +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 +msgid "MP per second" +msgstr "MP per másodperc" + +#: ../../../src/MenuPowers.cpp:957 +msgid "Immobilize" +msgstr "Megbénítás" + +#: ../../../src/MenuPowers.cpp:965 +msgid "Immunity" +msgstr "Immunitás" + +#: ../../../src/MenuPowers.cpp:968 +msgid "Immunity to damage over time" +msgstr "Idővel immunis a sebzésre" + +#: ../../../src/MenuPowers.cpp:971 +msgid "Immunity to slow" +msgstr "Immunis a lassításra" + +#: ../../../src/MenuPowers.cpp:974 +msgid "Immunity to stun" +msgstr "Immunis a bénításra" + +#: ../../../src/MenuPowers.cpp:977 +msgid "Immunity to HP steal" +msgstr "Immunis az ÉP lopásra" + +#: ../../../src/MenuPowers.cpp:980 +msgid "Immunity to MP steal" +msgstr "Immunis az MP lopásra" + +#: ../../../src/MenuPowers.cpp:983 +msgid "Immunity to knockback" +msgstr "Immunis a leütésre" + +#: ../../../src/MenuPowers.cpp:986 +msgid "Immunity to damage reflection" +msgstr "Immunis a sebzésvisszaküldésre" + +#: ../../../src/MenuPowers.cpp:992 +msgid "Stun" +msgstr "Bénítás" + +#: ../../../src/MenuPowers.cpp:995 +msgid "Automatic revive on death" +msgstr "Halál esetén visszahoz" + +#: ../../../src/MenuPowers.cpp:998 +msgid "Convert" +msgstr "Konvertálás" + +#: ../../../src/MenuPowers.cpp:1001 +msgid "Fear" +msgstr "Félelem" + +#: ../../../src/MenuPowers.cpp:1004 +msgid "Lifespan" +msgstr "Élettartam" + +#: ../../../src/MenuPowers.cpp:1028 +msgid "Magical Shield" +msgstr "Mágikus pajzs" + +#: ../../../src/MenuPowers.cpp:1057 +msgid "Healing" +msgstr "Gyógyítás" + +#: ../../../src/MenuPowers.cpp:1060 +msgid "Knockback" +msgstr "Leütés" + +#: ../../../src/MenuPowers.cpp:1084 +#, c-format +msgid "%d%% chance" +msgstr "%d%% esély" + +#: ../../../src/MenuPowers.cpp:1136 +msgid "Base Accuracy" +msgstr "Alap pontosság" + +#: ../../../src/MenuPowers.cpp:1156 +msgid "Base Critical Chance" +msgstr "Alap kritikus találat" + +#: ../../../src/MenuPowers.cpp:1164 +msgid "Ignores Absorbtion" +msgstr "Felfogást kivédi" + +#: ../../../src/MenuPowers.cpp:1169 +msgid "Ignores Avoidance" +msgstr "Kitérést kivédi" + +#: ../../../src/MenuPowers.cpp:1174 +#, c-format +msgid "%d%% Chance to crit slowed targets" +msgstr "%d%% esély a kritikusra lassítottnál" + +#: ../../../src/MenuPowers.cpp:1179 +#, c-format +msgid "Elemental Damage (%s)" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1188 +#, c-format +msgid "Requires a %s" +msgstr "%s kell hozzá" + +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 +#, c-format +msgid "Requires Power: %s" +msgstr "%s erő kell hozzá" + +#: ../../../src/MenuPowers.cpp:1238 +msgid "Click to Unlock (uses 1 Skill Point)" +msgstr "Kattint a feloldáshoz (1 tulajdonság pontért)" + +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 +msgid "Requires 1 Skill Point" +msgstr "1 tulajdonság pont kell hozzá" + +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 +msgid "Next Level:" +msgstr "Következő szint:" + +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 +msgid "Stash is full." +msgstr "Dugihely megtelt." + +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 +msgid "Trade" +msgstr "Csere" + +#: ../../../src/MenuVendor.cpp:60 +msgid "Buyback" +msgstr "Visszavásárol" + +#: ../../../src/MenuVendor.cpp:283 +msgid "Vendor" +msgstr "Eladó" + +#: ../../../src/PowerManager.cpp:1208 +#, c-format +msgid "+%d Shield" +msgstr "+%d pajzs" + +#: ../../../src/PowerManager.cpp:1465 +msgid "You are already transformed, untransform first." +msgstr "Már transzformáltál, változz vissza előbb." + +#: ../../../src/PowerManager.cpp:1477 +msgid "Could not untransform at this position." +msgstr "Itt nem lehet vissza változni." + +#: ../../../src/QuestLog.cpp:234 +msgid "Completed Quests" +msgstr "" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 +msgid "Game saved." +msgstr "Játék elmentve." + +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "Vége" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Eleje" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Állj" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 +msgid "Backspace" +msgstr "Visszatörlés" + +#: ../../../src/SDLInputState.cpp:674 +msgid "CapsLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:678 +msgid "Escape" +msgstr "" + +#: ../../../src/SDLInputState.cpp:680 +msgid "Insert" +msgstr "Beszúr" + +#: ../../../src/SDLInputState.cpp:681 +msgid "Left Alt" +msgstr "Bal Alt" + +#: ../../../src/SDLInputState.cpp:682 +msgid "Left Ctrl" +msgstr "Bal Ctrl" + +#: ../../../src/SDLInputState.cpp:684 +msgid "Left Shift" +msgstr "Bal Shift" + +#: ../../../src/SDLInputState.cpp:685 +msgid "NumLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:686 +msgid "PageDown" +msgstr "LapozásLe" + +#: ../../../src/SDLInputState.cpp:687 +msgid "PageUp" +msgstr "LapozásFel" + +#: ../../../src/SDLInputState.cpp:689 +msgid "PrintScreen" +msgstr "Képernyőnyomtatás" + +#: ../../../src/SDLInputState.cpp:690 +msgid "Right Alt" +msgstr "Jobb Alt" + +#: ../../../src/SDLInputState.cpp:691 +msgid "Right Ctrl" +msgstr "Jobb Ctrl" + +#: ../../../src/SDLInputState.cpp:692 +msgid "Return" +msgstr "Kocsivissza" + +#: ../../../src/SDLInputState.cpp:694 +msgid "Right Shift" +msgstr "Jobb Shift" + +#: ../../../src/SDLInputState.cpp:695 +msgid "ScrollLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:696 +msgid "Space" +msgstr "Szóköz" + +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 +#, c-format +msgid "Mouse %d" +msgstr "Egér %d" + +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 +#, c-format +msgid "Axis %d -" +msgstr "Tengely %d -" + +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 +#, c-format +msgid "Axis %d +" +msgstr "Tengely %d +" + +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 +#, c-format +msgid "Button %d" +msgstr "Gomb %d" + +#: ../../../src/SDLInputState.cpp:787 +msgid "Touch control D-Pad" +msgstr "" + +#: ../../../src/SDLInputState.cpp:810 +msgid "Touch control buttons" +msgstr "" + +#: ../../../src/SDLInputState.cpp:824 +msgid "Tap" +msgstr "" + +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 +#, c-format +msgid "'%s' is no longer bound to:" +msgstr "'%s' nem kötődik ehhez: " + +#: ../../../src/Stats.cpp:38 +msgid "Max HP" +msgstr "Max ÉP" + +#: ../../../src/Stats.cpp:39 +msgid "Total amount of HP." +msgstr "" + +#: ../../../src/Stats.cpp:43 +msgid "HP Regen" +msgstr "ÉP gyógyulás" + +#: ../../../src/Stats.cpp:44 +msgid "Ticks of HP regen per minute." +msgstr "ÉP gyógyulás másodpercenként." + +#: ../../../src/Stats.cpp:48 +msgid "Max MP" +msgstr "" + +#: ../../../src/Stats.cpp:49 +msgid "Total amount of MP." +msgstr "" + +#: ../../../src/Stats.cpp:53 +msgid "MP Regen" +msgstr "MP töltés" + +#: ../../../src/Stats.cpp:54 +msgid "Ticks of MP regen per minute." +msgstr "MP töltés másodpercenként." + +#: ../../../src/Stats.cpp:58 +msgid "Accuracy" +msgstr "Pontosság" + +#: ../../../src/Stats.cpp:59 +msgid "" +"Accuracy rating. The enemy's Avoidance rating is subtracted from this value " +"to calculate your likeliness to land a direct hit." +msgstr "" + +#: ../../../src/Stats.cpp:63 +msgid "Avoidance" +msgstr "Kitérés" + +#: ../../../src/Stats.cpp:64 +msgid "" +"Avoidance rating. This value is subtracted from the enemy's Accuracy rating " +"to calculate their likeliness to land a direct hit." +msgstr "" + +#: ../../../src/Stats.cpp:68 +msgid "Absorb Min" +msgstr "Felfogás Min" + +#: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 +msgid "Reduces the amount of damage taken." +msgstr "" + +#: ../../../src/Stats.cpp:73 +msgid "Absorb Max" +msgstr "Felfogás Max" + +#: ../../../src/Stats.cpp:78 +msgid "Critical Hit Chance" +msgstr "Kritikus ütés esélye" + +#: ../../../src/Stats.cpp:79 +msgid "Chance for an attack to do extra damage." +msgstr "" + +#: ../../../src/Stats.cpp:83 +msgid "Bonus XP" +msgstr "Bónusz TP" + +#: ../../../src/Stats.cpp:84 +msgid "Increases the XP gained per kill." +msgstr "Növeli a TP-t minden győzelemnél." + +#: ../../../src/Stats.cpp:88 +#, c-format +msgid "Bonus %s" +msgstr "Bónusz %s" + +#: ../../../src/Stats.cpp:89 +#, c-format +msgid "Increases the %s found per drop." +msgstr "Növeli a %s-t találat esélyét lerakásnál." + +#: ../../../src/Stats.cpp:93 +msgid "Item Find Chance" +msgstr "Tárgytalálat esélye" + +#: ../../../src/Stats.cpp:94 +msgid "Increases the chance that an enemy will drop an item." +msgstr "Növeli az esélyét, hogy az ellenség elejt valamit." + +#: ../../../src/Stats.cpp:98 +msgid "Stealth" +msgstr "Lopakodás" + +#: ../../../src/Stats.cpp:99 +msgid "Increases your ability to move undetected." +msgstr "Növeli az esélyét, hogy ne vegyenek észre." + +#: ../../../src/Stats.cpp:103 +msgid "Poise" +msgstr "Tökösség" + +#: ../../../src/Stats.cpp:104 +msgid "Reduces your chance of stumbling when hit." +msgstr "Csökkenti az esélyét az ájulásnak ha eltalálnak." + +#: ../../../src/Stats.cpp:108 +msgid "Missile Reflect Chance" +msgstr "Lövedék elhárítás esélye" + +#: ../../../src/Stats.cpp:109 +msgid "Increases your chance of reflecting missiles back at enemies." +msgstr "Növeli az esélyét hogy visszaküldöd a lövedéket a támadóra." + +#: ../../../src/Stats.cpp:113 +msgid "Damage Reflection" +msgstr "Sebzés vissza" + +#: ../../../src/Stats.cpp:114 +msgid "Deals a percentage of damage taken back to the attacker." +msgstr "A sebzést adott százalékban a visszahárítja a támadóra." + +#: ../../../src/Stats.cpp:118 +msgid "HP Steal" +msgstr "ÉP lopás" + +#: ../../../src/Stats.cpp:119 +msgid "Percentage of HP stolen per hit." +msgstr "Ütésenként ellopott ÉP-k százalékban." + +#: ../../../src/Stats.cpp:123 +msgid "MP Steal" +msgstr "MP lopás" + +#: ../../../src/Stats.cpp:124 +msgid "Percentage of MP stolen per hit." +msgstr "Ütésenként ellopott MP-k százalékban." + +#: ../../../src/Stats.cpp:128 +msgid "Base HP" +msgstr "Alap ÉP" + +#: ../../../src/Stats.cpp:133 +msgid "Base MP" +msgstr "Alap MP" + +#: ../../../src/Utils.cpp:365 +msgid "k" +msgstr "k" + +#: ../../../src/Utils.cpp:635 +#, c-format +msgid "%s second" +msgstr "%s másodperc" + +#: ../../../src/Utils.cpp:638 +#, c-format +msgid "%s seconds" +msgstr "%s másodperc" + +#: ../../../src/Version.cpp:139 +msgid "or newer" +msgstr "vagy újabb" + +#: ../../../src/Version.cpp:142 +msgid "or older" +msgstr "vagy régebbi" diff --git a/mods/default/languages/engine.it.po b/mods/default/languages/engine.it.po index db2567c..87d3716 100644 --- a/mods/default/languages/engine.it.po +++ b/mods/default/languages/engine.it.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Fabio Loli, 2018\n" "Language-Team: Italian (https://www.transifex.com/flareorg/teams/84925/it/)\n" @@ -23,76 +23,83 @@ "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Congratulazioni, hai raggiunto il livello %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Puoi aumentare un attributo nel Menu Personaggio." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"La morte ti ha raggiunto. Partita finita! Premi ${INPUT_CONTINUE} per " -"tornare ai Titoli." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "La morte ti ha raggiunto. Premi ${INPUT_CONTINUE} per continuare." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "Trasformazione finita. Sei stato riportato in un luogo sicuro." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s rimosso." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s rimosso." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Ricevi %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Ricevi %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Ricevi %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Ricevi %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Ricevi %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Ricevi %d ESP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Salute ripristinata." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Mana ripristinato." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "Salute e Mana ripristinati." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Effetti negativi rimossi." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "Salute e Mana ripristinati, effetti negativi rimossi" @@ -116,150 +123,772 @@ "\n" "Il renderer di default, spesso più veloce del renderer software." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Avventuriero" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "mancato" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d Salute" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d Mana" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Destinazione sconosciuta" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Caricamento..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Elimina salvataggio" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Eliminare questo salvataggio?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Torna ai Titoli" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nuova Partita" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Scegli Slot" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Abilita una mod storia per continuare" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Carica partita" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Ingresso nel mondo di gioco..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Caricamento partita..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Salvataggio corrotto" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Livello %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Annulla" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Crea" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Scegli un ritratto" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Scegli un nome" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Morte definitiva?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Scegli una classe" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Gioca" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Abilitare una mod core per continuare" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Impostazioni" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Riconoscimenti" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Esci dal gioco" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Accetta" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Su" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Giù" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Sinistra" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Destra" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Barra1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Barra2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Barra3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Barra4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Barra5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Barra6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Barra7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Barra8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Barra9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Barra0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Personaggio" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventario" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Poteri" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Diario" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Principale 1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Principale 2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Cancella" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "ActionBar Accetta" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "ActionBar Sinistra" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "ActionBar Destra" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "ActionBar Usa" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menu Sviluppatore" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Mouse sinistro" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Mouse centrale" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Mouse destro" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Rotella in alto" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Rotella in basso" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Mouse X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Mouse X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Oggetto sconosciuto" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Velocità" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Velocità di Attacco" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Oggetto della missione" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Qualità: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Assorbimento: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Assorbimento: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Richiede Livello %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Richiede %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Richiede Classe %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Prezzo d'acquisto: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Prezzo d'acquisto: %d %s ciascuno" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Prezzo di vendita: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Prezzo di vendita: %d %s ciascuno" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Completo:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d oggetti:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Premi [%s] per leggere" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Premi [%s] per usare" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Tasto rapido: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Rimanenti:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d mucchi" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Nome" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Livello" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "ESP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Prossimo: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "base (%d), bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Statistiche associate:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Ad ogni livello ottieni %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Per ogni punto di %s ottieni %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Pulisci" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Assegnazioni:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Predefiniti" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Resettare TUTTE le impostazioni?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Ok" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Annulla" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Esci" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Video" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Audio" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interfaccia" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Input" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Scorciatoie da tastiera" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mod" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "In pausa" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Renderer" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Modalità schermo intero" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Superfici solide" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "V-Sync" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Filtro texture" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "dimensione DPI" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Permetti cambio di gamma" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Volume audio" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Volume musica" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Volume audio" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Lingua" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Mostra FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Hardware cursore mouse" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Modalità per daltonici" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Hardware cursore mouse" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Modalità Sviluppatore" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Sottotitoli" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Mod attive" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Mod disponibili" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Disabilita" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Abilita >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Versione:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Gioco:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Versione motore di gioco:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Richiede mod:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Pulisci" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Assegnazioni:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Video" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Input" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Scorciatoie da tastiera" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Mostra sempre le etichette della barra" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Mostra testo combattimento" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Equipaggia gli oggetti automaticamente" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Muovi Eroe tramite mouse" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Mira via mouse" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Non usare il mouse" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Zona neutra Joystick" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -267,7 +896,7 @@ "Cerca di caricare le superfici nella memoria video anziché in quella di " "sistema. L'effetto sulla performance dipende dalla scheda video." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -275,7 +904,7 @@ "Previene il tearing dello schermo. Disabilita se sperimenti lo " "\"stuttering\" nel modo 'windowed' o un ritardo nell'input." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -285,630 +914,192 @@ "della finestra per modificare la risoluzione. Altrimenti, sono utilizzate " "solo le dimensioni della finestra." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Sperimentale" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Per dispositivi tascabili" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Renderer" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Modalità schermo intero" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Muovi Eroe tramite mouse" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Superfici solide" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "V-Sync" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Filtro texture" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "dimensione DPI" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Permetti cambio di gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Usa joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Mira via mouse" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Non usare il mouse" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Zona neutra Joystick" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Caricamento..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Elimina salvataggio" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Eliminare questo salvataggio?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Torna ai Titoli" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nuova Partita" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Scegli Slot" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Abilita una mod storia per continuare" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Carica partita" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Ingresso nel mondo di gioco..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Caricamento partita..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Salvataggio corrotto" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Livello %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Crea" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Scegli un ritratto" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Scegli un nome" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Morte definitiva?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Scegli una classe" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Gioca" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Abilitare una mod core per continuare" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Impostazioni" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Riconoscimenti" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Esci dal gioco" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Accetta" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Su" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Giù" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Sinistra" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Destra" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Barra1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Barra2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Barra3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Barra4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Barra5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Barra6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Barra7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Barra8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Barra9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Barra0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Personaggio" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventario" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Poteri" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Diario" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Principale 1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Principale 2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Cancella" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "ActionBar Accetta" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "ActionBar Sinistra" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "ActionBar Destra" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "ActionBar Usa" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menu Sviluppatore" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Mouse sinistro" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Mouse centrale" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Mouse destro" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Rotella in alto" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Rotella in basso" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Mouse X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Mouse X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Oggetto sconosciuto" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Velocità" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Velocità di Attacco" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Oggetto della missione" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Qualità: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Assorbimento: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Assorbimento: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Richiede Livello %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Richiede %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Richiede Classe %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Prezzo d'acquisto: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Prezzo d'acquisto: %d %s ciascuno" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Prezzo di vendita: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Prezzo di vendita: %d %s ciascuno" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Completo:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d oggetti:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Premi [%s] per usare" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Premi [%s] per leggere" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Mostra sempre le etichette della barra" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Mostra testo combattimento" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Tasto rapido: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Rimanenti:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d mucchi" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Nome" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Livello" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d punto statistiche non utilizzato" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d punti statistiche non utilizzati" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "ESP: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Prossimo: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "base (%d), bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Statistiche associate:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Ad ogni livello ottieni %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Per ogni punto di %s ottieni %d." - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Mod attive" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Mod disponibili" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Disabilita" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Abilita >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Versione:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Gioco:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Versione motore di gioco:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Richiede mod:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(nessuno)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Salva ed esci" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Esegui" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Console Sviluppatore" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Usa '%s' per esaminare col cursore." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Gli argomenti con gli spazi devono essere racchiusi con doppie virgolette. " "Esempio:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Digita 'help' per ottenere un elenco di comandi." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Distanza" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Entità" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "nessuno" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "muro" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "muretto / pozzo" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "entità" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "entità, alleato" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Mattonella" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "aggiunge un potere alla barra delle azioni" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "attiva/disattiva tutti gli elementi dell'Interfaccia" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "accende/spegne lo schermo sviluppatore" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -916,13 +1107,13 @@ "Mostra un elenco di poteri che corrispondono a un termine di ricerca. Nessun" " termine di ricerca elenca tutti gli oggetti" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" "Stampa tutti i nomi dei file della mappa che si trovano nella directory " "\"maps/\"." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -930,7 +1121,7 @@ "Stampa gli stati di campagna attivi che corrispondono a un termine di " "ricerca. Nessun termine di ricerca elenca tutti gli stati attivi" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -938,171 +1129,155 @@ "Mostra un elenco di elementi che corrispondono a un termine di ricerca. " "Nessun termine di ricerca elenca tutti gli elementi" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "Analizza una serie di componenti di evento e li esegue come un singolo " "evento" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "pulisce la cronologia comandi" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "mostra questo testo" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Alterna lo schermo sviluppatore" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Attiva l'Interfaccia" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "ERRORE: Numero errato di argomenti" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "SUGGERIMENTO:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "ERRORE: '%s' non è un valido evento chiave" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "ERRORE: Troppo pochi argomenti" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = ..." -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "ERRORE: Comando sconosciuto" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "SUGGERIMENTO: Digita help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s livello %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Morto" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Distrutto" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "In pausa" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Salva ed esci" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Esci" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Continua" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Equipaggia gli oggetti automaticamente" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Hai perso il %d%% di %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Hai perso il %d%% di ESP totale." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Hai perso il %d%% del livello ESP attuale." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Hai perso %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Raccogli oggetto/i:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Usa o equipaggia oggetto:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "%s modificatori" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Seleziona una quantità di oggetti:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Accantona gruppo di oggetti:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Vendi gruppo di oggetti:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Non ne hai a sufficienza." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Adesso non puoi usare questo oggetto." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Questo elemento può essere usato solo dalla barra azioni." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "L'inventario è pieno." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Non hai abbastanza %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Questo oggetto non può essere venduto." @@ -1114,214 +1289,259 @@ msgid "Quests" msgstr "Missioni" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "ESP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Questo oggetto non può essere gettato via." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Inserisci quantità:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Passivo" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Costa %d Mana" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Costa %d Salute" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Raffreddamento:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Danno per secondo" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "Salute per secondo" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "Mana per secondo" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Immobilizzare" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Immunità" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Immunità ai danni nel tempo" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Immunità al rallentamento" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Immunità allo stordimento" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Immunità al furto di Salute" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Immunità al furto di Mana" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Immunità al colpo all'indietro" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Immunità al danno riflesso" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Stordimento" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Rivive automaticamente alla la morte" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Convertire" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Paura" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Durata della vita" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Scudo Magico" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Guarigione" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Contraccolpo" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "possibilità %d%%" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Precisione di Base" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Possibilità di Colpo Critico di Base" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Ignora l'assorbimento" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Ignora Schivata" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% Possibilità di colpo critico sui bersagli rallentati" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Richiede un %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Richiede Potere: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Clicca per sbloccare (usa 1 Punto Abilità)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Richiede 1 Punto Abilità" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d punto abilità non utilizzato" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d punti abilità non utilizzati" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Prossimo livello:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Scorta condivisa" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Impossibile memorizzare gli elementi della ricerca nello stash." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "L'inventario è pieno." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Commercio" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Ricompra" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Venditore" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Scudo" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Sei già trasformato, annulla trasformazione prima." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Impossibile detrasformarsi da questa posizione." @@ -1329,132 +1549,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Partita salvata." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "Fine" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Tasto Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pausa" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tasto di Tabulazione" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Backspace" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "Blocco Maiuscole" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "Fine" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Esc" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Tasto Home" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Inserisci" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Alt sinistro" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Ctrl sinistro" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Shift sinistro" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "Blocco Tastiera Numerica" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "Pagina giù" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "Pagina su" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pausa" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "Stampa Schermo" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Alt destro" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Ctrl destro" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Invio" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Shift destro" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "Blocco Scorrimento" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Spazio" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tasto di Tabulazione" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Mouse %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Asse %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Asse %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Tasto %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(nessuno)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Colpetto" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "'%s' non è più collegato a:" @@ -1613,16 +1926,16 @@ msgid "Base MP" msgstr "Mana base" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s secondo" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s secondi" diff --git a/mods/default/languages/engine.ja.po b/mods/default/languages/engine.ja.po index a2396dd..e3a6b6d 100644 --- a/mods/default/languages/engine.ja.po +++ b/mods/default/languages/engine.ja.po @@ -5,15 +5,16 @@ # # Translators: # Justin Jacobs , 2018 +# Ooyama Yosiyuki , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Justin Jacobs , 2018\n" +"Last-Translator: Ooyama Yosiyuki , 2019\n" "Language-Team: Japanese (https://www.transifex.com/flareorg/teams/84925/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,74 +22,83 @@ "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "ヘルスが低いです!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "おめでとう、 レベル %d に達している!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "キャラクターメニューを介して 1つの属性を高めることが可能です。" - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "あなたは負けてしまった。 ゲームオーバー! ${INPUT_CONTINUE} を押すと終了してタイトル画面に戻ります。" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "あなたは負けてしまった。 ${INPUT_CONTINUE} を押して続行します。" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "メニューのキャラクターを通して属性を上げることができます。" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "メニューのパワーを通してアビリティー解放ができます。" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s を失った。" -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s を失った。" -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "あなたは %d %s を入手する。" + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "あなたは %s x %d を入手する。" + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "あなたは %s を入手する。" -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "あなたは %s x %d を入手する。" - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "あなたは %d %s を入手する。" - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "あなたは %d XP を入手する。" -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "HP が回復した。" -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "MP が回復した。" -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "HP と MP が回復した。" -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "負の影響は排除" -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "HPとMPが回復、負の効果は除去" @@ -97,983 +107,1151 @@ "SDL software renderer\n" "\n" "Often slower, but less likely to have issues." -msgstr "" +msgstr "SDL ソフトウェアレンダラーはおそいですが、いくつかのトラブルを無くせるかもしれません。" #: ../../../src/DeviceList.cpp:59 msgid "" "SDL hardware renderer\n" "\n" "The default renderer that is often faster than the SDL software renderer." -msgstr "" - -#: ../../../src/EngineSettings.cpp:561 +msgstr "SDL ハードウェアレンダラーは標準設定であり、SDLソフトウェアレンダラーよりも速いでしょう。" + +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "冒険家" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "ミス" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d HP" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d MP" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "未知の目的地" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "読み込み中..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "セーブデータを削除" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "このセーブデータを削除しますか?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "タイトルに戻る" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "新しいゲーム" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "スロットを選択" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "話モッズを有効にして継続する" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "ゲームをロード" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "ゲームの世界に入ります..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "セーブデータをロードしています..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "レベル %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "キャンセル" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "作る" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "ランダム" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "肖像を選択" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "名前を選択" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "永久に死亡させますか?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "クラスを選択" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "ゲームをプレイ" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "コアモッズを有効にして続行" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "設定" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "クレジット" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "ゲームを終了" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "了解する" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "上" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "下" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "左" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "右" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "バー1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "バー2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "バー3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "バー4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "バー5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "バー6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "バー7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "バー8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "バー9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "バー0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "キャラクター" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "物品" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "能力" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "ログ" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "メイン1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "メイン2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "削除" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "アクションバー受入" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "アクションバー左" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "アクションバー右" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "アクションバー使用" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "左マウス" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "中央マウス" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "右マウス" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "マウスホイール アップ" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "マウスホイール ダウン" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "マウス X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "マウス X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "不明なアイテム" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% スピード" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% スピード" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "抵抗(%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "クエスト品" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "品質: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "吸収: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "吸収: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "レベル %d が必要です" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "%s %d が必要です" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "必要なクラス: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "購入価格: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "購入価格: %d %s ひとつあたり" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "売却価格: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "売却価格: %d %s ひとつあたり" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "組合わせ:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d アイテム:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "使用は[%s]" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "ホットキー: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "残り:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "名" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "レベル" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "%sエレメンタルの攻撃を受けたときのダメージを減らします。" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "XP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "次: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "基本 (%d), ボーナス (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "関連する統計:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "レベルごとに %d が付与されます。" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "%s の各点ごとに %d が付与されます。" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "クリア" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "割り当て:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "デフォルト" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "すべての設定をリセット?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "オーケー" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "キャンセル" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "続行" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "終了" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "ビデオ" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "オーディオ" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "インタフェース" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "入力" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "キー設定" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "モッズ" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "ポーズ" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "プレイ時間" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "フルスクリーンモード" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "ハードウェアサーフェス" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "ガンマの変更許可" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "ガンマ" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "効果音の音量" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "音楽の音量" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "効果音の音量" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "言語" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "FPSを表示" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "色盲モード" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "字幕" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "アクティブモッズ" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "利用可能モッズ" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< 無効" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "有効 >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "ゲーム:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "必要バージョン:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "必要モッズ:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "クリア" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "割り当て:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "ビデオ" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "入力" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "キー設定" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "戦闘のテキストを表示" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "ジョイスティック" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "マウスでキャラクターを動かす" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "マウスの狙い" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "マウスの不利用" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Joystick Deadzone" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "実験的" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "携帯電話モード" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "フルスクリーンモード" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "マウスでキャラクターを動かす" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "ハードウェアサーフェス" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "ガンマの変更許可" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "ガンマ" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "ジョイスティックを使用する" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "ジョイスティック" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "マウスの狙い" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "マウスの不利用" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Joystick Deadzone" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "読み込み中..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "セーブデータを削除" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "このセーブデータを削除しますか?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "タイトルに戻る" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "新しいゲーム" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "スロットを選択" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "話モッズを有効にして継続する" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "ゲームをロード" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "ゲームの世界に入ります..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "セーブデータをロードしています..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "レベル %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "作る" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "肖像を選択" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "名前を選択" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "永久に死亡させますか?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "クラスを選択" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "ゲームをプレイ" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "コアモッズを有効にして続行" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "設定" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "クレジット" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "ゲームを終了" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "了解する" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "上" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "下" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "左" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "右" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "バー1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "バー2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "バー3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "バー4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "バー5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "バー6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "バー7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "バー8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "バー9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "バー0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "キャラクター" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "物品" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "能力" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "ログ" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "メイン1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "メイン2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "削除" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "アクションバー受入" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "アクションバー左" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "アクションバー右" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "アクションバー使用" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "左マウス" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "中央マウス" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "右マウス" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "マウスホイール アップ" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "マウスホイール ダウン" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "マウス X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "マウス X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "不明なアイテム" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% スピード" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% スピード" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "クエスト品" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "品質: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "吸収: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "吸収: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "レベル %d が必要です" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "%s %d が必要です" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "必要なクラス: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "購入価格: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "購入価格: %d %s ひとつあたり" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "売却価格: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "売却価格: %d %s ひとつあたり" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "組合わせ:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d アイテム:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "戦闘のテキストを表示" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "ホットキー: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "残り:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "名" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "レベル" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "XP: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "次: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "基本 (%d), ボーナス (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "関連する統計:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "レベルごとに %d が付与されます。" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "%s の各点ごとに %d が付与されます。" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "アクティブモッズ" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "利用可能モッズ" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< 無効" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "有効 >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "ゲーム:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "必要バージョン:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "必要モッズ:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "セーブ & 終了" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "執行" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s レベル %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "死亡" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" -msgstr "" - -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "ポーズ" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "セーブ & 終了" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "終了" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "続行" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +msgstr "破壊ずみ" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "%s を %d%% 失った。" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "合計XPを %d%% 失った。" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "現在レベルXPを %d%% 失った。" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "%s を失った。" -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "使用または装備 (アイテム):" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "アイテム量の選択" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "各アイテムのスタッシュ:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "各アイテムの売買:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "必要なアイテムが充分ではない。" -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "この項目は、アクションバーだけから使用することができます。" -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "物品は満杯です。" -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "%s が足りない。" -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "このアイテムは売れない。" @@ -1085,347 +1263,485 @@ msgid "Quests" msgstr "クエスト" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "XP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "このアイテムを すてることは、できない。" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "量の入力:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "パッシブ スキル" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "費用は %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "費用は %d HP" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "クールダウン:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "ダメージ毎秒" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "HP毎秒" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "MP毎秒" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "動けなくする" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "まぬがれ" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "スタン" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "死からの自動復帰" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "魔法シールド" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "ヒーリング" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "はね返し" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "ベース精度" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "ベースのクリティカル機会" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "吸収を無視" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "回避を無視" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "%s が必要です" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "必要な能力: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "クリックすると解放(スキルポイントを1消費)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "スキルポイント 1 個が 必要です" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "次のレベル:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "共有スタッシュ" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "クエスト品はスタッシュには保管できない。" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "スタッシュは満杯です。" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "売買" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "買い戻し" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "売り手" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d シールド" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "" -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "この位置では、変身をとくことは、できない。" #: ../../../src/QuestLog.cpp:234 msgid "Completed Quests" -msgstr "" - -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +msgstr "完了したクエスト" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "ゲームをセーブしました。" -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1436,7 +1752,7 @@ #: ../../../src/Stats.cpp:39 msgid "Total amount of HP." -msgstr "" +msgstr "HP の 上限 です。" #: ../../../src/Stats.cpp:43 msgid "HP Regen" @@ -1452,7 +1768,7 @@ #: ../../../src/Stats.cpp:49 msgid "Total amount of MP." -msgstr "" +msgstr "MP の 上限 です。" #: ../../../src/Stats.cpp:53 msgid "MP Regen" @@ -1488,7 +1804,7 @@ #: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 msgid "Reduces the amount of damage taken." -msgstr "" +msgstr "攻撃を受けたときの ダメージ が どんだけ へるか のポイント" #: ../../../src/Stats.cpp:73 msgid "Absorb Max" @@ -1584,16 +1900,16 @@ msgid "Base MP" msgstr "ベースMP" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "千" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s 秒" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s 秒" diff --git a/mods/default/languages/engine.ko.po b/mods/default/languages/engine.ko.po new file mode 100644 index 0000000..d875f1c --- /dev/null +++ b/mods/default/languages/engine.ko.po @@ -0,0 +1,1922 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# bnk159hair , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" +"PO-Revision-Date: 2018-03-28 19:16+0000\n" +"Last-Translator: bnk159hair , 2020\n" +"Language-Team: Korean (https://www.transifex.com/flareorg/teams/84925/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "체력이 낮습니다!" + +#: ../../../src/Avatar.cpp:421 +#, c-format +msgid "Congratulations, you have reached level %d!" +msgstr "축하합니다. 레벨이 %d로 올랐습니다!" + +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "캐릭터 메뉴를 통해 하나 이상의 속성을 증가시킬 수 있습니다." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "능력창을 통해서 하나 이상의 능력을 얻을 수 있습니다." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 +msgid "Transformation expired. You have been moved back to a safe place." +msgstr "변신이 끝났습니다. 안전한 장소로 이동되었습니다." + +#: ../../../src/CampaignManager.cpp:152 +#, c-format +msgid "%d %s removed." +msgstr "%d %s 제거되었습니다." + +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "%s x%d 제거되었습니다." + +#: ../../../src/CampaignManager.cpp:173 +#, c-format +msgid "%s removed." +msgstr "%s제거되었습니다. " + +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "" + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "" + +#: ../../../src/CampaignManager.cpp:193 +#, c-format +msgid "You receive %s." +msgstr "" + +#: ../../../src/CampaignManager.cpp:210 +#, c-format +msgid "You receive %d XP." +msgstr "" + +#: ../../../src/CampaignManager.cpp:216 +msgid "HP restored." +msgstr "체력이 회복되었습니다." + +#: ../../../src/CampaignManager.cpp:220 +msgid "MP restored." +msgstr "마나가 회복되었습니다." + +#: ../../../src/CampaignManager.cpp:225 +msgid "HP and MP restored." +msgstr "체력과 마나가 회복되었습니다." + +#: ../../../src/CampaignManager.cpp:229 +msgid "Negative effects removed." +msgstr "디버프 효과가 해제되었습니다." + +#: ../../../src/CampaignManager.cpp:235 +msgid "HP and MP restored, negative effects removed" +msgstr "체력과 마나가 회복되고, 디버프 효과가 해제되었습니다." + +#: ../../../src/DeviceList.cpp:56 +msgid "" +"SDL software renderer\n" +"\n" +"Often slower, but less likely to have issues." +msgstr "" + +#: ../../../src/DeviceList.cpp:59 +msgid "" +"SDL hardware renderer\n" +"\n" +"The default renderer that is often faster than the SDL software renderer." +msgstr "" + +#: ../../../src/EngineSettings.cpp:586 +msgid "Adventurer" +msgstr "모험가" + +#: ../../../src/Entity.cpp:527 +msgid "miss" +msgstr "" + +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 +#, c-format +msgid "+%d HP" +msgstr "" + +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 +#, c-format +msgid "+%d MP" +msgstr "" + +#: ../../../src/EventManager.cpp:792 +msgid "Unknown destination" +msgstr "알려지지 않은 장소" + +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "로딩중..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "세이브 삭제" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "현재 세이브가 삭제되었습니다." + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "타이틀로 나가기" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "게임 새로 시작하기" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "슬롯 선택하기" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "계속하기 위해 스토리 모드 선택" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "게임 불러오기" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "게임 월드로 들어가는 중..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "저장된 게임 불러오는 중..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "손상된 세이브" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "취소" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "생성" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "랜덤" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "프로필 이미지 선택" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "이름 선택" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "부활할 수 없는 죽음?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "직업을 선택하세요" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "게임 플레이" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "계속하기 위해 코어 모드 활성화" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "설정" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "개발진" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "게임 나가기" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 +msgid "Defaults" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 +msgid "Reset ALL settings?" +msgstr "" + +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 +msgid "OK" +msgstr "" + +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "" + +#: ../../../src/MenuConfig.cpp:336 +msgid "Audio" +msgstr "" + +#: ../../../src/MenuConfig.cpp:337 +msgid "Interface" +msgstr "" + +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "" + +#: ../../../src/MenuConfig.cpp:340 +msgid "Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "" + +#: ../../../src/MenuConfig.cpp:372 +msgid "Music Volume" +msgstr "" + +#: ../../../src/MenuConfig.cpp:374 +msgid "Language" +msgstr "" + +#: ../../../src/MenuConfig.cpp:375 +msgid "Show FPS" +msgstr "" + +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 +msgid "Colorblind Mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:378 +msgid "Developer Mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:379 +msgid "Subtitles" +msgstr "" + +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 +msgid "" +"Will try to store surfaces in video memory versus system memory. The effect " +"this has on performance depends on the renderer." +msgstr "" + +#: ../../../src/MenuConfig.cpp:512 +msgid "" +"Prevents screen tearing. Disable if you experience \"stuttering\" in " +"windowed mode or input lag." +msgstr "" + +#: ../../../src/MenuConfig.cpp:513 +msgid "" +"When enabled, this uses the screen DPI in addition to the window dimensions " +"to scale the rendering resolution. Otherwise, only the window dimensions are" +" used." +msgstr "" + +#: ../../../src/MenuConfig.cpp:514 +msgid "" +"This enables parallax (non-tile) layers. Disabling this setting can improve " +"performance in some cases." +msgstr "" + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:65 +msgid "Execute" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 +msgid "Developer Console" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:143 +#, c-format +msgid "Use '%s' to inspect with the cursor." +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:148 +msgid "Arguments with spaces should be enclosed with double quotes. Example:" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:149 +msgid "Type 'help' to get a list of commands." +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 +msgid "px" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:226 +msgid "Distance" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 +msgid "Entity" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 +msgid "none" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 +msgid "wall" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 +msgid "short wall / pit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:268 +msgid "entity" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:269 +msgid "entity, ally" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:276 +msgid "Tile" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:377 +msgid "adds a power to the action bar" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:378 +msgid "turns on/off the display of the FPS counter" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:379 +msgid "turns on/off all of the HUD elements" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:380 +msgid "turns on/off the developer hud" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:381 +msgid "" +"Prints a list of powers that match a search term. No search term will list " +"all items" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:382 +msgid "Prints out all the map filenames located in the \"maps/\" directory." +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:383 +msgid "" +"Prints out the active campaign statuses that match a search term. No search " +"term will list all active statuses" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:384 +msgid "" +"Prints a list of items that match a search term. No search term will list " +"all items" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:385 +msgid "" +"parses a series of event components and executes them as a single event" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:386 +msgid "clears the command history" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:387 +msgid "displays this text" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:394 +msgid "Toggled the developer hud" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:398 +msgid "Toggled the hud" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:402 +msgid "Toggled the FPS counter" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:552 +msgid "ERROR: Incorrect number of arguments" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 +msgid "HINT:" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:554 +msgid "" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:570 +#, c-format +msgid "ERROR: '%s' is not a valid event key" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:580 +msgid "ERROR: Too few arguments" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:582 +msgid "= = ..." +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:587 +msgid "ERROR: Unknown command" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:589 +msgid "HINT: Type help" +msgstr "" + +#: ../../../src/MenuEnemy.cpp:162 +#, c-format +msgid "%s level %d" +msgstr "" + +#: ../../../src/MenuEnemy.cpp:186 +msgid "Dead" +msgstr "" + +#: ../../../src/MenuEnemy.cpp:188 +msgid "Destroyed" +msgstr "" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 +#, c-format +msgid "Lost %d%% of %s." +msgstr "" + +#: ../../../src/MenuInventory.cpp:185 +#, c-format +msgid "Lost %d%% of total XP." +msgstr "" + +#: ../../../src/MenuInventory.cpp:190 +#, c-format +msgid "Lost %d%% of current level XP." +msgstr "" + +#: ../../../src/MenuInventory.cpp:216 +#, c-format +msgid "Lost %s." +msgstr "" + +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 +#, c-format +msgid "%d %s" +msgstr "" + +#: ../../../src/MenuInventory.cpp:301 +msgid "Pick up item(s):" +msgstr "" + +#: ../../../src/MenuInventory.cpp:302 +msgid "Use or equip item:" +msgstr "" + +#: ../../../src/MenuInventory.cpp:303 +#, c-format +msgid "%s modifiers" +msgstr "" + +#: ../../../src/MenuInventory.cpp:304 +msgid "Select a quantity of item:" +msgstr "" + +#: ../../../src/MenuInventory.cpp:307 +msgid "Stash item stack:" +msgstr "" + +#: ../../../src/MenuInventory.cpp:309 +msgid "Sell item stack:" +msgstr "" + +#: ../../../src/MenuInventory.cpp:576 +msgid "You don't have enough of the required item." +msgstr "" + +#: ../../../src/MenuInventory.cpp:588 +msgid "You can't use this item right now." +msgstr "" + +#: ../../../src/MenuInventory.cpp:600 +msgid "This item can only be used from the action bar." +msgstr "" + +#: ../../../src/MenuInventory.cpp:718 +msgid "Inventory is full." +msgstr "" + +#: ../../../src/MenuInventory.cpp:843 +#, c-format +msgid "Not enough %s." +msgstr "" + +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 +msgid "This item can not be sold." +msgstr "" + +#: ../../../src/MenuLog.cpp:91 +msgid "Notes" +msgstr "" + +#: ../../../src/MenuLog.cpp:92 +msgid "Quests" +msgstr "" + +#: ../../../src/MenuManager.cpp:305 +#, c-format +msgid "XP: %d/%d" +msgstr "" + +#: ../../../src/MenuManager.cpp:875 +msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" + +#: ../../../src/MenuNumPicker.cpp:59 +msgid "Enter amount:" +msgstr "" + +#: ../../../src/MenuPowers.cpp:872 +msgid "Passive" +msgstr "" + +#: ../../../src/MenuPowers.cpp:879 +#, c-format +msgid "Costs %d MP" +msgstr "" + +#: ../../../src/MenuPowers.cpp:883 +#, c-format +msgid "Costs %d HP" +msgstr "" + +#: ../../../src/MenuPowers.cpp:887 +msgid "Cooldown:" +msgstr "" + +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 +msgid "Damage per second" +msgstr "" + +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 +msgid "HP per second" +msgstr "" + +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 +msgid "MP per second" +msgstr "" + +#: ../../../src/MenuPowers.cpp:957 +msgid "Immobilize" +msgstr "" + +#: ../../../src/MenuPowers.cpp:965 +msgid "Immunity" +msgstr "" + +#: ../../../src/MenuPowers.cpp:968 +msgid "Immunity to damage over time" +msgstr "" + +#: ../../../src/MenuPowers.cpp:971 +msgid "Immunity to slow" +msgstr "" + +#: ../../../src/MenuPowers.cpp:974 +msgid "Immunity to stun" +msgstr "" + +#: ../../../src/MenuPowers.cpp:977 +msgid "Immunity to HP steal" +msgstr "" + +#: ../../../src/MenuPowers.cpp:980 +msgid "Immunity to MP steal" +msgstr "" + +#: ../../../src/MenuPowers.cpp:983 +msgid "Immunity to knockback" +msgstr "" + +#: ../../../src/MenuPowers.cpp:986 +msgid "Immunity to damage reflection" +msgstr "" + +#: ../../../src/MenuPowers.cpp:992 +msgid "Stun" +msgstr "" + +#: ../../../src/MenuPowers.cpp:995 +msgid "Automatic revive on death" +msgstr "" + +#: ../../../src/MenuPowers.cpp:998 +msgid "Convert" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1001 +msgid "Fear" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1004 +msgid "Lifespan" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1028 +msgid "Magical Shield" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1057 +msgid "Healing" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1060 +msgid "Knockback" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1084 +#, c-format +msgid "%d%% chance" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1136 +msgid "Base Accuracy" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1156 +msgid "Base Critical Chance" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1164 +msgid "Ignores Absorbtion" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1169 +msgid "Ignores Avoidance" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1174 +#, c-format +msgid "%d%% Chance to crit slowed targets" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1179 +#, c-format +msgid "Elemental Damage (%s)" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1188 +#, c-format +msgid "Requires a %s" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 +#, c-format +msgid "Requires Power: %s" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1238 +msgid "Click to Unlock (uses 1 Skill Point)" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 +msgid "Requires 1 Skill Point" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 +msgid "Next Level:" +msgstr "" + +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 +msgid "Stash is full." +msgstr "" + +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 +msgid "Trade" +msgstr "" + +#: ../../../src/MenuVendor.cpp:60 +msgid "Buyback" +msgstr "" + +#: ../../../src/MenuVendor.cpp:283 +msgid "Vendor" +msgstr "" + +#: ../../../src/PowerManager.cpp:1208 +#, c-format +msgid "+%d Shield" +msgstr "" + +#: ../../../src/PowerManager.cpp:1465 +msgid "You are already transformed, untransform first." +msgstr "" + +#: ../../../src/PowerManager.cpp:1477 +msgid "Could not untransform at this position." +msgstr "" + +#: ../../../src/QuestLog.cpp:234 +msgid "Completed Quests" +msgstr "" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 +msgid "Game saved." +msgstr "" + +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 +msgid "Backspace" +msgstr "" + +#: ../../../src/SDLInputState.cpp:674 +msgid "CapsLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:678 +msgid "Escape" +msgstr "" + +#: ../../../src/SDLInputState.cpp:680 +msgid "Insert" +msgstr "" + +#: ../../../src/SDLInputState.cpp:681 +msgid "Left Alt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:682 +msgid "Left Ctrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:684 +msgid "Left Shift" +msgstr "" + +#: ../../../src/SDLInputState.cpp:685 +msgid "NumLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:686 +msgid "PageDown" +msgstr "" + +#: ../../../src/SDLInputState.cpp:687 +msgid "PageUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:689 +msgid "PrintScreen" +msgstr "" + +#: ../../../src/SDLInputState.cpp:690 +msgid "Right Alt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:691 +msgid "Right Ctrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:692 +msgid "Return" +msgstr "" + +#: ../../../src/SDLInputState.cpp:694 +msgid "Right Shift" +msgstr "" + +#: ../../../src/SDLInputState.cpp:695 +msgid "ScrollLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:696 +msgid "Space" +msgstr "" + +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 +#, c-format +msgid "Mouse %d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 +#, c-format +msgid "Axis %d -" +msgstr "" + +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 +#, c-format +msgid "Axis %d +" +msgstr "" + +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 +#, c-format +msgid "Button %d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:787 +msgid "Touch control D-Pad" +msgstr "" + +#: ../../../src/SDLInputState.cpp:810 +msgid "Touch control buttons" +msgstr "" + +#: ../../../src/SDLInputState.cpp:824 +msgid "Tap" +msgstr "" + +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 +#, c-format +msgid "'%s' is no longer bound to:" +msgstr "" + +#: ../../../src/Stats.cpp:38 +msgid "Max HP" +msgstr "" + +#: ../../../src/Stats.cpp:39 +msgid "Total amount of HP." +msgstr "" + +#: ../../../src/Stats.cpp:43 +msgid "HP Regen" +msgstr "" + +#: ../../../src/Stats.cpp:44 +msgid "Ticks of HP regen per minute." +msgstr "" + +#: ../../../src/Stats.cpp:48 +msgid "Max MP" +msgstr "" + +#: ../../../src/Stats.cpp:49 +msgid "Total amount of MP." +msgstr "" + +#: ../../../src/Stats.cpp:53 +msgid "MP Regen" +msgstr "" + +#: ../../../src/Stats.cpp:54 +msgid "Ticks of MP regen per minute." +msgstr "" + +#: ../../../src/Stats.cpp:58 +msgid "Accuracy" +msgstr "" + +#: ../../../src/Stats.cpp:59 +msgid "" +"Accuracy rating. The enemy's Avoidance rating is subtracted from this value " +"to calculate your likeliness to land a direct hit." +msgstr "" + +#: ../../../src/Stats.cpp:63 +msgid "Avoidance" +msgstr "" + +#: ../../../src/Stats.cpp:64 +msgid "" +"Avoidance rating. This value is subtracted from the enemy's Accuracy rating " +"to calculate their likeliness to land a direct hit." +msgstr "" + +#: ../../../src/Stats.cpp:68 +msgid "Absorb Min" +msgstr "" + +#: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 +msgid "Reduces the amount of damage taken." +msgstr "" + +#: ../../../src/Stats.cpp:73 +msgid "Absorb Max" +msgstr "" + +#: ../../../src/Stats.cpp:78 +msgid "Critical Hit Chance" +msgstr "" + +#: ../../../src/Stats.cpp:79 +msgid "Chance for an attack to do extra damage." +msgstr "" + +#: ../../../src/Stats.cpp:83 +msgid "Bonus XP" +msgstr "" + +#: ../../../src/Stats.cpp:84 +msgid "Increases the XP gained per kill." +msgstr "" + +#: ../../../src/Stats.cpp:88 +#, c-format +msgid "Bonus %s" +msgstr "" + +#: ../../../src/Stats.cpp:89 +#, c-format +msgid "Increases the %s found per drop." +msgstr "" + +#: ../../../src/Stats.cpp:93 +msgid "Item Find Chance" +msgstr "" + +#: ../../../src/Stats.cpp:94 +msgid "Increases the chance that an enemy will drop an item." +msgstr "" + +#: ../../../src/Stats.cpp:98 +msgid "Stealth" +msgstr "" + +#: ../../../src/Stats.cpp:99 +msgid "Increases your ability to move undetected." +msgstr "" + +#: ../../../src/Stats.cpp:103 +msgid "Poise" +msgstr "" + +#: ../../../src/Stats.cpp:104 +msgid "Reduces your chance of stumbling when hit." +msgstr "" + +#: ../../../src/Stats.cpp:108 +msgid "Missile Reflect Chance" +msgstr "" + +#: ../../../src/Stats.cpp:109 +msgid "Increases your chance of reflecting missiles back at enemies." +msgstr "" + +#: ../../../src/Stats.cpp:113 +msgid "Damage Reflection" +msgstr "" + +#: ../../../src/Stats.cpp:114 +msgid "Deals a percentage of damage taken back to the attacker." +msgstr "" + +#: ../../../src/Stats.cpp:118 +msgid "HP Steal" +msgstr "" + +#: ../../../src/Stats.cpp:119 +msgid "Percentage of HP stolen per hit." +msgstr "" + +#: ../../../src/Stats.cpp:123 +msgid "MP Steal" +msgstr "" + +#: ../../../src/Stats.cpp:124 +msgid "Percentage of MP stolen per hit." +msgstr "" + +#: ../../../src/Stats.cpp:128 +msgid "Base HP" +msgstr "" + +#: ../../../src/Stats.cpp:133 +msgid "Base MP" +msgstr "" + +#: ../../../src/Utils.cpp:365 +msgid "k" +msgstr "" + +#: ../../../src/Utils.cpp:635 +#, c-format +msgid "%s second" +msgstr "" + +#: ../../../src/Utils.cpp:638 +#, c-format +msgid "%s seconds" +msgstr "" + +#: ../../../src/Version.cpp:139 +msgid "or newer" +msgstr "" + +#: ../../../src/Version.cpp:142 +msgid "or older" +msgstr "" diff --git a/mods/default/languages/engine.nb.po b/mods/default/languages/engine.nb.po index 55d411b..cdfd003 100644 --- a/mods/default/languages/engine.nb.po +++ b/mods/default/languages/engine.nb.po @@ -5,15 +5,16 @@ # # Translators: # Justin Jacobs , 2018 +# Elias Nykrem , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Justin Jacobs , 2018\n" +"Last-Translator: Elias Nykrem , 2019\n" "Language-Team: Norwegian Bokmål (https://www.transifex.com/flareorg/teams/84925/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,78 +22,85 @@ "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Helsen din er lav!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Gratulerer, du har nådd nivå %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "" - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Du har blitt beseiret. Spillet er slutt! Trykk ${INPUT_CONTINUE} for å gå " -"til hovedmenyen." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Du har blitt beseiret. Trykk ${INPUT_CONTINUE} for å fortsette." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Du kan øke en eller flere egenskaper gjennom Karaktermenyen." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Du kan øke en eller flere ferdigheter gjennom Evnemenyen." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." -msgstr "" - -#: ../../../src/CampaignManager.cpp:153 +msgstr "Forvandling utgått. Du har blitt flyttet tilbake til et trygt sted." + +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s fjernet." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s fjernet." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Du mottar %s x%d." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Du mottar %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Du mottar %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Du mottar %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Du mottar %s x%d." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." -msgstr "" - -#: ../../../src/CampaignManager.cpp:201 +msgstr "Du mottar %d EP." + +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." -msgstr "" - -#: ../../../src/CampaignManager.cpp:205 +msgstr "HP gjenopprettet." + +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." -msgstr "" - -#: ../../../src/CampaignManager.cpp:210 +msgstr "MP gjenopprettet." + +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." -msgstr "" - -#: ../../../src/CampaignManager.cpp:214 +msgstr "HP og MP gjenopprettet." + +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Negative effekter fjernet." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" -msgstr "" +msgstr "HP og MP gjenopprettet, og negative effekter fjernet" #: ../../../src/DeviceList.cpp:56 msgid "" @@ -100,6 +108,9 @@ "\n" "Often slower, but less likely to have issues." msgstr "" +"SDL programvare rendering\n" +"\n" +"Ofte tregere, men mindre sannsynlighet for problemer." #: ../../../src/DeviceList.cpp:59 msgid "" @@ -107,975 +118,1187 @@ "\n" "The default renderer that is often faster than the SDL software renderer." msgstr "" - -#: ../../../src/EngineSettings.cpp:561 +"SDL maskinvare rendering\n" +"\n" +"Standard renderingsmetode som ofte er raskere en SDL programvare rendering." + +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Eventyrer" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "bom" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" -msgstr "" - -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +msgstr "+%d HP" + +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" -msgstr "" - -#: ../../../src/EventManager.cpp:738 +msgstr "+%d MP" + +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Ukjent destinasjon" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Laster..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Slett lagret spill" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Slett dette spillet?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Avslutt til hovedmeny" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nytt spill" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Velg en plass" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Aktiver en historie tilleggspakke for å fortsette" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Last spill" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Åpner spillverden..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Laster lagret spill..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Ugyldig spill" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Nivå %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Avbryt" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Opprett" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Tilfeldiggjør" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Velg et portrett" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Velg et navn" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Permanent død?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Velg en klasse" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Start spill" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Aktiver en kjerne tilleggspakke for å fortsette" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Innstillinger" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Takk til" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Avslutt spill" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Godta" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Opp" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Ned" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Venstre" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Høyre" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Felt1 " + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Felt2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Felt3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Felt4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Felt5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Felt6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Felt7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Felt8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Felt9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Felt0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Karakter" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventar" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Evner" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Logg" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Hoved1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Hoved2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Delete" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Handlingsfelt Aksepter" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Handlingsfelt Venstre" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Handlingsfelt Høyre" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Handlingsfelt Bruk" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Utviklermeny" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Venstre Museknapp" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Musehjul Knapp" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Høyre Museknapp" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Hjul Opp" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Hjul Ned" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Mus X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Mus X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Ukjent gjenstand" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Hastighet" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Angrepshastighet" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Motstandsdyktighet (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Krever %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Oppdragsgjenstand" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Kvalitet: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorberer: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorberer: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Krever nivå %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Krever %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Krever klasse: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Kjøp for: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Kjøp for: %d %s hver" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Selg for: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Selg for: %d %s hver" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Still:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d gjenstander:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Trykk [%s] for å lese" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Trykk [%s] for å bruke" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Hurtigtast: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Ikke nok MP." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Ubrukte:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d stabler" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Navn" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Nivå" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Minsker skade tatt fra \"%s\" elementangrep." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "EP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Neste: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "base (%d), bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Relaterte ferdigheter:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Hvert nivå bevilger %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Hvert poeng i %s bevilger %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Nullstill" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Tildel:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Standard" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Still tilbake ALLE innstillinger?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Ok" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Avbryt" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Fortsett" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Standard" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Vis alle verktøytips for gods, bortsett fra de som ville være tildekt av " +"spilleren eller en fiende. Midlertidig vis alle verktøytips for gods med " +"'Alt'." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Vis alt" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Alltid vis verktøytips for gods. Midlertidig skjul alle verktøytips for gods" +" med 'Alt'." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Skjult" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Skjul alltid verktøytips for gods, bortsett fra når du holder musepekeren " +"over godset. Midlertidig vis alle verktøytips for gods med 'Alt'." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Synlig" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Synlig (2x forstørring)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Kontrollerer typen advarsler som aktiveres når spillerens helse havner under" +" minimumsterskelen for helse." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Vis en beskjed" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Spill av en lyd" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Endre musepekeren" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Deaktivert" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Alt" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Melding og musepeker" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Melding og lyd" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Lyd og musepeker" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Melding" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Musepeker" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Lyd" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Når spillerens helse faller under den oppførte terskelen, vises minimums " +"helsebeskjedene dersom en eller flere av de er aktivert." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Avslutt" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Video" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Lyd" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Grensesnitt" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Inndata" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Hurtigtaster" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +msgstr "Tilleggspakker" + +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Pauset" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Tid spilt" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Rendering" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Fullskjerm" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Maskinvare flater" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "Vertikal Synkronisering" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Teksturfiltrering" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "DPI skalering" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Parallakse lag" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Tillat endring av lysstyrke" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Lysstyrke" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Lydvolum" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Musikkvolum" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Lydvolum" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Språk" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:270 +msgstr "Vis bildefrekvens" + +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Maskinvare musepeker" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Modus for fargeblinde" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Utviklermodus" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Undertekster" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Deaktiver" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Aktiver >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Nullstill" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Video" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Hurtigtaster" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Synlighet for gods verktøytips" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Miniatyrkart modus" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Vis alltid etiketter for ferdigheter" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Tillat automatisk skjuling av ferdighetsfelt" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Vis tekst i kamp" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Automatisk utruste gjenstander" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Vis skjulte enhetsmarkører " + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "lav helsevarsel" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Minimum helseterskel" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Flytt helten med musepeker" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Sikte med musepekeren" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Ikke bruk mus" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Endre knapp for musebevegelse" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Angrip med musebevegelse" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Joystick dødsone" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Primær binding: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Alternativ binding: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Joystick binding: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:189 +"Vil prøve å lagre flatene i videominne kontra systemminne. Effekten dette " +"har på ytelsen kommer an på renderingen" + +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:190 +"Forhindrer skjermrift. Deaktiver hvis du opplever \"hakking\" i vindu modus " +"eller inndata forsinkelse. " + +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:191 +"Når aktivert, brukes skjerm DPI-en i tillegg til vindusdimensjonene for å " +"skalere renderings oppløsningen. Ellers, blir bare vindusdimensjonene brukt." + +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Eksperimentell" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "For håndholdte enheter" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Fullskjerm" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Flytt helten med musepeker" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Teksturfiltrering" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Tillat endring av lysstyrke" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Lysstyrke" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Bruk joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Sikte med musepekeren" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Ikke bruk mus" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Joystick dødsone" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Laster..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Slett lagret spill" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Slett dette spillet?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Avslutt til hovedmeny" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nytt spill" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Velg en plass" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Last spill" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Åpner spillverden..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Laster lagret spill..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Nivå %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Opprett" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Velg et portrett" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Velg et navn" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Permanent død?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Velg en klasse" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Start spill" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Innstillinger" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Avslutt spill" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Godta" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Opp" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Ned" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Venstre" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Høyre" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Karakter" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Krefter" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Logg" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Hoved1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Hoved2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Delete" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Utviklermeny" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Hjul Opp" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Hjul Ned" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Ukjent gjenstand" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Hastighet" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Angrepshastighet" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Kvalitet: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorberer: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorberer: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Krever nivå %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Krever %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Krever klasse: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Kjøp for: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Kjøp for: %d %s hver" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Selg for: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Selg for: %d %s hver" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Vis tekst i kamp" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Hurtigtast: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Ubrukte:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Navn" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Nivå" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Neste: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +"Dette aktiverer parallakse (ikke-flis) lag. Å deaktivere denne innstillingen" +" kan forbedre ytelsen i enkelte tilfeller." + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Aktiverer innstillingen under som justerer skjermens gamma nivå. " +"Innstillingens oppførsel kan variere mellom ulike plattformer." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Tilbyr tilleggsinformasjon gjennom tekst som ellers hovedsakelig " +"kommuniseres gjennom farge." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Noen tilleggspakker vil automatisk skjule ferdighetsfelt når de er inaktive. \n" +"Deaktivering av dette valget vil alltid holde dem synlige" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Når aktivert, vil tomme verktøyrom fylles med aktuelle gjenstander når de " +"anskaffes." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Vis en markør over fiender, allierte og spilleren når de er tildekt bak høye" +" objekter." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" +"Dette tillater spillet å bli kontrollert fullhent med tastaturet (eller en " +"joystick)." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Når 'Flytt helten med musepeker' er aktivert, vil denne instillingen " +"kontrolere om 'Hoved1' eller 'Hoved2' brukes for å flytte helten. Dersom " +"aktivert, vil 'Hoved2' flytte helten i stedet for 'Hoved1'." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Når 'Flytt helten med musepeker' er aktivert, vil denne innstillingen " +"kontrollere om Evnen som er bundet til bevegelsesknappen kan brukes ved å " +"sikte seg inn på en fiende. Dersom denne innstillingen er deaktivert, kreves" +" det at man bruker 'Shift' for å benytte Evner som er bundet til " +"bevegelsesknappen." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Spillerens angrep vil siktes i retning av musepekeren dersom dette er " +"aktivert." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Aktive tilleggspakker" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Tilgjengelige tilleggspakker" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Deaktiver" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Aktiver >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Versjon:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Spill:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Spillmotor versjon:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Krever følgende tilleggspakker:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(ingen)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Lagre og avslutt" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Utfør" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Utviklerkonsoll" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:146 +msgstr "Bruk '%s' for å utforske med musepekeren." + +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:147 +msgstr "Argumenter med mellomrom skal innrammes med hermetegn. Eksempel:" + +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +msgstr "Skriv 'help' for å motta en liste over tilgjengelige kommandoer." + +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:224 +msgstr "px" + +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +msgstr "Distanse" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +msgstr "Enhet" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +msgstr "ingen" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +msgstr "vegg" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:266 +msgstr "kort vegg / grop" + +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:267 +msgstr "enhet" + +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:274 +msgstr "enhet, alliert" + +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:360 +msgstr "Flis" + +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:361 +msgstr "legger til en evne i handlingsfeltet" + +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:362 +msgstr "Skru på/av visningen av FPS telleren" + +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:363 +msgstr "Skru på/av alle HUD elementer" + +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:364 +msgstr "slår på/av utvikler HUD" + +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "tømmer kommando-historikk" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "viser denne teksten" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:381 +msgstr "Slo på/av utvikler HUD" + +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:385 +msgstr "Slo på/av HUD" + +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:534 +msgstr "Slo på/av FPS teller" + +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "FEIL: Feil antall argumenter" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 +msgstr "HINT:" + +#: ../../../src/MenuDevConsole.cpp:554 msgid "" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:552 +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:562 +msgstr "FEIL: '%s' er ikke en gyldig eventknapp" + +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "FEIL: For få argumenter" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:569 +msgstr "= = ..." + +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "FEIL: Ukjent kommando" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "HINT: Skriv help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s nivå %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Død" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" -msgstr "" - -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Pauset" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Lagre og avslutt" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Avslutt" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Fortsett" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +msgstr "Tilintetgjort" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:195 +msgstr "Mistet %d%% av %s." + +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:200 +msgstr "Mistet %d%% av total EP." + +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:226 +msgstr "Mistet %d%% av det nåværende nivåets EP." + +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Mistet %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Plukk opp gjenstand(er):" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:319 +msgstr "Benytt eller bruk gjenstand:" + +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" -msgstr "" - -#: ../../../src/MenuInventory.cpp:320 +msgstr "%s modifikatorer" + +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" -msgstr "Velg et antall:" - -#: ../../../src/MenuInventory.cpp:323 +msgstr "Velg et antall av gjenstandene:" + +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:325 +msgstr "Lagre gjenstandsstabel:" + +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:592 +msgstr "Selg gjenstandsstabel:" + +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." -msgstr "" - -#: ../../../src/MenuInventory.cpp:599 +msgstr "Du har ikke nok av den påkrevde gjenstanden. " + +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." -msgstr "" - -#: ../../../src/MenuInventory.cpp:611 +msgstr "Du kan ikke bruke denne gjenstanden akkurat nå." + +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." -msgstr "" - -#: ../../../src/MenuInventory.cpp:729 +msgstr "Denne gjenstanden kan bare brukes fra handlingsfeltet." + +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Du har ikke plass til flere gjenstander." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Ikke nok %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Du kan ikke selge denne gjenstanden." @@ -1087,382 +1310,520 @@ msgid "Quests" msgstr "Oppdrag" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" -msgstr "" - -#: ../../../src/MenuManager.cpp:827 +msgstr "EP: %d/%d" + +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "Denne gjenstanden kan ikke slippes." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" -msgstr "" - -#: ../../../src/MenuPowers.cpp:787 +msgstr "Oppgi mengd:" + +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" -msgstr "" - -#: ../../../src/MenuPowers.cpp:792 +msgstr "Passiv" + +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" -msgstr "" - -#: ../../../src/MenuPowers.cpp:796 +msgstr "Koster %d MP" + +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" -msgstr "" - -#: ../../../src/MenuPowers.cpp:801 +msgstr "Koster %d HP" + +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" -msgstr "" - -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +msgstr "Nedkjøling:" + +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Skade per sekund" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" -msgstr "" - -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +msgstr "HP per sekund" + +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" -msgstr "" - -#: ../../../src/MenuPowers.cpp:885 +msgstr "MP per sekund" + +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" -msgstr "" - -#: ../../../src/MenuPowers.cpp:893 +msgstr "Immobilisere" + +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Immunitet" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Immun mot skade over tid" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" -msgstr "" - -#: ../../../src/MenuPowers.cpp:902 +msgstr "Immunitet mot hastighetsredusering" + +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" -msgstr "" - -#: ../../../src/MenuPowers.cpp:905 +msgstr "Immunitet mot lamslåing" + +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" -msgstr "" - -#: ../../../src/MenuPowers.cpp:908 +msgstr "Immunitet mot HP-stjeling" + +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" -msgstr "" - -#: ../../../src/MenuPowers.cpp:911 +msgstr "Immunitet mot MP-stjeling" + +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" -msgstr "" - -#: ../../../src/MenuPowers.cpp:914 +msgstr "Immunitet mot tilbakeslag" + +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" -msgstr "" - -#: ../../../src/MenuPowers.cpp:917 +msgstr "Immunitet mot skaderefleksjon" + +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" -msgstr "" - -#: ../../../src/MenuPowers.cpp:920 +msgstr "Lamslå" + +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" -msgstr "" - -#: ../../../src/MenuPowers.cpp:923 +msgstr "Gjenoppliv automatisk ved død" + +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" -msgstr "" - -#: ../../../src/MenuPowers.cpp:926 +msgstr "Konverter" + +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Frykt" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" -msgstr "" - -#: ../../../src/MenuPowers.cpp:953 +msgstr "Levetid" + +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Magisk skjold" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" -msgstr "" - -#: ../../../src/MenuPowers.cpp:985 +msgstr "Helbreding" + +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1010 +msgstr "Tilbakeslag" + +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% sjanse" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1082 +msgstr "Kjerne Treffsikkerhet" + +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1090 +msgstr "Kjerne Kritisk Sjanse" + +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1095 +msgstr "Ignorerer Absorbering " + +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1100 +msgstr "Ignorerer Unnvikelse" + +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1105 +msgstr "%d%% Sjanse for å kritisk skade hastighetsreduserte mål" + +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1114 +msgstr "Element Skade (%s)" + +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Krever en %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1163 +msgstr "Krever Evne: %s" + +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +msgstr "Klikk for å låse opp (bruker 1 evnepoeng)" + +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +msgstr "Krever 1 evnepoeng" + +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Neste nivå:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Delt kiste" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Lager" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "Privat" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "Delt" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Denne gjenstanden kan ikke oppbevares i lageret. " + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Denne gjenstanden kan ikke oppbevares i privatlageret." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "Denne gjenstanden kan ikke oppbevares i det delte lageret." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." -msgstr "Kisten er full." - -#: ../../../src/MenuTalker.cpp:454 +msgstr "Lageret er fullt." + +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Kan ikke oppbevare gjenstander i lageret: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Handle" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" -msgstr "" - -#: ../../../src/MenuVendor.cpp:279 +msgstr "Kjøp tilbake" + +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" -msgstr "" - -#: ../../../src/PowerManager.cpp:1136 +msgstr "Selger" + +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Skjold" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." -msgstr "" - -#: ../../../src/PowerManager.cpp:1404 +msgstr "Du er allerede forvandlet, forvandle deg tilbake først." + +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." -msgstr "" +msgstr "Kunne ikke forvandle tilbake på denne posisjonen." #: ../../../src/QuestLog.cpp:234 msgid "Completed Quests" -msgstr "" - -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +msgstr "Fullførte Oppdrag" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Spill lagret." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Hjem" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" -msgstr "" - -#: ../../../src/SDLInputState.cpp:583 +msgstr "Tilbaketast" + +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +msgstr "CapsLock" + +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" -msgstr "" - -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +msgstr "Escape" + +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" -msgstr "" - -#: ../../../src/SDLInputState.cpp:590 +msgstr "Insert" + +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:591 +msgstr "Venstre Alt" + +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:593 +msgstr "Venstre Ctrl" + +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:594 +msgstr "Venstre Shift" + +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:595 +msgstr "NumLock" + +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" -msgstr "" - -#: ../../../src/SDLInputState.cpp:596 +msgstr "PageDown" + +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" -msgstr "" - -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +msgstr "PageUp" + +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" -msgstr "" - -#: ../../../src/SDLInputState.cpp:599 +msgstr "PrintScreen" + +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:600 +msgstr "Høyre Alt" + +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:601 +msgstr "Høyre Ctrl" + +#: ../../../src/SDLInputState.cpp:692 msgid "Return" -msgstr "" - -#: ../../../src/SDLInputState.cpp:603 +msgstr "Return" + +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:604 +msgstr "Høyre Shift" + +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:605 +msgstr "ScrollLock" + +#: ../../../src/SDLInputState.cpp:696 msgid "Space" -msgstr "" - -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +msgstr "Mellomrom" + +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Mus %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" -msgstr "" - -#: ../../../src/SDLInputState.cpp:630 +msgstr "Akse %d -" + +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" -msgstr "" - -#: ../../../src/SDLInputState.cpp:633 +msgstr "Akse %d +" + +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Knapp %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(ingen)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" -msgstr "" - -#: ../../../src/SDLInputState.cpp:701 +msgstr "Berøringskontroller D-Pad" + +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" -msgstr "" - -#: ../../../src/SDLInputState.cpp:716 +msgstr "Berøringskontroller knapper" + +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" -msgstr "" - -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +msgstr "Kort trykk" + +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Kan ikke binde: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" -msgstr "" +msgstr "'%s' er ikke lenger bundet til:" #: ../../../src/Stats.cpp:38 msgid "Max HP" -msgstr "" +msgstr "Maks HP" #: ../../../src/Stats.cpp:39 msgid "Total amount of HP." -msgstr "" +msgstr "Total mengde HP" #: ../../../src/Stats.cpp:43 msgid "HP Regen" -msgstr "" +msgstr "HP Regen" #: ../../../src/Stats.cpp:44 msgid "Ticks of HP regen per minute." -msgstr "" +msgstr "Tikkende HP-regenerering per minutt. " #: ../../../src/Stats.cpp:48 msgid "Max MP" -msgstr "" +msgstr "Maks MP" #: ../../../src/Stats.cpp:49 msgid "Total amount of MP." -msgstr "" +msgstr "Total mengde MP." #: ../../../src/Stats.cpp:53 msgid "MP Regen" -msgstr "" +msgstr "MP regenerering" #: ../../../src/Stats.cpp:54 msgid "Ticks of MP regen per minute." -msgstr "" +msgstr "Tikkende MP-regenerering per minutt. " #: ../../../src/Stats.cpp:58 msgid "Accuracy" @@ -1473,28 +1834,32 @@ "Accuracy rating. The enemy's Avoidance rating is subtracted from this value " "to calculate your likeliness to land a direct hit." msgstr "" +"Treffsikkerhet rangering. Fiendens Unnvikelse rangering trekkes fra denne " +"verdien for å kalkulere sannsynligheten for å lande et direkte treff." #: ../../../src/Stats.cpp:63 msgid "Avoidance" -msgstr "" +msgstr "Unnvikelse" #: ../../../src/Stats.cpp:64 msgid "" "Avoidance rating. This value is subtracted from the enemy's Accuracy rating " "to calculate their likeliness to land a direct hit." msgstr "" +"Unnvikelse rangering. Denne verdien trekkes fra fiendens treffsikkerhet " +"rangering for å kalkulere sannsynligheten for å lande et direkte treff." #: ../../../src/Stats.cpp:68 msgid "Absorb Min" -msgstr "" +msgstr "Absorbering Min" #: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 msgid "Reduces the amount of damage taken." -msgstr "" +msgstr "Reduserer mengden mottatt skade." #: ../../../src/Stats.cpp:73 msgid "Absorb Max" -msgstr "" +msgstr "Absorbering Maks" #: ../../../src/Stats.cpp:78 msgid "Critical Hit Chance" @@ -1502,15 +1867,15 @@ #: ../../../src/Stats.cpp:79 msgid "Chance for an attack to do extra damage." -msgstr "" +msgstr "Sjanse for at et angrep gjør ekstra skade." #: ../../../src/Stats.cpp:83 msgid "Bonus XP" -msgstr "" +msgstr "Bonus EP" #: ../../../src/Stats.cpp:84 msgid "Increases the XP gained per kill." -msgstr "" +msgstr "Øker EP-en mottatt per drap." #: ../../../src/Stats.cpp:88 #, c-format @@ -1520,27 +1885,27 @@ #: ../../../src/Stats.cpp:89 #, c-format msgid "Increases the %s found per drop." -msgstr "" +msgstr "Øker %s funnet per slipp." #: ../../../src/Stats.cpp:93 msgid "Item Find Chance" -msgstr "" +msgstr "Gjenstand Finnersjanse" #: ../../../src/Stats.cpp:94 msgid "Increases the chance that an enemy will drop an item." -msgstr "" +msgstr "Øker sjansen for at en fiende vil slippe en gjenstand." #: ../../../src/Stats.cpp:98 msgid "Stealth" -msgstr "" +msgstr "Snik" #: ../../../src/Stats.cpp:99 msgid "Increases your ability to move undetected." -msgstr "" +msgstr "Øker evnen din til å bevege deg uoppdaget." #: ../../../src/Stats.cpp:103 msgid "Poise" -msgstr "" +msgstr "Kroppsholdning" #: ../../../src/Stats.cpp:104 msgid "Reduces your chance of stumbling when hit." @@ -1548,62 +1913,62 @@ #: ../../../src/Stats.cpp:108 msgid "Missile Reflect Chance" -msgstr "" +msgstr "Sjanse for Prosjektiltrfleksjon" #: ../../../src/Stats.cpp:109 msgid "Increases your chance of reflecting missiles back at enemies." -msgstr "" +msgstr "Øker sjansen din for å reflektere prosjektiler tilbake på fienden." #: ../../../src/Stats.cpp:113 msgid "Damage Reflection" -msgstr "" +msgstr "Skade Refleksjon" #: ../../../src/Stats.cpp:114 msgid "Deals a percentage of damage taken back to the attacker." -msgstr "" +msgstr "Reflekterer en prosentandel av mottatt skade tilbake på angriperen." #: ../../../src/Stats.cpp:118 msgid "HP Steal" -msgstr "" +msgstr "HP Stjeling" #: ../../../src/Stats.cpp:119 msgid "Percentage of HP stolen per hit." -msgstr "" +msgstr "Prosentandel av HP stjålet per slag." #: ../../../src/Stats.cpp:123 msgid "MP Steal" -msgstr "" +msgstr "MP stjeling" #: ../../../src/Stats.cpp:124 msgid "Percentage of MP stolen per hit." -msgstr "" +msgstr "Prosentandel av MP stjålet per slag." #: ../../../src/Stats.cpp:128 msgid "Base HP" -msgstr "" +msgstr "Kjerne HP" #: ../../../src/Stats.cpp:133 msgid "Base MP" -msgstr "" - -#: ../../../src/Utils.cpp:346 +msgstr "Kjerne MP" + +#: ../../../src/Utils.cpp:365 msgid "k" -msgstr "" - -#: ../../../src/Utils.cpp:580 +msgstr "k" + +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s sekund" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s sekunder" #: ../../../src/Version.cpp:139 msgid "or newer" -msgstr "" +msgstr "eller nyere" #: ../../../src/Version.cpp:142 msgid "or older" -msgstr "" +msgstr "eller eldre" diff --git a/mods/default/languages/engine.nl.po b/mods/default/languages/engine.nl.po index 18f251f..a612a1a 100644 --- a/mods/default/languages/engine.nl.po +++ b/mods/default/languages/engine.nl.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Justin Jacobs , 2018\n" "Language-Team: Dutch (https://www.transifex.com/flareorg/teams/84925/nl/)\n" @@ -21,74 +21,83 @@ "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Gefeliciteerd, je hebt niveau %d bereikt!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Je kunt één eigenschap in het karakter menu verhogen." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "" + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Je ontvangt %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Je ontvangt %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Je ontvangt %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "" - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Je ontvangt %d EP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "" -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "" @@ -106,974 +115,1142 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Avonturier" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Onbekende bestemming" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Spel verwijderen" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Dit spel werkelijk verwijderen?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Terug naar het menu" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "New Spel" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Kies een Slot" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Spel Laden" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Betreden spelwereld..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Laden opgeslagen spel..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Niveau %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Annuleren" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Kies een Portret" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Kies een Naam" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Permanente dood?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Spel Spelen" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Instellingen" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Spel Stoppen" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Karakter" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Voorraad" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Vaardigheden" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Log" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Opdracht gerelateerd artikel" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorbtie: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorbtie: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Naam" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Niveau" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "EP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Volgende: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "basis (%d), bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Standaardwaarden" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Annuleren" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Stoppen" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Video" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Audio" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Omgeving" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Invoer" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Sneltoetsen" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Volledig scherm" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Hardware oppervlakken" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gammacorrectie" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Geluidsvolume" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Muziekvolume" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Geluidsvolume" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Taal" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Actieve Mods" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Video" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Invoer" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Sneltoetsen" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Laat strijdtekst zien" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Muisbesturing" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Volledig scherm" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Muisbesturing" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Hardware oppervlakken" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gammacorrectie" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Gebruik de Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "" - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Spel verwijderen" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Dit spel werkelijk verwijderen?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Terug naar het menu" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "New Spel" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Kies een Slot" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Spel Laden" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Betreden spelwereld..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Laden opgeslagen spel..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Niveau %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Kies een Portret" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Kies een Naam" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Permanente dood?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Spel Spelen" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Instellingen" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Spel Stoppen" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Karakter" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Voorraad" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Vaardigheden" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Log" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Opdracht gerelateerd artikel" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorbtie: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorbtie: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Laat strijdtekst zien" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Naam" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Niveau" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "EP: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Volgende: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "basis (%d), bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Actieve Mods" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s niveau %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Dood" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Stoppen" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "" -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "" -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Dit artikel kan alleen vanaf de actiebalk gebruikt worden." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Geen ruimte meer." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "" -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "" @@ -1085,214 +1262,259 @@ msgid "Quests" msgstr "Opdrachten" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "EP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Kost %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Handelen" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Verkoper" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "" -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1300,132 +1522,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "" -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1584,16 +1899,16 @@ msgid "Base MP" msgstr "" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "" diff --git a/mods/default/languages/engine.pl.po b/mods/default/languages/engine.pl.po index 8626f13..62e7c55 100644 --- a/mods/default/languages/engine.pl.po +++ b/mods/default/languages/engine.pl.po @@ -4,16 +4,18 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Justin Jacobs , 2018 +# Justin Jacobs , 2019 +# Błażej Pęksyk , 2020 +# Grzegorz Szymaszek , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" -"PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Justin Jacobs , 2018\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" +"PO-Revision-Date: 2021-05-27 19:39+0200\n" +"Last-Translator: Grzegorz Szymaszek , 2021\n" "Language-Team: Polish (https://www.transifex.com/flareorg/teams/84925/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,78 +23,83 @@ "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Gratulacje, twoja postać osiągnęła %d poziom!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Możesz zwiększyć jeden ze swoich atrybutów w Menu Postaci." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Pokonano Cię. Koniec gry! ${INPUT_CONTINUE} spowoduje powrót do Menu " -"Głównego." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" -"Pokonano Cię. ${INPUT_CONTINUE} sprawi, że odrodzisz się w ostatnim punkcie " -"kontrolnym." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Możesz zwiększyć jeden lub kilka ze swoich atrybutów w Menu Postaci." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Możesz zwiększyć jedną lub kilka ze swoich zdolności w Menu Mocy." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "Transformacja minęła. Przeniesiono Cię w bezpieczne miejsce." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "Usunięto %d %s." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "Usunięto %dx %s." + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "Usunięto %s." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Otrzymujesz %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Otrzymujesz %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Otrzymujesz przedmiot %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Otrzymujesz %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Otrzymujesz %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Otrzymujesz %d PD." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "PŻ odnowione." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "PM odnowione." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "PŻ i PM odnowione." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Negatywne efekty usunięte." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "PŻ i PM odnowione, negatywne efekty usunięte." @@ -116,791 +123,1012 @@ "\n" "Domyślny renderer, który zwykle jest szybszy niż programowy renderer SDL." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Poszukiwacz przygód" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "pudło" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d PŻ" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d PM" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Cel nieznany" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Wczytywanie..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Usuń zapis" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Usunąć ten zapis?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Wyjdź do Menu" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nowa Gra" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Wybierz stan gry" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Włącz mod fabularny, by kontynuować" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Wczytaj Grę" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Wkraczanie do świata gry..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Wczytywanie stanu gry..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Nieprawidłowy zapis" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Poziom %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Anuluj" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Stwórz" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Losuj" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Wybierz potret" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Wybierz Imię" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Tryb hardkorowy?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Wybierz klasę postaci" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Zacznij grę" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Włącz mod główny, aby kontynuować" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Konfiguracja" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Zasługi" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Wyjdź z gry" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Akceptuj" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Góra" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Dół" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Lewo" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Prawo" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Pas1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Pas2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Pas3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Pas4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Pas5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Pas6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Pas7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Pas8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Pas9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Pas0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Postać" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Ekwipunek" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Moce" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Dziennik" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Główny1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Główny2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Delete" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Wybór elementu na Pasku Akcji" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Kursor na Pasku Akcji w lewo" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Kursor na Pasku Akcji w prawo" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Użycie elementu na Pasku Akcji" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menu deweloperskie" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Lewy przycisk myszy" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Środkowy przycisk myszy" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Prawy przycisk myszy" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Kółko w górę" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Kółko w dół" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Przycisk myszy X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Przycisk myszy X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Nieznany przedmiot" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Szybkość Ruchu" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Szybkość Ataku" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Odporność (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Wymaga %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Przedmiot związany z zadaniem" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Jakość: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorbcja: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorbcja: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Wymaga %d poziomu" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Wymaga: %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Wymagana Klasa: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Cena kupna: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Cena kupna: %d %s za sztukę" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Wartość sprzedaży: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Wartość sprzedaży: %d %s za sztukę" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Zestaw:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d przedmioty:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Wciśnij [%s] aby przeczytać" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Wciśnij [%s] aby użyć" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Klawisz skrótu: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Za mało PM." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Pozostało:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d sztuk" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Imię" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Poziom" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Zmniejsza obrażenia otrzymywane od ataków żywiołu \"%s\"." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Obecne PD: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Do następnego poziomu: %d PD" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "Podstawa (%d), dodatkowo (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Powiązane statystyki:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Każdy poziom zapewnia %d punktów." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Każdy punkt atrybutu %s dodaje %d punktów." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Wyczyść" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Przypisz:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Domyślne" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Zresetować WSZYSTKIE ustawienia?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "OK" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Anuluj" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Kontynuuj" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "Zapisz Grę" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Domyślne" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Wyświetla podpisy wszystkich łupów, za wyjątkiem tych zasłoniętych przez " +"gracza bądź wroga. Tymczasowo ukryj podpisy klawiszem 'Alt'." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Pokaż wszystkie" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Zawsze wyświetla podpisy łupów. Tymczasowo ukryj podpisy klawiszem 'Alt'." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Ukryta" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Zawsze ukrywaj podpisy łupów, poza tymi, na których znajduje się kursor " +"myszt. Tymczasowo pokaż podpisy wszystkich łupów klawiszem 'Alt'." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Widoczna" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Widoczna (powiększenie x2)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Kursor" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Wyjdź" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Grafika" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Dźwięk" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interfejs" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Kontrolery" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Klawiszologia" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mody" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Pauza" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Czas spędzony w grze" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Renderer" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Pełny ekran" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Generowanie sprzętowe" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "V-Sync" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Filtrowanie tekstur" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Skalowanie DPI" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Warstwy paralaksowe" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Zezwól na zmianę jasności" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Jasność" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Głośność efektów" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Głośność muzyki" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Głośność efektów" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Język" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Pokaż klatki na sekundę" -#: ../../../src/GameStateConfigBase.cpp:270 -msgid "Colorblind Mode" -msgstr "Minimalizacja kolorów" - -#: ../../../src/GameStateConfigBase.cpp:274 +#: ../../../src/MenuConfig.cpp:376 msgid "Hardware mouse cursor" msgstr "Sprzętowy kursor myszy" -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:377 +msgid "Colorblind Mode" +msgstr "Wyświetlanie opisów kolorów" + +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Tryb deweloperski" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Napisy" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Aktywne mody" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Dostępne mody" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Wyłącz" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Włącz >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Wersja:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Gra:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Wersja silnika:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Wymaga modów:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Wyczyść" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Przypisz:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Grafika" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Kontrolery" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Klawiszologia" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Widoczność podpisów łupów" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Tryb minimapy" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Pokazuj podpisy na paskach" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Zezwól na automatyczne ukrywanie pasków stanu" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Pokaż tekst podczas walki" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Automatycznie załóż ekwipunek" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Wyświetl znaczniki ukrytych bytów" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Poruszaj się używając myszki" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Celowanie myszką" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Nie używaj myszy" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Zamień przyciski ruchu na myszce" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Atakuj podczas ruchu myszką" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Martwa strefa Joystick-a" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Klawisz główny: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Klawisz alternatywny: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Przycisk na joysticku: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:189 +"Funkcja będzie próbowała przechowywać powierzchnie w pamięci karty " +"graficznej zamiast systemowej. Jej wydajność zależy od renderera" + +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:190 +"Zapobiega rozchodzeniu się obrazu. Wyłącz, jeśli doświadczasz " +"\"przycinania\\ w trybie okienkowym bądź opóźnienia w wykonywaniu akcji." + +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:191 +"Po włączeniu, ta funkcja bierze pod uwagę rozdzielczość ekranu podczas " +"skalowania renderowanego obrazu do rozmiaru okna. W przeciwnym wypadku brany" +" pod uwagę jest wyłącznie rozmiar okna." + +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Eksperymentalne" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Dla urządzeń przenośnych" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Renderer" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Pełny ekran" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Poruszaj się używając myszki" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Generowanie sprzętowe" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "V-Sync" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Filtrowanie tekstur" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Zezwól na zmianę jasności" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Jasność" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Użyj joysticka" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Celowanie myszką" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Nie używaj myszy" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Martwa strefa Joystick-a" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Wczytywanie..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Usuń zapis" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Usunąć ten zapis?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Wyjdź do Menu" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nowa Gra" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Wybierz stan gry" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Włącz mod fabularny, by kontynuować" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Wczytaj Grę" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Wkraczanie do świata gry..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Wczytywanie stanu gry..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Nieprawidłowy zapis" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Poziom %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Stwórz" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Wybierz potret" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Wybierz Imię" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Tryb hardkorowy?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Wybierz klasę postaci" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Zacznij grę" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Włącz mod główny, aby kontynuować" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Konfiguracja" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Lista płac" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Wyjdź z Gry" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Akceptuj" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Góra" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Dół" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Lewo" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Prawo" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Pas1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Pas2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Pas3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Pas4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Pas5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Pas6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Pas7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Pas8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Pas9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Pas0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Postać" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Ekwipunek" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Moce" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Dziennik" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Główny1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Główny2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Delete" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Wybór elementu na Pasku Akcji" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Kursor na Pasku Akcji w lewo" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Kursor na Pasku Akcji w prawo" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Użycie elementu na Pasku Akcji" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menu deweloperskie" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Lewy przycisk myszy" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Środkowy przycisk myszy" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Prawy przycisk myszy" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Kółko w górę" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Kółko w dół" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Przycisk myszy X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Przycisk myszy X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Nieznany przedmiot" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Szybkość Ruchu" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Szybkość Ataku" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Przedmiot związany z zadaniem" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Jakość: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorbcja: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorbcja: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Wymaga %d poziomu" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Wymaga: %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Wymagana Klasa: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Cena kupna: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Cena kupna: %d %s za sztukę" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Wartość sprzedaży: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Wartość sprzedaży: %d %s za sztukę" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Zestaw:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d przedmioty:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Wciśnij [%s] aby użyć" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Wciśnij [%s] aby przeczytać" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Pokazuj podpisy na paskach" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Pokaż tekst podczas walki" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Klawisz skrótu: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Pozostało:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d sztuk" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Imię" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Poziom" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Obecne PD: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Do następnego poziomu: %d PD" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "Podstawa (%d), dodatkowo (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Powiązane statystyki:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Każdy poziom zapewnia %d punktów." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Każdy punkt atrybutu %s dodaje %d punktów." - -#: ../../../src/MenuDevConsole.cpp:63 +"Włącza paralaksowe warstwy (nie zawierające podłoża). Wyłączenie tej opcji " +"może poprawić wydajność w niektórych przypadkach." + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Odblokowuje poniższą opcję ręcznego ustawienia poziomu gammy. Zachowanie tej" +" funkcji może się różnić w zależności od platformy." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Wyświetla dodatkową informację, która jest przeważnie przekazywana przez " +"kolor." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Niektóre mody będą automatycznie ukrywały paski stanu w czasie " +"nieaktywności. Wyłączenie tej opcji spowoduje wyświetlanie ich przez cały " +"czas." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Włączenie tej opcji spowoduje automatyczne zapełnianie pustych miejsc na " +"ekwipunek odpowiednimi przedmiotami po ich zdobyciu." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Pokazuje znacznik nad przeciwnikami, sojusznikami i graczem, gdy są " +"zasłonięci przez wysokie obiekty." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" +"Pozwala na sterowanie w grze wyłącznie przy pomocy klawiatury (bądź " +"joysticka)." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Jeśli opcja 'Poruszaj się używając myszki' jest aktywna, to ustawienie " +"przypisuje funkcje do przycisków myszy. Po aktywowaniu tej opcji, 'Prawy " +"przycisk myszy' będzie używany do poruszania się zamiast 'Lewego przycisku " +"myszy'." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Jeśli opcja 'Poruszaj się używając myszki' jest aktywna, to ustawienie " +"sprawdza, czy moc przypisana do przycisku ruchu może zostać użyta po " +"nakierowaniu na wroga. Jeśli ta opcja jest wyłączona, należy użyć 'Shift', " +"żeby móc użyć mocy przypisanej do przycisku ruchu." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Po aktywowaniu tej opcji, Ataki gracza będą kierowane w stronę kursora " +"myszy." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Aktywne mody" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Dostępne mody" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Wyłącz" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Włącz >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Wersja:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Gra:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Wersja silnika:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Wymaga modów:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(brak)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Zapisz i wyjdź" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Wykonaj" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Konsola deweloperska" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:146 +msgstr "Użyj '%s', aby zbadać kursorem myszy." + +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Argumenty zawierające spacje powinny zamknięte w cudzysłowie. Przykład:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Wpisz 'help' aby uzyskać listę komend." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:224 +msgstr "px" + +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +msgstr "Dystans" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +msgstr "Byt" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +msgstr "nic" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +msgstr "ściana" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:266 +msgstr "krótka ściana / otchłań" + +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:267 +msgstr "byt" + +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:274 +msgstr "byt, sojusznik" + +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:360 +msgstr "Podłoże" + +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "dodaje moc do paska akcji" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:362 +msgstr "włącza/wyłącza wyświetlanie licznika klatek na sekundę" + +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "włącza/wyłącza wszystkie elementy interfejsu" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "włącza/wyłącza interfejs dewelopera" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -908,11 +1136,11 @@ "Wyświetla listę mocy pasujących do podanego wyrażenia. Brak wyrażenia " "spowoduje wyświelenie wszystkich pozycji." -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "Wypisuje nazwy wszystkich plików map zawartych w katalogu \"maps/\"." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -920,7 +1148,7 @@ "Wyświetla listę aktywnych statusów kampanii pasujących do podanego " "wyrażenia. Brak wyrażenia spowoduje wyświetlanie wszystkich statusów." -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -928,169 +1156,153 @@ "Wyświetla listę przedmiotów pasujących do podanego wyrażenia. Brak wyrażenia" " spowoduje wyświelenie wszystkich przedmiotów." -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "parsuje ciąg komponentów zdarzeń i wykonuje je jako jedno zdarzenie" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "czyści historię komend" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "wyświetla ten tekst" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Włączono interfejs dewelopera" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Włączono interfejs użytkownika" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:534 +msgstr "Włączono licznik klatek na sekundę" + +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "BŁĄD: Nieprawidłowa liczba argumentów." -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "WSKAZÓWKA:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "BŁĄD: '%s' nie jest prawidłowym klawiszem do zdarzenia" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "BŁĄD: Za mało argumentów" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = ..." -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "BŁĄD: Nieznana komenda" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "WSKAZÓWKA: Wpisz help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s poziom %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Nie żyje" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" -msgstr "" - -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Pauza" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Zapisz i wyjdź" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Wyjdź" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Kontynuuj" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Automatycznie załóż ekwipunek" - -#: ../../../src/MenuInventory.cpp:188 +msgstr "Zniszczony" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Utracono %d%% %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Utracono %d%% PD." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Utracono %d%% PD z obecnego poziomu doświadczenia." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Utracono %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Podnieś przedmiot(y):" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Użyj bądź załóż przedmiot:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "Modyfikatory dla %s:" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Rozdziel przedmioty:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Ilość przedmiotów w skrytce:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Sprzedaj przedmiot:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Nie masz wystarczająco wymaganych przedmiotów." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Nie możesz użyć tego przedmiotu w tej chwili." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Ten przedmiot może być użyty jedynie z paska akcji." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Ekwipunek jest pełny." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Za mało %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Tego przedmiotu nie można sprzedać." @@ -1102,347 +1314,485 @@ msgid "Quests" msgstr "Zadania" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "PD: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Tego przedmiotu nie można upuścić." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Podaj ilość:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Pasywna" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Koszt: %d PM" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Koszt: %d PŻ" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Odnowienie:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Obrażenia na sekundę" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "PŻ na sekundę" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "PM na sekundę" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Unieruchomienie" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Niewrażliwość" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Niewrażliwość na krwawienie" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Niewrażliwość na spowolnienie" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Niewrażliwość na ogłuszenie" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Niewrażliwość na kradzież PŻ" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Niewrażliwość na kradzież PM" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Niewrażliwość na odrzucenie" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Niewrażliwość na odbicie obrażeń" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Ogłuszenie" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Automatyczne ożywienie po śmierci" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Nawrócenie" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Strach" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Żywotność" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Magiczna Tarcza" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Leczenie" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Odrzucenie" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% szansy" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Bazowa celność" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Bazowa Szansa na Trafienie Krytyczne" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Ignoruje Absorbcję" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Ignoruje szansę na unik" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% Szansa na trafienie krytyczne spowolnionych celów" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1114 +msgstr "Obrażenia od żywiołu (%s)" + +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Wymaga %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Wymagana Moc: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Kliknij by odblokować (potrzebuje 1 Punktu Umiejętności)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Wymaga 1 Punktu Umiejętności" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Następny poziom:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Wspólna Skrytka" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Nie można schować do skrytki przedmiotu związanego z zadaniem." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Skrytka" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Ten przedmiot nie może zostać umieszczony w skrytce." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Ten przedmiot nie może zostać umieszczony w prywatnej skrytce." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "Ten przedmiot nie może zostać umieszczony we współdzielonej skrytce." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Skrytka jest pełna." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Nie można umieścić przedmiotu w skrytce: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Handel" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Odkup" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Sprzedawca" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Osłony" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Już jesteś po transformacji, wpierw cofnij transformację." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Nie można cofnąć transformacji w tym miejscu." #: ../../../src/QuestLog.cpp:234 msgid "Completed Quests" -msgstr "" - -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +msgstr "Ukończone zadania" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Gra zapisana." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Backspace" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "CapsLock" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "End" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Home" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Insert" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Lewy Alt" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Lewy Ctrl" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Lewy Shift" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "NumLock" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "PageDown" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "PageUp" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pause" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "PrintScreen" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Prawy Alt" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Prawy Ctrl" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Return" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Prawy Shift" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "ScrollLock" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Space" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tab" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Przycisk myszy %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Oś %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Oś %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Klawisz %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(brak)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" -msgstr "" - -#: ../../../src/SDLInputState.cpp:701 +msgstr "Dotykowy krzyżak ruchu" + +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" -msgstr "" - -#: ../../../src/SDLInputState.cpp:716 +msgstr "Dotykowe przyciski akcji" + +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Tapnięcie" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Nie można przypisać: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "'%s' już nie jest przypisany do:" @@ -1453,7 +1803,7 @@ #: ../../../src/Stats.cpp:39 msgid "Total amount of HP." -msgstr "" +msgstr "Suma PŻ." #: ../../../src/Stats.cpp:43 msgid "HP Regen" @@ -1469,7 +1819,7 @@ #: ../../../src/Stats.cpp:49 msgid "Total amount of MP." -msgstr "" +msgstr "Suma PM." #: ../../../src/Stats.cpp:53 msgid "MP Regen" @@ -1488,6 +1838,8 @@ "Accuracy rating. The enemy's Avoidance rating is subtracted from this value " "to calculate your likeliness to land a direct hit." msgstr "" +"Wartość celności. Wartość Uniku wroga jest odejmowana od tej wartości, aby " +"wyliczyć prawdopodobieństwo wyprowadzenia celnego ciosu." #: ../../../src/Stats.cpp:63 msgid "Avoidance" @@ -1498,6 +1850,8 @@ "Avoidance rating. This value is subtracted from the enemy's Accuracy rating " "to calculate their likeliness to land a direct hit." msgstr "" +"Wartość uniku. Ta wartość jest odejmowana od wartości Celności wroga, aby " +"wyliczyć prawdopodobieństwo otrzymania od niego celnego ciosu." #: ../../../src/Stats.cpp:68 msgid "Absorb Min" @@ -1505,7 +1859,7 @@ #: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 msgid "Reduces the amount of damage taken." -msgstr "" +msgstr "Zmniejsza otrzymywane obrażenia o podaną liczbę." #: ../../../src/Stats.cpp:73 msgid "Absorb Max" @@ -1517,7 +1871,7 @@ #: ../../../src/Stats.cpp:79 msgid "Chance for an attack to do extra damage." -msgstr "" +msgstr "Szansa na zadanie dodatkowych obrażeń podczas ataku." #: ../../../src/Stats.cpp:83 msgid "Bonus XP" @@ -1601,16 +1955,16 @@ msgid "Base MP" msgstr "Bazowe PM" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s sekunda" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s sekund" diff --git a/mods/default/languages/engine.pot b/mods/default/languages/engine.pot index 72869ee..7c1c69a 100644 --- a/mods/default/languages/engine.pot +++ b/mods/default/languages/engine.pot @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,74 +17,83 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "" - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "" + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "" + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "" -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "" - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "" - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "" -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "" -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "" -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "" @@ -102,973 +111,1141 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "" + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are " "used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "" - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "" - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "" - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior " +"of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to " +"standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or " +"'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when " +"this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "" -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "" -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "" -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "" -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "" -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "" @@ -1080,214 +1257,259 @@ msgid "Quests" msgstr "" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "" -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1295,132 +1517,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "" -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1579,16 +1894,16 @@ msgid "Base MP" msgstr "" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "" diff --git a/mods/default/languages/engine.pt.po b/mods/default/languages/engine.pt.po index 515e7a3..72f0297 100644 --- a/mods/default/languages/engine.pt.po +++ b/mods/default/languages/engine.pt.po @@ -5,16 +5,16 @@ # # Translators: # Justin Jacobs , 2018 -# Rui , 2018 +# Rui , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Rui , 2018\n" +"Last-Translator: Rui , 2019\n" "Language-Team: Portuguese (https://www.transifex.com/flareorg/teams/84925/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,76 +22,83 @@ "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Tens pouca vida!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Parabéns, alcançaste o nível %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Podes aumentar um atributo através do Menu de Personagem." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Perdeste. Fim do jogo! Pressiona a tecla ${INPUT_CONTINUE} para sair para o " -"ecrã principal." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Perdeste. Pressiona a tecla ${INPUT_CONTINUE} para continuar." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Podes aumentar um ou mais atributos através do menu Personagem." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Podes desbloquear uma ou mais habilidades através do menu Poderes." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "A transformação expirou. Foste transferido para um local seguro." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s removido(a)." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s removido(a)." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Recebes %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Recebes %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Recebes %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Recebes %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Recebes %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Recebes %d XP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "PV restaurado." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Mana restaurada." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "PV e Mana restaurados." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Efeitos negativos removidos." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "PV e Mana restaurados, efeitos negativos removidos." @@ -115,150 +122,784 @@ "\n" "O renderizador padrão que é geralmente mais rápido que o rederizador por software SDL." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Aventureiro" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "errou" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d PV" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d Mana" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Destino desconhecido" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "A carregar..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Eliminar Jogo" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Eliminar este jogo gravado?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Sair para o Título" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Novo Jogo" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Escolher Compartimento" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Ativa um mod de campanha para continuar" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Carregar Jogo" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "A entrar no mundo do jogo..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "A carregar o jogo gravado..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Gravação inválida" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Nível %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Cancelar" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Criar" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Aleatório" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Escolhe um Retrato" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Escolhe um Nome" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Morte Permanente?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Escolhe uma Classe" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Jogar" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Ativa o mod do núcleo para continuar" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Configuração" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Créditos" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Sair do Jogo" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Aceitar" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Cima" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Baixo" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Esquerda" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Direita" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Barra1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Barra2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Barra3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Barra4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Barra5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Barra6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Barra7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Barra8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Barra9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Barra0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Personagem" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventário" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Poderes" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Diário" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Principal1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Principal2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Remover" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Barra de Ação Aceitar" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Barra de Ação Esquerda" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Barra de Ação Direita" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Barra de Ação Usar" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menu Programador" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Botão Esq. Rato" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Botão Meio Rato" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Botão Dir. Rato" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Roda p/Cima" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Roda p/Baixo" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Rato X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Rato X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Item Desconhecido" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Velocidade" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Velocidade de Ataque" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Resistência (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Necessita de %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Item de Missão" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Qualidade: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorve: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorve: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Requer Nível %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Necessita %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Necessita da Classe: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Preço de Compra: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Preço de Compra: %d %s cada" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Preço de Venda: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Preço de Venda: %d %s cada" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Conjunto:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d itens:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Pressionar [%s] para ler" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Pressionar [%s] para usar" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Atalho: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Sem mana suficiente." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Restante:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d pilhas" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Nome" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Nível" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Reduz o dano recebido de \"%s\" ataques elementais." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "EXP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Próximo: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "base (%d), bónus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Estatísticas relacionadas:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Cada nível garante %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Cada ponto de %s dá %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Limpar" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Atribuir:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Repor" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Repor TODAS as configurações de origem?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "OK" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Cancelar" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Continuar" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Padrão" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Mostrar todas as legendas de pilhagem, exceto aquelas que sejam ocultadas " +"pelo jogador ou por um inimigo. Pode-se ver todas as legendas de pilhagens " +"temporariamente com a tecla 'Alt'." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Mostrar tudo" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Mostrar sempre as legendas de pilhagens. Pode-se ocultar todas as legendas " +"de pilhagens temporariamente com a tecla 'Alt'." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Oculto" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Mostrar sempre as legendas das pilhagens, exceto quando o cursor passar por " +"cima delas. Pode-se ver todas as legendas de pilhagens temporariamente com a" +" tecla 'Alt'." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Visível" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Visível (2x zoom)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Controla o tipo de aviso a ser ativado quando o jogador tem a vida abaixo do" +" limiar." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Mostrar uma mensagem" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Reproduzir um som" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Alterar o cursor" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Desativado" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Tudo" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Mensagem e cursor" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Mensagem e som" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Som e cursor" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Mensagem" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Cursor" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Som" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Quando a vida do jogador desce abaixo do limiar definido, são ativadas as " +"notificações de pouca vida se uma ou mais notificações estiverem ativadas." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Sair" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Vídeo" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Áudio" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interface" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Entrada" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Teclas de atalho" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Pausado" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Tempo Jogado" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Renderizador" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Modo ecrã cheio" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Superfícies de hardware" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "Sincronização vertical" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Filtro de textura" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Escalonamento por DPI" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Camadas de Paralaxe" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Permitir a mudança de gama" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gama" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Volume do som" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Volume da música" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Volume do som" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Idioma" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Mostrar FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Renderizar cursor do rato por hardware" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Modo daltónico" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Renderizar cursor do rato por hardware" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Modo programador" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Subtítulos" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Mods ativos" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Mods disponíveis" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Desativar" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Ativar >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Versão:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Jogo:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Versão do motor:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Necessita dos mods:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Limpar" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Atribuir:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Vídeo" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Entrada" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Teclas de atalho" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Visibilidade das legendas da pilhagem" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Modo mini-mapa" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Mostrar sempre etiquetas na barra de estatísticas" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Permitir ocultar automaticamente a barra de estatísticas" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Mostrar texto de combate" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Equipar itens automaticamente" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Mostrar marcadores de entidades ocultas" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Notificação de pouca vida" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Limiar de pouca vida" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Mover herói utilizando o rato" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Fazer mira com o rato" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Não usar rato" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Trocar botão de movimento do rato" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Atacar com o movimento do rato" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Zona morta do joystick" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Atalho principal: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Atalho alternativo: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Atalho do joystick: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -266,7 +907,7 @@ "Tentar armazenar as superfícies na memória de vídeo e não na memória do " "sistema. O efeito que terá no desempenho depende do renderizador." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -274,7 +915,7 @@ "Evita o desfazamento vertical no ecrã. Desativar se ocorrerem atrasos no " "modo janela ou atraso na imagem." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -284,7 +925,7 @@ "resolução de renderização. Caso contrário, serão utilizadas apenas as " "dimensões da janela." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." @@ -292,625 +933,206 @@ "Isto ativa as camadas paralaxe (não-telas). Desativar isto pode melhorar a " "performance em alguns casos." -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Experimental" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Para dispositivos portáteis" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Renderizador" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Modo ecrã cheio" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Mover herói utilizando o rato" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Superfícies de hardware" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "Sincronização vertical" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Filtro de textura" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "Escalonamento por DPI" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "Camadas de Paralaxe" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Permitir a mudança de gama" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gama" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Usar joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Fazer mira com o rato" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Não usar rato" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Zona morta do joystick" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "A carregar..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Eliminar Jogo" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Eliminar este jogo gravado?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Sair para o Título" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Novo Jogo" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Escolhe o Espaço" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Ativa um mod de campanha para continuar" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Carregar Jogo" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "A entrar no mundo do jogo..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "A carregar o jogo gravado..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Gravação inválida" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Nível %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Criar" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Aleatório" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Escolhe um Retrato" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Escolhe um Nome" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Morte Permanente?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Escolhe uma Classe" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Jogar" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Ativa o mod do núcleo para continuar" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Configuração" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Créditos" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Sair do Jogo" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Aceitar" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Cima" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Baixo" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Esquerda" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Direita" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Barra1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Barra2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Barra3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Barra4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Barra5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Barra6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Barra7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Barra8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Barra9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Barra0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Personagem" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventário" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Poderes" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Diário" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Principal1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Principal2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Remover" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Barra de Ação Aceitar" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Barra de Ação Esquerda" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Barra de Ação Direita" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Barra de Ação Usar" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menu Programador" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Botão Esq. Rato" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Botão Meio Rato" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Botão Dir. Rato" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Roda p/Cima" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Roda p/Baixo" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Rato X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Rato X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Item Desconhecido" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Velocidade" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Velocidade de Ataque" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "Resistência (%s)" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Necessita de %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Item de Missão" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Qualidade: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorve: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorve: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Requer Nível %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Necessita %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Necessita da Classe: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Preço de Compra: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Preço de Compra: %d %s cada" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Preço de Venda: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Preço de Venda: %d %s cada" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Conjunto:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d itens:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Pressionar [%s] para usar" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Pressionar [%s] para ler" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "Visibilidade das legendas dos saques" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "Modo mini-mapa" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Mostrar sempre etiquetas na barra de estatísticas" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Mostrar texto de combate" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Atalho: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" -"Padrão. Mostrar temporariamente todas as legendas dos saques com '%s'." - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" -"Mostrar tudo. Ocultar temporariamente todas as legendas dos saques com '%s'." - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" -"Ocultar tudo. Mostrar temporariamente todas as legendas dos saques com '%s'." - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "Visível" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "Visível (2x zoom)" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "Oculto" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "Ativado" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "Desativado" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "Sem mana suficiente." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Restante:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d pilhas" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Nome" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Nível" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d ponto não utilizado" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d pontos não utilizados" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Reduz o dano recebido de \"%s\" ataques elementais." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "EXP: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Próximo: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "base (%d), bónus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Estatísticas relacionadas:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Cada nível garante %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Cada ponto de %s dá %d." - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Permite a configuração abaixo que controla o gama do ecrã. O comportamento " +"da configuração do gama pode variar em plataformas diferentes." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Fornece texto adicional para informação que é transmitida através da cor." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Alguns mods escondem automaticamente a barra de estatísticas quando estas " +"estão inativas. Desativando esta opção, a barra de estatísticas estará " +"sempre visível." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Quando ativado, os compartimentos vagos do equipamento serão preenchidos com" +" itens aplicáveis quando estes são obtidos." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Mostrar um marcador por cima dos inimigos, aliados e o jogador quando " +"estiverem ocultados por objetos altos." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" +"Isto permite que o jogo seja controlado inteiramente com o teclado (ou " +"joystick)." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Quando a opção 'Mover herói utilizando o rato' está ativa, esta configuração" +" controla se o 'Principal1' ou 'Principal2' é utilizado para mover o herói. " +"Se ativado, o 'Principal2' irá mover o herói em vez do 'Principal1'." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Quando a opção 'Mover herói utilizando o rato' está ativada, esta " +"configuração controla se a potência atribuída ao botão de movimento pode ser" +" utilizada ao colocar em mira um inimigo. Se esta opção estiver desativada, " +"é necessário usar a tecla 'Shift' para aceder à potência atribuída ao botão " +"de movimento." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Os ataques do jogador serão direcionados na direção do cursor do rato quando" +" isto está ativo." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Mods ativos" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Mods disponíveis" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Desativar" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Ativar >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Versão:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Jogo:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Versão do motor:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Necessita dos mods:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(nenhum)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Gravar e Sair" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Executar" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Consola de Programador" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Usar '%s' para inspecionar com o cursor." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "Os argumentos com espaços devem estar entre aspas duplas. Exemplo:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Escrever 'help' para obter uma lista de comandos." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Distância" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Entidade" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "nenhum" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "muro" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "parede curta / fosso" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "entidade" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "entidade, aliado" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Tela" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "adiciona um poder à barra de ação" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "liga / desliga a visualização do contador de FPS" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "mostra/oculta todos os elementos do HUD" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "mostra/oculta todos o HUD de programador" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -918,12 +1140,12 @@ "Mostra uma lista de poderes que correspondem a um termo pesquisado. Se não " "for encontrado nada na pesquisa, mostra todos os itens" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" "Mostra todos os nomes de ficheiros de mapas localizados na pasta \"maps/\"." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -931,7 +1153,7 @@ "Mostra o estado da campanha ativa que corresponde ao termo de pesquisa. Se " "não for encontrado nada na pesquisa, mostra todos os estados ativos" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -939,171 +1161,155 @@ "Mostra uma lista de todos os itens que correspondem a um termo pesquisado. " "Se não for encontrado nada na pesquisa, mostra todos os itens" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "analisa uma série de componentes de eventos e executa-os como um único " "evento" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "limpa o histórico de comandos" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "mostra este texto" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "HUD de programador mostrado/oculto" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "HUD mostrado/oculto" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "Contador de FPS alternado" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "ERRO: número incorreto de argumentos" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "DICA:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "ERRO: '%s' não é uma chave de evento válida" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "ERRO: argumentos a menos" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = ..." -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "ERRO: comando desconhecido" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "DICA: escreve help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s nível %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Morto" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Destruído" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Pausado" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Gravar e Sair" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Sair" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Continuar" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Equipar itens automaticamente" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Perdeste %d%% de %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Perdeste %d%% de um total de EXP." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Perdeste %d%% no nível atual de EXP." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Perdeste %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Apanhar itens:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Usar ou equipar item:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "%s modificadores" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Escolher quantidade de um item:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Pilha de item no baú:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Vender pilha de itens:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Não tens que chegue do item necessário." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Não podes usar este item agora." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Este item pode ser usado apenas a partir da barra de ação." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "O inventário está cheio." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Sem %s suficientes." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Este item não pode ser vendido." @@ -1115,214 +1321,259 @@ msgid "Quests" msgstr "Missões" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "EXP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Este item não pode ser deitado fora." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Introduz a quantidade:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Passivo" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Custa %d Mana" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Custa %d PV" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Esfriar:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Dano por segundo" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "PV por segundo" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "Mana por segundo" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Imobilizar" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Imunidade" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Imunidade a danos a longo prazo" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Imunidade à lentidão" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Imunidade ao atordoamento" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Imunidade ao roubo de PV" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Imunidade a roubo de Mana" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Imunidade aos coices" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Imunidade a reflexão de danos" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Atordoar" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Ressuscitar automaticamente ao morrer" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Converter" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Medo" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Vida útil" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Escudo Mágico" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Cura" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Coice" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% chance" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Precisão Básica" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Chance Crítica Base" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Ignora Absorção" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Ignora Esquivar" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% chance de acerto crítico em alvos tornados lentos" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "Dano Elemental (%s)" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Requer um %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Requer Poder: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Clica para desbloquear (utiliza 1 Ponto de Habilidade)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Requer 1 Ponto de Habilidade" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d ponto de habilidade não utilizado" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d pontos de habilidade não utilizados" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Próximo Nível:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Baú Compartilhado" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Não é possível armazenar itens no baú." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Este item não pode ser guardado no baú." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "O baú está cheio." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Não é possível guardar os itens no baú: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Comércio" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Recompra" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Vendedor" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "Escudo +%d" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Já estás transformado, destransforma-te primeiro." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Não foi possível desfazer a transformação nesta posição." @@ -1330,132 +1581,225 @@ msgid "Completed Quests" msgstr "Missões Concluídas" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Jogo gravado." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Retroceder" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "Tecla de Maiúsculas" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "End" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Home" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Insert" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Alt Esquerdo" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Ctrl Esquerdo" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Shift Esquerdo" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "NumLock" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "PageDown" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "PageUp" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pause" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "PrintScreen" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Alt Direito" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Ctrl Direito" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Enter" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Shift Direito" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "ScrollLock" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Espaço" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tab" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Rato %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Eixo %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Eixo %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Botão %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(nenhum)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "D-Pad sensível ao toque" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "Botões sensíveis ao toque" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Toque" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Não é possível associar: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "'%s' já não está associado a:" @@ -1618,16 +1962,16 @@ msgid "Base MP" msgstr "Mana base" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "m" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s segundo" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s segundos" diff --git a/mods/default/languages/engine.pt_BR.po b/mods/default/languages/engine.pt_BR.po index 9f24a65..ab0d3da 100644 --- a/mods/default/languages/engine.pt_BR.po +++ b/mods/default/languages/engine.pt_BR.po @@ -5,16 +5,16 @@ # # Translators: # Vicente Monteiro, 2018 -# Rui , 2018 +# Rui , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Rui , 2018\n" +"Last-Translator: Rui , 2019\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/flareorg/teams/84925/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,76 +22,83 @@ "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Parabéns, você atingiu o nível %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Você pode aumentar um atributo através do menu do Personagem." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Você foi derrotado. Fim do Jogo! ${INPUT_CONTINUE} para voltar a tela " -"principal." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Você foi derrotado. ${INPUT_CONTINUE} para continuar." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "Transformação expirada. Você foi transferido a um lugar seguro." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s removido." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s removido." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Você recebeu %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Você recebeu %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Você recebeu %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Você recebeu %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Você recebeu %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Você recebeu %d XP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "HP restaurado." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "MP restaurado." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "HP e MP restaurados." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Efeitos negativos removidos." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "HP e MP restaurados, efeitos negativos removidos" @@ -115,150 +122,772 @@ "\n" "O renderizador padrão, geralmente mais rápido que o renderizador SDL software." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Aventureiro" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "errou" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d HP" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d MP" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Destino desconhecido" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Carregando..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Excluir" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Excluir jogo salvo?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Voltar" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Novo" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Selecione um espaço" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Ative o mod de campanha para continuar" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Continuar" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Entrando no mundo do jogo..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Carregando jogo salvo..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Jogo salvo inválido" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Nível %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Cancelar" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Criar" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Aleatória" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Escolha um retrato" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Digite um nome" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Morte permanente?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Escolha uma classe" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Jogar" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Ative o mod core para continuar" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Opções " + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Sobre" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Sair" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Aceitar" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Cima" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Baixo" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Esquerda" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Direita" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Barra1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Barra2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Barra3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Barra4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Barra5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Barra6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Barra7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Barra8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Barra9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Barra0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Personagem" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventario" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Poderes" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Diário" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Principal1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Principal2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Delete" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Barra de Ação Aceitar" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Barra de Ação Esquerda" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Barra de Ação Direita" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Barra de Ação Usar" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menu do desenvolvedor" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Mouse esq." + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Mouse do Meio" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Mouse dir." + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Roda para Cima" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Roda para Baixo" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Mouse X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Mouse X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Item Desconhecido" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Velocidade" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Velocidade de Ataque" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Resistência (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Necessário %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Item de Missão" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Quantidade: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorver: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorver: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Nível Necessário %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Necessário %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Classe Necessária : %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Preço de Compra: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Preço de Compra: %d %s cada" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Preço de Venda: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Preço de Venda: %d %s cada" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Conjunto:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d Items:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Pressione [%s] para ler" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Pressione [%s] para usar" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Atalho: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "MP insuficiente." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Restante:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d pilhas" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Nome" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Nível" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Reduz o dano recebido de \"%s\" ataques elementais." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "XP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Próximo: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "básico (%d), bônus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Estatísticas:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Cada nível concede %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Cada ponto de %s concede %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Limpar" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Atribuir:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Padrões" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Restaurar padrões?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "OK" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Cancelar" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Continuar" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Sair" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Video" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Áudio" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Interface" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Entrada" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Teclas de Atalho" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Interrompido" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Renderizador" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Tela Cheia" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Superfícies por Hardware" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "V-Sync" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Filtragem" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "DPI scaling" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Alterar gamma" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Volume dos efeitos" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Volume das músicas" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Volume dos efeitos" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Idioma" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Exibir quadros por segundo" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Renderizar cursor do mouse por hardware" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Modo daltônico" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Renderizar cursor do mouse por hardware" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Modo desenvolvedor" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Legenda" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Mods Ativos" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Mods Disponíveis" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Desabilitar" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Habilitar >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Versão:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Jogo:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Versão do motor:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Mods necessários:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Limpar" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Atribuir:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Video" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Entrada" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Teclas de Atalho" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Exibir rótulos na barra de status" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Exibir rótulos de combate" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Equipar itens automaticamente" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Controlador" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Mover o personagem utilizando o mouse" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Mirar com mouse" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Não utilizar o mouse" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Zona inoperante do controlador" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -266,7 +895,7 @@ "Tentar armazenar superfícies na memória de vídeo e não na memória do " "sistema. O efeito que isso terá no desempenho depende do renderizador." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -274,7 +903,7 @@ "Evita o \"tearing\" da tela. Desative se você tiver engasgos no modo janela " "ou atraso nos controles." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -284,628 +913,190 @@ " de renderização. Caso contrário, apenas as dimensões da janela serão " "usadas." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Experimental" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Para dispositivos portáteis" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Renderizador" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Tela Cheia" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Mover o personagem utilizando o mouse" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Superfícies por Hardware" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "V-Sync" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Filtragem" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "DPI scaling" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Alterar gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Usar controlador" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Controlador" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Mirar com mouse" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Não utilizar o mouse" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Zona inoperante do controlador" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Carregando..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Excluir" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Excluir jogo salvo?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Voltar" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Novo" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Selecione um espaço" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Ative o mod de campanha para continuar" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Continuar" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Entrando no mundo do jogo..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Carregando jogo salvo..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Jogo salvo inválido" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Nível %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Criar" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Aleatória" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Escolha um retrato" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Digite um nome" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Morte permanente?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Escolha uma classe" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Jogar" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Ative o mod core para continuar" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Opções " - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Sobre" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Sair" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Aceitar" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Cima" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Baixo" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Esquerda" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Direita" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Barra1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Barra2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Barra3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Barra4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Barra5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Barra6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Barra7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Barra8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Barra9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Barra0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Personagem" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventario" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Poderes" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Diário" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Principal1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Principal2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Delete" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Barra de Ação Aceitar" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Barra de Ação Esquerda" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Barra de Ação Direita" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Barra de Ação Usar" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menu do desenvolvedor" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Mouse esq." - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Mouse do Meio" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Mouse dir." - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Roda para Cima" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Roda para Baixo" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Mouse X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Mouse X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Item Desconhecido" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Velocidade" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Velocidade de Ataque" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "Resistência (%s)" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Necessário %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Item de Missão" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Quantidade: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorver: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorver: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Nível Necessário %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Necessário %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Classe Necessária : %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Preço de Compra: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Preço de Compra: %d %s cada" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Preço de Venda: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Preço de Venda: %d %s cada" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Conjunto:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d Items:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Pressione [%s] para usar" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Pressione [%s] para ler" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Exibir rótulos na barra de status" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Exibir rótulos de combate" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Atalho: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "MP insuficiente." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Restante:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d pilhas" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Nome" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Nível" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d ponto não utilizados" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d pontos não utilizados" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Reduz o dano recebido de \"%s\" ataques elementais." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "XP: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Próximo: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "básico (%d), bônus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Estatísticas:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Cada nível concede %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Cada ponto de %s concede %d." - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Mods Ativos" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Mods Disponíveis" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Desabilitar" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Habilitar >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Versão:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Jogo:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Versão do motor:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Mods necessários:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(nenhum)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Salvar e Sair" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Executar" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Console do Desenvolvedor" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Utilize '%s' para inspecionar com o cursor." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "Argumentos com espaços devem estar entre aspas duplas. Exemplo: " -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Digite 'help' para obter a lista de comandos." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Distância" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Entidade" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "nenhum" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "muro" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "parede curta / fosso" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "entidade" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "entidade, aliada" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Principal" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "adiciona um poder a barra de ação" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "alterna on/off todos os elementos do HUD" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "alterna on/off o hud de desenvolvedor" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -913,11 +1104,11 @@ "Exibe uma lista de poderes que corresponda ao termo pesquisado. Se nenhum " "termo for informado todos os itens serão exibidos." -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "Exibe todos os nomes de arquivos mapa localizados na pasta \"maps/\"." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -925,7 +1116,7 @@ "Exibe a campanha ativa e sua situação que corresponda ao termo pesquisado. " "Se nenhum termo for informado todos os itens serão exibidos." -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -933,171 +1124,155 @@ "Exibe uma lista de itens que correspondam ao termo pesquisado. Se nenhum " "termo for informado todos os itens serão exibidos." -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "Analisa uma série de componentes de eventos e os executa como um único " "evento" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "limpa o histórico de comando" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "exibe esse texto" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Alterna entre o hud de desenvolvedor" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Alterna o hud" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "ERRO: Número incorreto de argumentos" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "DICA:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "ERRO: '%s' não é uma chave de evento válida" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "ERROR: Poucos argumentos" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = ..." -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "ERRO: Comando desconhecido" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "DICA: Digite help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s nível %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Morto" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Destruído" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Interrompido" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Salvar e Sair" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Sair" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Continue" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Equipar itens automaticamente" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Perdeu %d%% de %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Perdeu %d%% do total de XP." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Perdeu %d%% do atual nível de XP." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Perdeu %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Item(s) coletados:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Utilize ou equipe o item:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "%s modificadores" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Selecione a quantidade do item:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Pilha de itens do baú:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Vender pilha de itens:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Você não possui o suficiente para adquirir este item." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Você não pode utilizar este item agora." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Este item só pode ser usado na barra de ação." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Inventário está cheio." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Insuficiente %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Este item não pode ser vendido" @@ -1109,214 +1284,259 @@ msgid "Quests" msgstr "Missões" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "XP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Este item não pode ser descartado." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Digite a quantidade:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Passivo" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Custa %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Custa %d HP" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Esfriar:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Dano por segundo" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "HP por segundo" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "MP por segundo" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Imobilizar" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Imunidade" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Imunidade a danos de longo prazo" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Imunidade a desaceleração" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Imunidade ao atordoamento" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Imunidade ao roubo de HP" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Imunidade ao roubo de MP" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Imunidade a contragolpe" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Imunidade a reflexão de dano" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Atordoar" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Ressuscitar automaticamente" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Converter" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Medo" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Vida útil" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Escudo Mágico" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Cura" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Contragolpe" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% chance" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Precisão Básica" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Chance Crítica Básica" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Ignora Absorção" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Ignora Esquiva" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% Chance de acerto crítico a alvos desacelerados." -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "Dano Elemental (%s)" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Requer um %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Requer Poder: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Aperte para Desbloquear (utiliza 1 Ponto de Habilidade)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Requer 1 Ponto de Habilidade" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d ponto de habilidade não utilizado" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d pontos de habilidade não utilizados" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Próximo Nível:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Baú Compartilhado" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Não e possível armazenar itens de missão no baú." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Baú esta cheio." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Troca" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Recompra" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Vendedor" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Escudo" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Você já foi transformado, desfaça a transformação primeiro." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Não foi possível desfazer a transformação nesta posição." @@ -1324,132 +1544,225 @@ msgid "Completed Quests" msgstr "Missões Concluídas" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Jogo salvo." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Backspace" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "CapsLock" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "End" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Home" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Insert" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Alt Esquerdo" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Ctrl Esquerdo" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Shift Esquerdo" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "NumLock" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "PageDown" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "PageUp" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pause" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "PrintScreen" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Alt Direito" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Ctrl Direito" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Enter" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Shift Direito" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "ScrollLock" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Espaço" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tab" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Mouse %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Eixo %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Eixo %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Botão %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(nenhum)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Tap" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "'%s' não está mais obrigado a:" @@ -1612,16 +1925,16 @@ msgid "Base MP" msgstr "MP Básico" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s segundo" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s segundos" diff --git a/mods/default/languages/engine.ru.po b/mods/default/languages/engine.ru.po index 9a4f416..5796838 100644 --- a/mods/default/languages/engine.ru.po +++ b/mods/default/languages/engine.ru.po @@ -4,17 +4,17 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Justin Jacobs , 2018 # Ademaro , 2018 +# Justin Jacobs , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Ademaro , 2018\n" +"Last-Translator: Justin Jacobs , 2019\n" "Language-Team: Russian (https://www.transifex.com/flareorg/teams/84925/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,76 +22,83 @@ "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Поздравляем! Вы достигли уровень %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Вы можете увеличить один атрибут в Меню Персонажа." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Вы потерпели поражение. Игра окончена! Нажмите ${INPUT_CONTINUE}, чтобы " -"выйти в Меню." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Вы потерпели поражение. Нажмите ${INPUT_CONTINUE}, чтобы продолжить." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "Трансформация завершилась. Вы были возвращены в безопасное место." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s убрано." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s убран." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Вы получаете %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Вы получаете %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Вы получаете %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Вы получаете %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Вы получаете %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Вы получаете %d опыта." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Жизнь восстановлена." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Мана восстановлена." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "Жизнь и Мана восстановлены." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Отрицательные эффекты убраны." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "Жизнь и Мана восстановлены, отрицательные эффекты убраны" @@ -101,6 +108,9 @@ "\n" "Often slower, but less likely to have issues." msgstr "" +"SDL software рендерер\n" +"\n" +"Чаще всего медленнее, но и проблемы возникают реже." #: ../../../src/DeviceList.cpp:59 msgid "" @@ -108,980 +118,1166 @@ "\n" "The default renderer that is often faster than the SDL software renderer." msgstr "" - -#: ../../../src/EngineSettings.cpp:561 +"SDL hardware рендерер\n" +"\n" +"Рендерер по-умолчанию. Быстрее, чем SDL software рендерер." + +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Авантюрист" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "промах" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d Жизни" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d Маны" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Неизвестная цель" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Загрузка..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Удалить Игру" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Удалить эту сохранённую игру?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Выйти в Меню" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Новая Игра" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Выберите Слот" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Включите сюжетный мод для продолжения" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Загрузить Игру" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Вход в игровой мир..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Загрузка сохранённой игры..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Недействительная игра" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Уровень %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Отмена" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Создать" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Случайно" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Выберите Портрет" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Выберите Имя" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Одна Жизнь?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Выберите Класс" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Играть" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Включите основной мод для продолжения" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Настройки" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Авторы" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Выйти из Игры" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Принять" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Вверх" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Вниз" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Влево" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Вправо" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Меню1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Меню2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Меню3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Меню4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Меню5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Меню6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Меню7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Меню8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Меню9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Меню0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Персонаж" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Инвентарь" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Силы" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Журнал" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Главное1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Главное2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "CTRL" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "SHIFT" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "ALT" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Удалить" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Панель действий: Принять" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Панель действий: Влево" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Панель действий: Вправо" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Панель действий: Использовать" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Меню Разработчика" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Левая Кнопка Мыши" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Средняя Кнопка Мыши" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Правая Кнопка Мыши" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Прокрутка Вверх" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Прокрутка Вниз" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Мышь X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Мышь X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Неизвестный Предмет" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Скорости" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Скорость Атаки" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Сопротивление (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Требуется %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Предмет Задания" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Качество: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Поглощение: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Поглощение: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Требуется Уровень %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Требуется %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Требуется Класс: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Цена Покупки: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Цена Покупки: %d %s каждый" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Цена Продажи: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Цена Продажи: %d %s каждый" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d предметов:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Нажмите [%s], чтобы прочитать" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Нажмите [%s], чтобы использовать" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Горячая клавиша: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Недостаточно МР." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Осталось:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Имя" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Уровень" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Снижает урон полученный от \"%s\" элементальной атаки." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Опыт: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Следующий: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "базовое (%d), бонус (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Связанные атрибуты:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Каждый уровень дает %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Каждое очко %s дает %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Очистить" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Назначение:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" -msgstr "Дефаулт" - -#: ../../../src/GameStateConfigBase.cpp:89 +msgstr "По-умолчанию" + +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Сбросить ВСЕ настройки?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "ОК" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Отмена" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Продолжить" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "По умолчанию" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Выпадающие предметы подсвечиваются на удалении от игрока или врага, при " +"нажатии клавиши 'Alt' и наведении курсора." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Показывать всегда" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Всегда подсвечивать выпадающие предметы. Временно скрыть подсветку клавишей " +"'Alt'." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Скрывать" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Не подсвечивать выпадающие предметы до наведения на них курсора. Временно " +"подстветить все предметы клавишей 'Alt'." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Видимое" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Видимое (2х увеличение)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Выйти" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Видео" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Аудио" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Интерфейс" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Ввод" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Привязки Клавиш" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Моды" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Пауза" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Время в игре" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Рендерер" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Полноэкранный Режим" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Аппаратные поверхности" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "Верт. Синхронизация" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Фильтрация Текстур" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Масштабирование DPI" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Слои Параллакса" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Включить изменение гаммы" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Гамма" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Громкость Звука" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Громкость Музыки" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Громкость Звука" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Язык" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Показывать FPS" -#: ../../../src/GameStateConfigBase.cpp:270 -msgid "Colorblind Mode" -msgstr "Режим цветовой слепоты" - -#: ../../../src/GameStateConfigBase.cpp:274 +#: ../../../src/MenuConfig.cpp:376 msgid "Hardware mouse cursor" msgstr "Аппаратный курсор мыши" -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:377 +msgid "Colorblind Mode" +msgstr "Режим адаптации для дальтоников" + +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" -msgstr "Режим Девелоперов" - -#: ../../../src/GameStateConfigBase.cpp:282 +msgstr "Режим Разработчика" + +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Субтитры" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Активные Моды" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Доступные Моды" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Отключить" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Включить >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Версия:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Игра:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Версия движка:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Требуются моды:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Очистить" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Видео" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Ввод" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Привязки Клавиш" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Подсветка выпадающих вещей" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Режим мини-карты" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Всегда показывать метки в строке состояния" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Разрешить модам автоскрытие панелей" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Показывать сообщения битвы" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Сразу надевать предметы" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Помечать меткой скрытых врагов" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Джойстик" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Управлять героем мышью" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Целиться мышью" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Не использовать мышь" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Мёртвая зона джойстика" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:189 +"Будет нагружать память видеокарты вместо системной памяти. Эффект зависит от" +" рендерера." + +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Экспериментально" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Для наладонных устройств" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Полноэкранный Режим" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Управлять героя мышью" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Аппаратные поверхности" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "Верт. Синхронизация" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Фильтрация Текстур" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Включить изменение гаммы" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Гамма" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Использовать джойстик" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Джойстик" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Целиться мышью" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Не использовать мышь" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Мёртвая зона джойстика" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Загрузка..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Удалить Игру" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Удалить эту сохранённую игру?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Выйти в Меню" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Новая Игра" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Выберите Слот" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Включите сюжетный мод для продолжения" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Загрузить Игру" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Вход в игровой мир..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Загрузка сохранённой игры..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Недействительная игра" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Уровень %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Создать" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Выберите Портрет" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Выберите Имя" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Одна Жизнь?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Выберите Класс" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Играть" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Включите основной мод для продолжения" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Настройки" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Авторы" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Выйти из Игры" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Принять" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Вверх" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Вниз" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Влево" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Вправо" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Меню1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Меню2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Меню3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Меню4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Меню5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Меню6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Меню7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Меню8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Меню9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Меню0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Персонаж" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Инвентарь" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Силы" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Журнал" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Главное1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Главное2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "CTRL" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "SHIFT" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "ALT" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Удалить" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Панель действий: Принять" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Панель действий: Влево" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Панель действий: Вправо" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Панель действий: Использовать" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Меню Девелопера" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Левая Кнопка Мыши" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Средняя Кнопка Мыши" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Правая Кнопка Мыши" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Прокрутка Вверх" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Прокрутка Вниз" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Мышь X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Мышь X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Неизвестный Предмет" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Скорости" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Предмет Задания" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Качество: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Поглощение: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Поглощение: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Требуется Уровень %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Требуется %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Требуется Класс: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Цена Покупки: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Цена Покупки: %d %s каждый" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Цена Продажи: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Цена Продажи: %d %s каждый" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d предметов: " - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Всегда показывать метки в строке состояния" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Показывать сообщения битвы" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Горячая клавиша: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x%d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Осталось:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Имя" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Уровень" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Опыт: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Следующий: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "базовое (%d), бонус (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Связанные атрибуты:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "Предоставлять дополнительный текст для информации связанной с цветом." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Некоторые моды автоматически скрывают панель опыта/маны/жизни. Отключив эту " +"опцию панели будут отображаться постоянно." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Если включено, то пустые слоты предметов сразу будут заполняться подходящими" +" предметами." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Показывать метку над врагами и игроком, когда они скрыты высокими объектами." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Активные Моды" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Доступные Моды" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Отключить" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Включить >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Версия:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Игра:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Версия движка:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Требуются моды:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(нет)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Сохранить и выйти" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Выполнить" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" -msgstr "Консоль Девелопера" - -#: ../../../src/MenuDevConsole.cpp:141 +msgstr "Консоль Разработчика" + +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:146 +msgstr "Используй '%s' чтобы исследовать с помощью курсора." + +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Аргументы с пробелами должны быть заключены в двойные кавычки. Пример:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +msgstr "Введи 'help' чтобы увидеть список команд." + +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:224 +msgstr "px" + +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +msgstr "Дистанция" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +msgstr "Сущность" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +msgstr "отсутствует" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +msgstr "стена" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:266 +msgstr "короткая стена" + +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:267 +msgstr "частица" + +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:360 +msgstr "Плитка" + +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "добавляет силу в панель действий" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:362 +msgstr "включает/выключает счетчик FPS" + +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "переключает отображение элементов интерфейса" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "переключает интерфейс разработчика" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" - -#: ../../../src/MenuDevConsole.cpp:365 +"Выводит найденные силы. Если ничего не указать, показывает все доступные " +"силы" + +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." -msgstr "Печатает все названия фаилов карт в каталоге «maps»" - -#: ../../../src/MenuDevConsole.cpp:366 +msgstr "Печатает все названия файлов в каталоге \"maps/\"." + +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" "Выводит найденные статусы активных кампаний. Если ничего не указать, " -"показывает все активные статусы." - -#: ../../../src/MenuDevConsole.cpp:367 +"показывает все активные статусы" + +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" "Выводит список найденных предметов. Если ничего не указать, показывает все " -"предметы." - -#: ../../../src/MenuDevConsole.cpp:368 +"предметы" + +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "анализирует набор компонентов событий и выполняет их как одно событие" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "очищает историю команд" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "показывает этот текст" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Переключён интерфейс разработчика" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Переключён интерфейс" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:534 +msgstr "Переключён счетчик FPS" + +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +msgstr "ОШИБКА: Неправильное количество аргументов" + +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 +msgstr "ПОДСКАЗКА:" + +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "ОШИБКА: «%s» — недопустимый ключ события" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "ОШИБКА: недостаточно аргументов" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "ОШИБКА: неизвестная команда" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "ПОДСКАЗКА: наберите help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s уровень %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Мёртв" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" -msgstr "" - -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Пауза" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Сохранить и выйти" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Выйти" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Продолжить" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Сразу надевать предметы" - -#: ../../../src/MenuInventory.cpp:188 +msgstr "Уничтожен" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:195 +msgstr "Потеряно %d%% из %s." + +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:200 +msgstr "Потеряно %d%% от общего XP." + +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:226 +msgstr "Потеряно %d%% от актуального числа ХР." + +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Потеряно %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Подобраны предметы:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Использовать или надеть предмет:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "%s модификаторов" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Выберите количество предметов:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Спрятать набор предметов в тайник:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Продать набор предметов:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Недостаточно требуемых предметов." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." -msgstr "" - -#: ../../../src/MenuInventory.cpp:611 +msgstr "Вы не можете использовать этот предмет сейчас." + +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Этот предмет можно использовать только с панели действия." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Инвентарь полон." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Недостаточно %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Этот предмет нельзя продать." @@ -1093,350 +1289,488 @@ msgid "Quests" msgstr "Задания" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Опыт: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Этот предмет нельзя выбросить." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Введите количество:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Пасивные" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Стоит %d Маны" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Стоит %d Жизни" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Восстановление:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Урона в секунду" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "Жизни в секунду" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "Маны в секунду" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Зафиксировать" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Устойчивость" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Устойчивость к урону в течение долгого времени" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Устойчивость к снегу" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Устойчивость к оглушению" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Устойчивость к краже жизни" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Устойчивость к краже маны" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Устойчивость к сбиванию с ног" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Устойчивость к отражению урона" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Оглушение" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Автоматически возрождаться после смерти" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Преобразовать" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Страх" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Продолжительность жизни" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Магический Щит" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Лечение" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Сбивание с ног" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% шанс" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Базовая Меткость" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Базовый шанс критического урона" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Игнорирует Поглощение" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Игнорирует Уклонение" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% Шанс критического урона по замедленным целям" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1114 +msgstr "Элементальный урон (%s)" + +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Требуется %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Требуется Сила: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Щёлкните, чтобы разблокировать (за 1 очко навыка)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Требуется 1 Очко Навыка" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Следующий уровень:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Общие Запасы" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Предметы заданий нельзя хранить в тайнике." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Тайник заполнен." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Торговать" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Выкуп" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Торговец" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Щит" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Вы уже трансформированы, сперва растрансформируйтесь." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Здесь нельзя растрансформироваться." #: ../../../src/QuestLog.cpp:234 msgid "Completed Quests" -msgstr "" - -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +msgstr "Выполненные Квесты" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Игра сохранена." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" -msgstr "" - -#: ../../../src/SDLInputState.cpp:583 +msgstr "Backspace" + +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +msgstr "CapsLock" + +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" -msgstr "" - -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +msgstr "Escape" + +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" -msgstr "" - -#: ../../../src/SDLInputState.cpp:590 +msgstr "Insert" + +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:591 +msgstr "Left Alt" + +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:593 +msgstr "Left Ctrl" + +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:594 +msgstr "Left Shift" + +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:595 +msgstr "NumLock" + +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" -msgstr "" - -#: ../../../src/SDLInputState.cpp:596 +msgstr "PageDown" + +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" -msgstr "" - -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +msgstr "PageUp" + +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" -msgstr "" - -#: ../../../src/SDLInputState.cpp:599 +msgstr "PrintScreen" + +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:600 +msgstr "Right Alt" + +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:601 +msgstr "Right Ctrl" + +#: ../../../src/SDLInputState.cpp:692 msgid "Return" -msgstr "" - -#: ../../../src/SDLInputState.cpp:603 +msgstr "Return" + +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:604 +msgstr "Right Shift" + +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:605 +msgstr "ScrollLock" + +#: ../../../src/SDLInputState.cpp:696 msgid "Space" -msgstr "" - -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +msgstr "Пробел" + +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Мышь %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Ось %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Ось %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Кнопка %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(нет)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" -msgstr "" - -#: ../../../src/SDLInputState.cpp:701 +msgstr "Сенсорное управление D-Pad" + +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" -msgstr "" - -#: ../../../src/SDLInputState.cpp:716 +msgstr "Сенсорные клавиши" + +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Коснитесь" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" -msgstr "" +msgstr "'%s' больше не привязана/о к:" #: ../../../src/Stats.cpp:38 msgid "Max HP" @@ -1444,7 +1778,7 @@ #: ../../../src/Stats.cpp:39 msgid "Total amount of HP." -msgstr "" +msgstr "Общее количество НР." #: ../../../src/Stats.cpp:43 msgid "HP Regen" @@ -1460,7 +1794,7 @@ #: ../../../src/Stats.cpp:49 msgid "Total amount of MP." -msgstr "" +msgstr "Общее количество МР." #: ../../../src/Stats.cpp:53 msgid "MP Regen" @@ -1479,6 +1813,8 @@ "Accuracy rating. The enemy's Avoidance rating is subtracted from this value " "to calculate your likeliness to land a direct hit." msgstr "" +"Шанс попадания. Шанс врага увернуться вычитается из этого значения, чтобы " +"определить вероятность попадания." #: ../../../src/Stats.cpp:63 msgid "Avoidance" @@ -1489,6 +1825,8 @@ "Avoidance rating. This value is subtracted from the enemy's Accuracy rating " "to calculate their likeliness to land a direct hit." msgstr "" +"Шанс увернуться. Это значение вычитается из шанса попадания врага, чтобы " +"определить вероятность попадания врага." #: ../../../src/Stats.cpp:68 msgid "Absorb Min" @@ -1496,7 +1834,7 @@ #: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 msgid "Reduces the amount of damage taken." -msgstr "" +msgstr "Уменьшает получаемый урон." #: ../../../src/Stats.cpp:73 msgid "Absorb Max" @@ -1508,7 +1846,7 @@ #: ../../../src/Stats.cpp:79 msgid "Chance for an attack to do extra damage." -msgstr "" +msgstr "Шанс дополнительного урона при атаке." #: ../../../src/Stats.cpp:83 msgid "Bonus XP" @@ -1570,7 +1908,7 @@ #: ../../../src/Stats.cpp:118 msgid "HP Steal" -msgstr "" +msgstr "Кража ХР" #: ../../../src/Stats.cpp:119 msgid "Percentage of HP stolen per hit." @@ -1578,7 +1916,7 @@ #: ../../../src/Stats.cpp:123 msgid "MP Steal" -msgstr "" +msgstr "Кража МР" #: ../../../src/Stats.cpp:124 msgid "Percentage of MP stolen per hit." @@ -1592,16 +1930,16 @@ msgid "Base MP" msgstr "Базовая Мана" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "к" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s секунда" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s секунды" diff --git a/mods/default/languages/engine.sk.po b/mods/default/languages/engine.sk.po index c32f13f..5eac1d7 100644 --- a/mods/default/languages/engine.sk.po +++ b/mods/default/languages/engine.sk.po @@ -5,15 +5,16 @@ # # Translators: # Justin Jacobs , 2018 +# MiroslavR , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: Justin Jacobs , 2018\n" +"Last-Translator: MiroslavR , 2019\n" "Language-Team: Slovak (https://www.transifex.com/flareorg/teams/84925/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,76 +22,85 @@ "Language: sk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "Vaše zdravie je nízke!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" -msgstr "Gratulujem, dosiahol si stupeň %d!" - -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Teraz si môžeš zlepšiť jeden atribút cez Menu Postavy" - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +msgstr "Gratulujeme, dosiahli ste úroveň %d!" + +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Cez ponuku Postava si môžete vylepšiť jeden alebo viacero atribútov." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Cez ponuku Sily si môžete odomknúť jednu alebo viacero schopností." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." -msgstr "" - -#: ../../../src/CampaignManager.cpp:153 +msgstr "Čas premeny vypršal. Presunuli ste sa naspäť na bezpečné miesto." + +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "" -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Dostali ste %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Dostali ste %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." -msgstr "Dostal si %s." - -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Dostal si %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "" - -#: ../../../src/CampaignManager.cpp:195 +msgstr "Dostali ste %s." + +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." -msgstr "Dostal si %d XP." - -#: ../../../src/CampaignManager.cpp:201 +msgstr "Dostali ste %d XP." + +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." -msgstr "" - -#: ../../../src/CampaignManager.cpp:205 +msgstr "HP boli obnovené." + +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." -msgstr "" - -#: ../../../src/CampaignManager.cpp:210 +msgstr "MP boli obnovené." + +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." -msgstr "" - -#: ../../../src/CampaignManager.cpp:214 +msgstr "HP a MP boli obnovené." + +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." -msgstr "" - -#: ../../../src/CampaignManager.cpp:220 +msgstr "Negatívne efekty boli odstránené." + +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" -msgstr "" +msgstr "HP a MP boli obnovené, negatívne efekty odstránené" #: ../../../src/DeviceList.cpp:56 msgid "" @@ -98,6 +108,9 @@ "\n" "Often slower, but less likely to have issues." msgstr "" +"Softvérové vykresľovanie pomocou SDL\n" +"\n" +"Často pomalšie, ale menej náchylné na chyby." #: ../../../src/DeviceList.cpp:59 msgid "" @@ -105,1327 +118,1668 @@ "\n" "The default renderer that is often faster than the SDL software renderer." msgstr "" - -#: ../../../src/EngineSettings.cpp:561 +"Hardvérové vykresľovanie pomocou SDL\n" +"\n" +"Predvolené vykresľovanie, ktoré je často rýchlejšie ako softvérové vykresľovanie pomocou SDL." + +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Dobrodruh" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" -msgstr "" - -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +msgstr "minutie" + +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" -msgstr "" - -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +msgstr "+%d HP" + +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" -msgstr "" - -#: ../../../src/EventManager.cpp:738 +msgstr "+%d MP" + +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Neznámy cieľ" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Načítava sa..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Zmazať pozíciu" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Zmazať túto pozíciu?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Návrat na úvod" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nová hra" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Vyberte pozíciu" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Načítať hru" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Vstupuje sa do sveta hry..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Načítava sa uložená hra..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Neplatná uložená pozícia" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Úroveň %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Zrušiť" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Vytvoriť" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Vybrať náhodne" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Vyberte si vzhľad" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Vyberte si meno" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Trvalá smrť?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Vyberte si triedu" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Hrať hru" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Konfigurácia" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Autori" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Ukončiť hru" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Prijať" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Nahor" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Nadol" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Doľava" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Doprava" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Panel 1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Panel 2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Panel 3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Panel 4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Panel 5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Panel 6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Panel 7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Panel 8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Panel 9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Panel 0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Postava" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventár" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Sily" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Denník" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Hlavná akcia 1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Hlavná akcia 2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Delete" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Panel akcií: prijať" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Panel akcií: doľava" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Panel akcií: doprava" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Panel akcií: použiť" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Vývojárska ponuka" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Ľavé tlačidlo myši" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Stredné tlačidlo myši" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Pravé tlačidlo myši" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Koliesko myši nahor" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Koliesko myši nadol" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Neznámy predmet" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Odolnosť (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Vyžaduje %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Predmet úlohy" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Kvalita: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Pohltenie: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Pohltenie: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Vyžaduje úroveň %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Vyžaduje triedu: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Kúpna cena: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Kúpna cena: %d %s za kus" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Predajná cena: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Predajná cena: %d %s za kus" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Súprava:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Prečítate stlačením [%s]" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Použijete stlačením [%s]" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Klávesová skratka: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Nedostatok MP." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Meno" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Stupeň" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Znižuje zranenie utŕžené zo živelných útokov „%s“." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "XP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Nasl.: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "základ (%d), bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Súvisiace charakteristiky:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Každá úroveň pridá %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Vymazať" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Priradiť:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:89 +msgstr "Predvolené" + +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +msgstr "Vrátiť VŠETKY nastavenia?" + +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Zruš" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +msgstr "OK" + +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Pokračovať" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Zobrazovať všetky popisy predmetov na zemi okrem tých, ktoré zakrýva hráč " +"alebo nepriateľ. Stlačením klávesu Alt môžete dočasne zobraziť všetky " +"popisy." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Vždy zobrazovať popisy predmetov na zemi. Stlačením klávesu Alt môžete " +"dočasne skryť všetky popisy." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Vždy skrývať popisy predmetov na zemi okrem prípadu, že na predmet ukazuje " +"kurzor myši. Stlačením klávesu Alt môžete dočasne zobraziť všetky popisy." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Viditeľná" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Viditeľná (2x priblíženie)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Ovláda typ upozornenia, ktoré sa aktivuje, keď zdravie hráča klesne pod prah" +" nízkeho zdravia." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Zobrazenie správy" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Prehratie zvuku" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Zmena kurzora" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Zakázané" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Všetky" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Správa a kurzor" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Správa a zvuk" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Zvuk a kurzor" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Správa" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Kurzor" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Zvuk" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Keď zdravie hráča klesne pod tento prah, spustia sa oznámenia o nízkom " +"zdraví, ak je povolené aspoň jedno z nich." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Ukončiť" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Obraz" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +msgstr "Zvuk" + +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +msgstr "Rozhranie" + +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Vstup" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Priradenie klávesov" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +msgstr "Modifikácie" + +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Hra pozastavená" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Odohraný čas" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Vykresľovanie" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Režim celej obrazovky" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Hardvérové povrchy" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "Vertikálna synchronizácia" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Filtrovanie textúr" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Paralaxné vrstvy" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Povoliť zmenu hodnoty gama" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gama" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Hlasitosť zvukov" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:257 +msgstr "Hlasitosť hudby" + +#: ../../../src/MenuConfig.cpp:374 msgid "Language" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:266 +msgstr "Jazyk" + +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:270 +msgstr "Zobrazovať FPS" + +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Hardvérový kurzor myši" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +msgstr "Režim pre farboslepých" + +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:282 +msgstr "Vývojársky režim" + +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +msgstr "Titulky" + +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Režim minimapy" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Vždy zobrazovať textové označenie indikátorov charakteristík" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Povoliť automatické skrývanie indikátorov charakteristík" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Zobrazovať text o boji" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Automaticky sa vystrojiť predmetmi" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Oznámenie o nízkom zdraví" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Prah nízkeho zdravia" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Ovládať pohyb hrdinu pomocou myši" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Mierenie myšou" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Nepoužívať myš" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Mŕtva zóna joysticku" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Primárne priradenie: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Alternatívne priradenie: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Priradenie pre joystick: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:189 +"Pokúsi sa ukladať povrchy do grafickej pamäte na rozdiel od operačnej " +"pamäte. Vplyv na výkon závisí od typu vykresľovania." + +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:190 +"Zabraňuje trhaniu obrazovky. V prípade „koktania“ v režime okna alebo " +"oneskorenia vstupu toto nastavenie zakážte." + +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "" - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Zmazať Pozíciu" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Zmazať túto pozíciu?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Návrat na úvod" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nová Hra" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Vyber priečinok" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Nahraj Hru" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Vstupuješ do sveta hry..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Nahrávam uloženú hru..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Stupeň %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Vyber si Vzhľad" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Vyber si Meno" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Hrať Hru" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Ukončiť Hru" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Postava" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Vrecká" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Sily" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Poznámky" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Hľadaná Vec" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Pohlť: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Pohlť: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Meno" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Stupeň" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "XP: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Nasl.: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "základ (%d), bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +"Povolí paralaxné (nedlaždicové) vrstvy. Zakázaním tohto nastavenia môžete v " +"niektorých prípadoch zlepšiť výkon." + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Povolí nižšie uvedené nastavenie, ktoré ovláda hodnotu gama obrazovky. " +"Správanie nastavenia gama sa môže líšiť v závislosti od platformy." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Poskytne doplnkové texty pre informácie, ktoré sú vyjadrené hlavne farbami." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Niektoré modifikácie automaticky skrývajú indikátory charakteristík, keď " +"neprejavujú aktivitu. Zakázaním tejto možnosti sa budú zobrazovať vždy." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Ak je toto nastavenie povolené, získanie vhodných predmetov automaticky " +"obsadí prázdne pozície výstroje." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "Umožní ovládať hru výlučne pomocou klávesnice (alebo joysticku)." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Ak je toto nastavenie povolené, útoky hráča budú mierené smerom ku kurzoru " +"myši." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Aktívne modifikácie" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Dostupné modifikácie" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Zakázať" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Povoliť >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Verzia:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Hra:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Verzia jadra:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Požadované modifikácie:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Uložiť a ukončiť" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +msgstr "Vykonať" + +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:141 +msgstr "Vývojárska konzola" + +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:146 +msgstr "‚%s‘ preskúma miesto, na ktorom je kurzor." + +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" - -#: ../../../src/MenuDevConsole.cpp:147 +"Argumenty obsahujúce medzery by mali byť uzavreté v dvojitých úvodzovkách. " +"Napríklad:" + +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +msgstr "Ak chetete získať zoznam príkazov, napíšte ‚help‘." + +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:224 +msgstr "px" + +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +msgstr "Vzdialenosť" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +msgstr "Entita" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +msgstr "žiadna" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +msgstr "stena" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:266 +msgstr "nízka stena / priepasť" + +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:267 +msgstr "entita" + +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:274 +msgstr "entita, spojenecká" + +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:360 +msgstr "Dlaždica" + +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:361 +msgstr "pridá silu do panelu akcií" + +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:362 +msgstr "vypne/zapne zobrazovanie počítadla FPS" + +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:363 +msgstr "vypne/zapne všetky elementy HUD" + +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:364 +msgstr "vypne/zapne HUD pre vývojárov" + +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" - -#: ../../../src/MenuDevConsole.cpp:365 +"Vypíše zoznam síl, ktoré zodpovedajú hľadanému výrazu. Neexistuje hľadaný " +"výraz, ktorý by ich vymenoval všetky" + +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:366 +msgstr "Vypíše všetky názvy súborov máp umiestnených v adresári „maps/“." + +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" - -#: ../../../src/MenuDevConsole.cpp:368 +"Vypíše zoznam predmetov, ktoré zodpovedajú hľadanému výrazu. Neexistuje " +"hľadaný výraz, ktorý by vymenoval všetky predmety" + +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:370 +msgstr "vymaže históriu príkazov" + +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:377 +msgstr "zobrazí tento text" + +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:381 +msgstr "Bolo prepnuté zobrazovanie HUD pre vývojárov" + +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:385 +msgstr "Bolo prepnuté zobrazovanie HUD" + +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:534 +msgstr "Bolo prepnuté zobrazovanie počítadla FPS" + +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +msgstr "CHYBA: Nesprávny počet argumentov" + +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 +msgstr "TIP:" + +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:562 +msgstr "CHYBA: „%s“ nie je platný kľúč udalosti" + +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:564 +msgstr "CHYBA: Príliš málo argumentov" + +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:569 +msgstr "= = ..." + +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:571 +msgstr "CHYBA: Neznámy príkaz" + +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" -msgstr "" - -#: ../../../src/MenuEnemy.cpp:138 +msgstr "TIP: Napíšte help" + +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s stupeň %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Mŕtvy" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Ukonči" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:195 +msgstr "Stratili ste %d %% z %s." + +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:200 +msgstr "Stratili ste %d %% z celkového XP." + +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:226 +msgstr "Stratili ste %d %% z XP aktuálnej úrovne." + +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "" -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" -msgstr "" - -#: ../../../src/MenuInventory.cpp:318 +msgstr "Zobratie predmetu/-ov:" + +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:319 +msgstr "Použitie alebo vystrojenie predmetom:" + +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" -msgstr "" - -#: ../../../src/MenuInventory.cpp:320 +msgstr "Modifikátory pre %s" + +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:323 +msgstr "Výber množstva predmetu:" + +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:325 +msgstr "Uschovanie hromady predmetov:" + +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:592 +msgstr "Predaj hromady predmetov:" + +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." -msgstr "" - -#: ../../../src/MenuInventory.cpp:599 +msgstr "Nemáte dostatočné množstvo vyžadovaného predmetu." + +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." -msgstr "" - -#: ../../../src/MenuInventory.cpp:611 +msgstr "Tento predmet nemožno momentálne použiť." + +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." -msgstr "Tento predmet môžeš použiť iba z pruhu akcií." - -#: ../../../src/MenuInventory.cpp:729 +msgstr "Tento predmet možno použiť iba z panelu akcií." + +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." -msgstr "Vrecká sú plné." - -#: ../../../src/MenuInventory.cpp:849 +msgstr "Inventár je plný." + +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +msgstr "Nedostatok %s." + +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." -msgstr "" +msgstr "Tento predmet nemožno predať." #: ../../../src/MenuLog.cpp:91 msgid "Notes" -msgstr "" +msgstr "Poznámky" #: ../../../src/MenuLog.cpp:92 msgid "Quests" msgstr "Úlohy" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "XP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "Tento predmet nemožno položiť na zem." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" -msgstr "" - -#: ../../../src/MenuPowers.cpp:787 +msgstr "Zadajte množstvo:" + +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" -msgstr "" - -#: ../../../src/MenuPowers.cpp:792 +msgstr "Pasívna" + +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Spotrebuje %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" -msgstr "" - -#: ../../../src/MenuPowers.cpp:801 +msgstr "Spotrebuje %d HP" + +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" -msgstr "" - -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +msgstr "Zranenie za sekundu" + +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" -msgstr "" - -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +msgstr "HP za sekundu" + +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" -msgstr "" - -#: ../../../src/MenuPowers.cpp:885 +msgstr "MP za sekundu" + +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" -msgstr "" - -#: ../../../src/MenuPowers.cpp:896 +msgstr "Imunita" + +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" -msgstr "" - -#: ../../../src/MenuPowers.cpp:899 +msgstr "Imunita voči zraneniu postupom času" + +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" -msgstr "" - -#: ../../../src/MenuPowers.cpp:902 +msgstr "Imunita voči spomaleniu" + +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" -msgstr "" - -#: ../../../src/MenuPowers.cpp:905 +msgstr "Imunita voči omráčeniu" + +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" -msgstr "" - -#: ../../../src/MenuPowers.cpp:908 +msgstr "Imunita voči krádeži HP" + +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" -msgstr "" - -#: ../../../src/MenuPowers.cpp:911 +msgstr "Imunita voči krádeži MP" + +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" -msgstr "" - -#: ../../../src/MenuPowers.cpp:914 +msgstr "Imunita voči odhodeniu" + +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" -msgstr "" - -#: ../../../src/MenuPowers.cpp:917 +msgstr "Imunita voči odrazu zranenia" + +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" -msgstr "" - -#: ../../../src/MenuPowers.cpp:920 +msgstr "Omráčenie" + +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" -msgstr "" - -#: ../../../src/MenuPowers.cpp:923 +msgstr "Automatické oživenie po smrti" + +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" -msgstr "" - -#: ../../../src/MenuPowers.cpp:982 +msgstr "Magický štít" + +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1010 +msgstr "Odhodenie" + +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1062 +msgstr "%d %% šanca" + +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1082 +msgstr "Základná presnosť" + +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1090 +msgstr "Základná šanca na kritický zásah" + +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1095 +msgstr "Ignoruje pohltenie" + +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1100 +msgstr "Ignoruje vyhýbanie" + +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1105 +msgstr "%d %% šanca kriticky zasiahnuť spomalené ciele" + +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1114 +msgstr "Živelné zranenie (%s)" + +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +msgstr "Vyžaduje %s" + +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1163 +msgstr "Vyžaduje silu: %s" + +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +msgstr "Odomknete kliknutím (použije 1 bod zručnosti)" + +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +msgstr "Vyžaduje 1 bod zručnosti" + +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" -msgstr "" - -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +msgstr "Ďalšia úroveň:" + +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Úložisko" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "Súkromné" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "Zdieľané" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Tento predmet nemožno vložiť do úložiska." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Tento predmet nemožno vložiť do súkromného úložiska." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "Tento predmet nemožno vložiť do zdieľaného úložiska." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." -msgstr "" - -#: ../../../src/MenuTalker.cpp:454 +msgstr "Úložisko je plné." + +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Do úložiska nemožno vložiť predmet: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" -msgstr "" - -#: ../../../src/MenuVendor.cpp:58 +msgstr "Obchodovať" + +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" -msgstr "" - -#: ../../../src/MenuVendor.cpp:279 +msgstr "Spätná kúpa" + +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Predavač" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." -msgstr "" - -#: ../../../src/PowerManager.cpp:1404 +msgstr "Už ste raz prešli premenou, najprv ju zvráťte." + +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." -msgstr "" +msgstr "Na tomto mieste nemožno zvrátiť premenu." #: ../../../src/QuestLog.cpp:234 msgid "Completed Quests" -msgstr "" - -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +msgstr "Dokončené úlohy" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." -msgstr "" - -#: ../../../src/SDLInputState.cpp:582 +msgstr "Hra uložená." + +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" -msgstr "" - -#: ../../../src/SDLInputState.cpp:583 +msgstr "Backspace" + +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +msgstr "CapsLock" + +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" -msgstr "" - -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +msgstr "Escape" + +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" -msgstr "" - -#: ../../../src/SDLInputState.cpp:590 +msgstr "Insert" + +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:591 +msgstr "Ľavý Alt" + +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:593 +msgstr "Ľavý Ctrl" + +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:594 +msgstr "Ľavý Shift" + +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:595 +msgstr "NumLock" + +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" -msgstr "" - -#: ../../../src/SDLInputState.cpp:596 +msgstr "PageDown" + +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" -msgstr "" - -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +msgstr "PageUp" + +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" -msgstr "" - -#: ../../../src/SDLInputState.cpp:599 +msgstr "PrintScreen" + +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:600 +msgstr "Pravý Alt" + +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:601 +msgstr "Pravý Ctrl" + +#: ../../../src/SDLInputState.cpp:692 msgid "Return" -msgstr "" - -#: ../../../src/SDLInputState.cpp:603 +msgstr "Return" + +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:604 +msgstr "Pravý Shift" + +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:605 +msgstr "ScrollLock" + +#: ../../../src/SDLInputState.cpp:696 msgid "Space" -msgstr "" - -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +msgstr "Medzerník" + +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" -msgstr "" - -#: ../../../src/SDLInputState.cpp:630 +msgstr "Os %d -" + +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" -msgstr "" - -#: ../../../src/SDLInputState.cpp:633 +msgstr "Os %d +" + +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" -msgstr "" - -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +msgstr "Tlačidlo %d" + +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Nemožno priradiť: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1436,11 +1790,11 @@ #: ../../../src/Stats.cpp:39 msgid "Total amount of HP." -msgstr "" +msgstr "Celkové množstvo HP." #: ../../../src/Stats.cpp:43 msgid "HP Regen" -msgstr "" +msgstr "Regenerácia HP" #: ../../../src/Stats.cpp:44 msgid "Ticks of HP regen per minute." @@ -1452,11 +1806,11 @@ #: ../../../src/Stats.cpp:49 msgid "Total amount of MP." -msgstr "" +msgstr "Celkové množstvo MP." #: ../../../src/Stats.cpp:53 msgid "MP Regen" -msgstr "" +msgstr "Regenerácia MP" #: ../../../src/Stats.cpp:54 msgid "Ticks of MP regen per minute." @@ -1464,23 +1818,27 @@ #: ../../../src/Stats.cpp:58 msgid "Accuracy" -msgstr "" +msgstr "Presnosť" #: ../../../src/Stats.cpp:59 msgid "" "Accuracy rating. The enemy's Avoidance rating is subtracted from this value " "to calculate your likeliness to land a direct hit." msgstr "" +"Hodnotenie presnosti. Vaša pravdepodobnosť priameho zásahu sa počíta " +"odčítaním hodnotenia vyhýbania nepriateľa od tejto hodnoty." #: ../../../src/Stats.cpp:63 msgid "Avoidance" -msgstr "" +msgstr "Vyhýbanie" #: ../../../src/Stats.cpp:64 msgid "" "Avoidance rating. This value is subtracted from the enemy's Accuracy rating " "to calculate their likeliness to land a direct hit." msgstr "" +"Hodnotenie vyhýbania. Nepriateľova pravdepobnosť priameho zásahu sa počíta " +"odčítaním tejto hodnoty od jeho hodnotenia presnosti." #: ../../../src/Stats.cpp:68 msgid "Absorb Min" @@ -1488,7 +1846,7 @@ #: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 msgid "Reduces the amount of damage taken." -msgstr "" +msgstr "Znižuje množstvo utŕženého zranenia." #: ../../../src/Stats.cpp:73 msgid "Absorb Max" @@ -1496,19 +1854,19 @@ #: ../../../src/Stats.cpp:78 msgid "Critical Hit Chance" -msgstr "" +msgstr "Šanca na kritický zásah" #: ../../../src/Stats.cpp:79 msgid "Chance for an attack to do extra damage." -msgstr "" +msgstr "Šanca, že útok spôsobí väčšie zranenie." #: ../../../src/Stats.cpp:83 msgid "Bonus XP" -msgstr "" +msgstr "Bonusové XP" #: ../../../src/Stats.cpp:84 msgid "Increases the XP gained per kill." -msgstr "" +msgstr "Zvyšuje XP získané za zabitie." #: ../../../src/Stats.cpp:88 #, c-format @@ -1522,47 +1880,47 @@ #: ../../../src/Stats.cpp:93 msgid "Item Find Chance" -msgstr "" +msgstr "Šanca na nájdenie predmetu" #: ../../../src/Stats.cpp:94 msgid "Increases the chance that an enemy will drop an item." -msgstr "" +msgstr "Zvyšuje šancu, že nepriateľ za sebou zanechá predmet." #: ../../../src/Stats.cpp:98 msgid "Stealth" -msgstr "" +msgstr "Skrývanie" #: ../../../src/Stats.cpp:99 msgid "Increases your ability to move undetected." -msgstr "" +msgstr "Zvyšuje vašu schopnosť nepozorovane sa pohybovať." #: ../../../src/Stats.cpp:103 msgid "Poise" -msgstr "" +msgstr "Rovnováha" #: ../../../src/Stats.cpp:104 msgid "Reduces your chance of stumbling when hit." -msgstr "" +msgstr "Znižuje šancu, že pri zásahu stratíte rovnováhu." #: ../../../src/Stats.cpp:108 msgid "Missile Reflect Chance" -msgstr "" +msgstr "Šanca na odraz striel" #: ../../../src/Stats.cpp:109 msgid "Increases your chance of reflecting missiles back at enemies." -msgstr "" +msgstr "Zvyšuje vašu šancu odraziť strely naspäť k nepriateľom." #: ../../../src/Stats.cpp:113 msgid "Damage Reflection" -msgstr "" +msgstr "Odraz zranenia" #: ../../../src/Stats.cpp:114 msgid "Deals a percentage of damage taken back to the attacker." -msgstr "" +msgstr "Spôsobí časť utŕženého zranenia späť útočníkovi. " #: ../../../src/Stats.cpp:118 msgid "HP Steal" -msgstr "" +msgstr "Krádež HP" #: ../../../src/Stats.cpp:119 msgid "Percentage of HP stolen per hit." @@ -1570,7 +1928,7 @@ #: ../../../src/Stats.cpp:123 msgid "MP Steal" -msgstr "" +msgstr "Krádež MP" #: ../../../src/Stats.cpp:124 msgid "Percentage of MP stolen per hit." @@ -1578,30 +1936,30 @@ #: ../../../src/Stats.cpp:128 msgid "Base HP" -msgstr "" +msgstr "Základné HP" #: ../../../src/Stats.cpp:133 msgid "Base MP" -msgstr "" - -#: ../../../src/Utils.cpp:346 +msgstr "Základné MP" + +#: ../../../src/Utils.cpp:365 msgid "k" -msgstr "" - -#: ../../../src/Utils.cpp:580 +msgstr "k" + +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" -msgstr "" - -#: ../../../src/Utils.cpp:583 +msgstr "%s sekunda" + +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" -msgstr "" +msgstr "%s sekúnd/-y" #: ../../../src/Version.cpp:139 msgid "or newer" -msgstr "" +msgstr "alebo novšia" #: ../../../src/Version.cpp:142 msgid "or older" -msgstr "" +msgstr "alebo staršia" diff --git a/mods/default/languages/engine.sv.po b/mods/default/languages/engine.sv.po index 9cb07df..6e3fcbb 100644 --- a/mods/default/languages/engine.sv.po +++ b/mods/default/languages/engine.sv.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Justin Jacobs , 2018\n" "Language-Team: Swedish (https://www.transifex.com/flareorg/teams/84925/sv/)\n" @@ -21,74 +21,83 @@ "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Grattis, du har nått nivå %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Du får nu öka på en egenskap i karaktärsmenyn." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "" - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "" -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s borttaget." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s borttaget." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Du får %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Du får %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Du får %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Du får %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Du får %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Du får %d XP." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "HP äterställd." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "MP återställd." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "HP och MP återställt." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Negativa effekter borttagna." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "HP och MP återställt, negativa effekter borttagna" @@ -106,974 +115,1142 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Äventyrare" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "miss" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d HP" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d MP" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Okänd destination" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Laddar..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Radera sparat spel" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Vill du radera det sparade spelet?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Avsluta och gå till huvudmenyn" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Nytt spel" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Välj en plats" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Aktivera en story mod för att fortsätta" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Ladda spel" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Öppnar spelvärlden..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Läser in sparat spel..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Nivå %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Avbryt" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Skapa" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Välj ett ansikte" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Ange namn" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Permanent död?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Välj en Klass" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Starta spelet" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Aktivera en core mod för att fortsätta" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Konfiguration" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Avsluta spelet" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Acceptera" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Upp" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Ner" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Vänster" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Höger" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Karaktär" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Inventarie" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Krafter" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Logg" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Ta bort" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Uppdragsrelaterat föremål" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Kvalitet: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Absorberar: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Absorberar: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Kräver nivå %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Köpesumma: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Köpesumma: %d %s per styck" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Säljes för: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Säljes för: %d %s per styck" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Namn" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Nivå" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "XP: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Nästa: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "bas (%d), bonus (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Standard" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Återställ samtliga inställningar?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "OK" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Avbryt" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Avsluta" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Video" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Ljud" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Gränssnitt" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Inmatning" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Tangentbindningar" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Mods" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Fullskärmsläge" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Tillåt ändring av gamma" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Gamma" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Ljudvolym" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Musikvolym" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Ljudvolym" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Språk" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Visa FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Läge för färgblinda" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Aktiva Mods" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Tillgängliga Mods" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Inaktivera" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Aktivera >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Video" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Inmatning" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Tangentbindningar" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Visa text vid strid" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Joystick" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Flytta hjälten med muspekaren" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Sikta med muspekaren" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Använd inte muspekare" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Joystick Dödzon" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Experimentell" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "För handhållna neheter" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Fullskärmsläge" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Flytta hjälten med muspekaren" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Tillåt ändring av gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Använd joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Sikta med muspekaren" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Använd inte muspekare" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Joystick Dödzon" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Laddar..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Radera sparat spel" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Vill du radera det sparade spelet?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Avsluta och gå till huvudmenyn" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Nytt spel" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Välj en plats" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Aktivera en story mod för att fortsätta" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Ladda spel" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Öppnar spelvärlden..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Läser in sparat spel..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Nivå %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Skapa" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Välj ett ansikte" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Ange namn" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Permanent död?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Välj en Klass" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Starta spelet" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Aktivera en core mod för att fortsätta" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Konfiguration" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Avsluta spelet" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Acceptera" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Upp" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Ner" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Vänster" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Höger" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Karaktär" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Inventarie" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Krafter" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Logg" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Ta bort" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Uppdragsrelaterat föremål" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Kvalitet: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Absorberar: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Absorberar: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Kräver nivå %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Köpesumma: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Köpesumma: %d %s per styck" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Säljes för: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Säljes för: %d %s per styck" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Visa text vid strid" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Namn" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Nivå" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "XP: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Nästa: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "bas (%d), bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Aktiva Mods" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Tillgängliga Mods" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Inaktivera" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Aktivera >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "" -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "" -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" msgstr "" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" msgstr "" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "" -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s nivå %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Död" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Avsluta" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "" -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "" -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "" -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Förlorade %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "" -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "" -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Det här föremålet kan bara användas från handlingslisten." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Du har inte plats för fler föremål." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Inte tillräckligt med %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "" @@ -1085,214 +1262,259 @@ msgid "Quests" msgstr "Uppdrag" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "XP: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Kostar %d MP" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Kostar %d HP" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Kräver %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Kräver styrka: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Delad gömma" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "" -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Handel" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Återköp" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Tillverkare" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Sköld" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Du är redan i omvandlad form, omvandla dig tillbaka först." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "" @@ -1300,132 +1522,225 @@ msgid "Completed Quests" msgstr "" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "" -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "" @@ -1584,16 +1899,16 @@ msgid "Base MP" msgstr "" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "k" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "" diff --git a/mods/default/languages/engine.uk.po b/mods/default/languages/engine.uk.po index 4c0f257..cf38ee2 100644 --- a/mods/default/languages/engine.uk.po +++ b/mods/default/languages/engine.uk.po @@ -5,17 +5,17 @@ # # Translators: # Justin Jacobs , 2018 -# Sergiy Borodych, 2018 -# igorko , 2018 +# igorko , 2019 +# Sergiy Borodych, 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: igorko , 2018\n" +"Last-Translator: Sergiy Borodych, 2020\n" "Language-Team: Ukrainian (https://www.transifex.com/flareorg/teams/84925/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,74 +23,83 @@ "Language: uk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "У Вас мало Здоров'я!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" -msgstr "Вітаємо, ви перейшли на рівень %d!" - -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Ви можете покращити одну характеристику в Меню Персонажа." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "Вас перемогли. Гра завершена! ${INPUT_CONTINUE} щоб вийти в Меню." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Вас перемогли. ${INPUT_CONTINUE} щоб продовжити." - -#: ../../../src/Avatar.cpp:839 +msgstr "Вітаємо, Ви перейшли на рівень %d!" + +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "Ви можете покращити одну чи кілька характеристик в Меню Персонажа." + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "Ви можете розблокувати одне чи кілька умінь в Меню Умінь." + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "Час перетворення скінчився. Ви були переміщені в безпечне місце." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s втрачено." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "%s x%d вилучено." + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s втрачено." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Ви отримали %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Ви отримали %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Ви отримали %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Ви отримали %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Ви отримали %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Ви здобули %d Досвіду." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Здоров'я відновлено." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Ману відновлено." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "Здоров'я та Мана відновлені." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Шкідливі ефекти усунено." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "Здоров'я та Мана відновлені, шкідливі ефекти усунено" @@ -114,150 +123,782 @@ "\n" "Стандартний рендерер, який часто швидший від програмного SDL рендерера." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Шукач пригод" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "промах" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d Здоров'я" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d Мани" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Невідомий пункт призначення" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Завантаження..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Видалити" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Видалити цього персонажа?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Головне меню" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Нова гра" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Виберіть слот" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Увімкніть мод повісті щоб продовжити" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Завантажити" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Входжу в ігровий світ..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Завантажую збереження..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Невірне збереження" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Рівень %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Скасувати" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Створити" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Випадково" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Виберіть портрет" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Вкажіть ім'я" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Не воскресає" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Виберіть клас" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Грати гру" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Увімкніть базовий мод щоб продовжити" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Параметри" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Автори" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Вийти з гри" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Прийняти" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Вверх" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Вниз" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Вліво" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Вправо" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Слот1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Слот2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Слот3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Слот4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Слот5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Слот6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Слот7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Слот8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Слот9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Слот0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Персонаж" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Інвентар" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Уміння" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Журнал" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Дія1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Дія2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Видалити" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "Дії: Прийняти" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "Дії: Вліво" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "Дії: Вправо" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "Дії: Використати" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Меню розробника" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "ЛівКнМиш" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "СерКнМиш" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "ПрКнМиш" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Колесо вверх" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Колесо вниз" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Мишка X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Мишка X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Невідомий предмет" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% Швидкості" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% Швидкості атаки" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Опір (%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Потребує %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Квестовий предмет" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Якість: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Поглинання: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Поглинання: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Вимагає Рівень %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Потребує %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Вимагає клас: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Ціна купівлі: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Ціна купівлі: %d %s кожен" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Ціна продажу: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Ціна продажу: %d %s кожен" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Набір:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d предмети:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Натисніть [%s] щоб прочитати" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Натисніть [%s] для використання" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Гаряча клавіша: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Недостатньо Мани." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x %d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Залишилось:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d пачок" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Ім'я" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Рівень" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Зменшує шкоду, завдану атаками стихії \"%s\"." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Досвід: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Наступний: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "базове (%d), бонус (%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Пов'язані характеристики:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Кожен рівень додає %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Кожне очко витрачене на %s додає %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Очистити" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Призначити:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Типово" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Скинути ВСІ налаштування?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "Гаразд" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Скасувати" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "Продовжити" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "Зберегти гру" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "Типово" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Завжди показувати підказки предметів. крім тих, що будуть заступлені гравцем" +" або ворогом. Тимчасово показати всі підказки за допомогою 'Alt'." + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "Показати все" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" +"Завжди показувати підказки предметів. Тимчасово приховати всі підказки за " +"допомогою 'Alt'." + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "Приховано" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" +"Завжди приховувати підказки предметів. крім випадків, коли на предмет " +"наведено курсор миші. Тимчасово показати всі підказки за допомогою 'Alt'." + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "Видима" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "Видима (2х)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" +"Керує типом попередження, яке потрібно активувати, коли Здоров'я героя " +"знаходиться нижче нижнього порогу." + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- Показати повідомлення" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- Грати звук" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- Змінити курсор" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "Вимкнено" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "Все" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "Текст і Курсор" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "Текст і Звук" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "Звук і Курсор" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "Текст" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "Курсор" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "Звук" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" +"Коли Здоров'я героя знижується нижче заданого порогу, активуються сповіщення" +" про низький рівень Здоров'я, якщо одне або більше з них увімкнено." + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Вихід" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Відео" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Аудіо" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Інтерфейс" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Керування" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Клавіші" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Моди" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Гру призупинено" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "Час в грі" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Рендерер" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "На весь екран" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Апаратні поверхні" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "Вертикальна синхронізація" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Фільтр текстур" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Масштабування розлільної здатності" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "Шари середовища" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Дозволити зміну гами" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "Гама" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Гучність звуків" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Гучність музики" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Гучність звуків" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Мова" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Показувати FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Апаратний курсор миші" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Безколірний режим" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Апаратний курсор миші" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Режим розробника" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Субтитри" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Активні моди" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Наявні моди" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Вимкнути" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Увімкнути >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Версія:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Гра:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Версія движку:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Необхідні моди:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Очистити" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Призначити:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Відео" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Керування" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Клавіші" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "Видимість міток речей" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "Режим міні-мапи" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Завжди показувати текст на смужках статів" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "Дозволити автоматичне приховування смужок статів" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Показувати текст бою" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Автоматично одягати предмети" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "Показувати маркери прихованих істот." + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "Дані про низький рівень Здоров'я" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "Нижній поріг Здоров'я" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "Джойстик" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Керувати рухом героя використовуючи мишку" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Цілитись мишкою" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Не користуватись мишкою" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "Переставити кнопку переміщення миші" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "Атакувати рухом миші" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Мертва зона джойстика" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "Основна клавіша: %s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "Альтернативна клавіша: %s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "Елемент керування джойстика: %s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -265,7 +906,7 @@ "Гра спробує зберігати поверхні у відеопам'яті, а не в оперативній пам'яті. " "Ефективність режиму залежить від вибраного рендерера." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -273,7 +914,7 @@ "Запобігає смиканню екрану. Вимкніть, якщо ви помічаєте \"гальмування\" в " "віконному режимі або запізнілу реакцію на дії користувача." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -283,7 +924,7 @@ "використовуватись роздільна здатність екрану. Інакше використовуються лише " "розміри вікна." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." @@ -291,623 +932,204 @@ "Вмикає шари оточення (сніг, дощ, туман...). Вимкнення цієї опції може інколи" " підвищити продуктивність." -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Експериментально" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Для портативних пристроїв" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Рендерер" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "На весь екран" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Керувати рухом героя використовуючи мишку" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Апаратні поверхні" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "Вертикальна синхронізація" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Фільтр текстур" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "Масштабування розлільної здатності" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "Шари середовища" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Дозволити зміну гами" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "Гама" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Увімкнути джойстик" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "Джойстик" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Цілитись мишкою" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Не користуватись мишкою" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Мертва зона джойстика" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Завантаження..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Видалити" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Видалити цього персонажа?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Головне меню" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Нова гра" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Виберіть слот" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Увімкніть мод повісті щоб продовжити" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Завантажити" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Входжу в ігровий світ..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Завантажую збереження..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Невірне збереження" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Рівень %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Створити" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Випадково" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Виберіть портрет" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Вкажіть ім'я" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Не воскресає" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Виберіть клас" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Грати гру" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Увімкніть базовий мод щоб продовжити" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Параметри" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Автори" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Вийти з гри" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Прийняти" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Вверх" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Вниз" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Вліво" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Вправо" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Слот1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Слот2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Слот3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Слот4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Слот5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Слот6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Слот7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Слот8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Слот9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Слот0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Персонаж" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Інвентар" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Уміння" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Журнал" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Дія1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Дія2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "Alt" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "Видалити" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "Дії: Прийняти" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "Дії: Вліво" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "Дії: Вправо" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "Дії: Використати" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Меню розробника" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "ЛівКнМиш" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "СерКнМиш" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "ПрКнМиш" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Колесо вверх" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Колесо вниз" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Мишка X1" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Мишка X2" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Невідомий предмет" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% Швидкості" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% Швидкості атаки" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "Опір (%s)" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Потребує %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Квестовий предмет" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Якість: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Поглинання: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Поглинання: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Вимагає Рівень %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Потребує %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Вимагає клас: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Ціна купівлі: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Ціна купівлі: %d %s кожен" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Ціна продажу: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Ціна продажу: %d %s кожен" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Набір:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d предмети:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Натисніть [%s] для використання" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Натисніть [%s] щоб прочитати" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "Видимість міток речей" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "Режим міні-мапи" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Завжди показувати текст на смужках статів" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Показувати текст бою" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Гаряча клавіша: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "Типово. Тимчасово показувати всі мітки з '%s'." - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "Показати всі. Тимчасово приховати всі мітки з '%s'." - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "Приховати всі. Тимчасово показувати всі мітки з '%s'" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "Видима" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "Видима (2х)" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "Прихована" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "Увімкнено" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "Вимкнено" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "Недостатньо Мани." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "x %d" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Залишилось:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d пачок" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Ім'я" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Рівень" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d навитрачене очко статистики" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d невитрачених очків статистики" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Зменшує шкоду, завдану атаками стихії \"%s\"." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Досвід: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Наступний: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "базове (%d), бонус (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Пов'язані характеристики:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Кожен рівень додає %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Кожне очко витрачене на %s додає %d." - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" +"Вмикає нижченаведену опцію, яка контролюює рівень гами екрану. Поведінка " +"налаштування гами може відрізнятися для різних платформ." + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" +"Забезпечує додатковий текст для інформації, яка передається через колір." + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" +"Деякі моди автоматично приховують смужки статів, коли вони неактивні. Якщо " +"вимкнути цю опцію, вони будуть відображатись завжди." + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" +"Коли увімкнено, порожні комірки спорядження будуть заповнені відповідними " +"предметами при їх отриманні." + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" +"Показує маркер над ворогами, союзниками і героєм, коли вони знаходяться за " +"високими об'єктами." + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" +"Дозволяє керувати грою повністю за допомогою клавіатури (або джойстика)." + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" +"Якщо ввімкнено функцію \"Керувати рухом героя використовуючи мишку\", ця " +"опція визначає, яка кнопка використовуються для переміщення героя: 'Дія1' чи" +" 'Дія2'. Якщо увімкнено, 'Дія2' переміщуватиме героя замість 'Дія1'." + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" +"Якщо ввімкнено функцію \"Керувати рухом героя використовуючи мишку\", ця " +"опція визначає, чи можна використовувати Уміння, призначене на кнопку " +"переміщення, шляхом націлювання на ворога. Якщо це налаштування вимкнено, " +"для доступу до Уміння, призначеного на кнопку переміщення, потрібно " +"використовувати 'Shift'." + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" +"Якщо увімкнено, атаки героя будуть спрямовані у напрямку курсору миші." + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Активні моди" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Наявні моди" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Вимкнути" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Увімкнути >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Версія:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Гра:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Версія движку:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Необхідні моди:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(нічого)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Зберегти і Вийти" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Виконати" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Консоль розробника" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Для аналізу корсором використовуйте '%s'." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "" "Аргументи з пропусками мають бути оточені подвійними лапками. Приклад:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Напишіть 'help' для отримання переліку команд." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "px" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Відстань" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Сутність" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "нічого" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "стіна" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "коротка стіна/яма" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "сутність" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "сутність, союзник" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Плитка" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "додає уміння на панель дій" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "вмикає/вимикає відображення FPS" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "показує/приховує всі елементи інтерфейсу" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "вмикає/вимикає панель розробника" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -915,11 +1137,11 @@ "Виводить список умінь, які відповідають пошуковому запиту. Жоден пошуковий " "запит не покаже всіх умінь" -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "Виводить назви всіх файлів з мапами що знаходяться в теці \"maps/\"" -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -927,7 +1149,7 @@ "Виводить статуси активної кампанії, які відповідають пошуковому запиту. " "Жоден пошуковий запит не покаже усіх активних статусів" -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -935,169 +1157,153 @@ "Виводить список елементів, які відповідають пошуковому запиту. Жоден " "пошуковий запит не покаже всіх елементів" -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "аналізує серію компонентів подій та виконує їх як окрему подію" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "Очищує історію команд" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "показує цей текст" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Стан панелі розробника змінено" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Інтерфейс перемкнено" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "Показ FPS перемкнений" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "ПОМИЛКА: Невірна кількість параметрів" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "ПОРАДА:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "ПОМИЛКА: '%s' некоректний ключ події" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "ПОМИЛКА: Замало параметрів" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = ..." -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "ПОМИЛКА: Невідома команда" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "ПІДКАЗКА: Введіть help" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s рівень %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Мертвий" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Знищений" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Призупинено" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Зберегти і Вийти" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Вийти" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Продовжити" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Автоматично одягати предмети" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Втрачено %d%% з %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Втрачено %d%% загального Досвіду." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Втрачено %d%% Досвіду поточного рівня." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Втрачено %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "%d %s" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Підняти предмет(и):" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Використати предмет:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "Модифікатори для %s" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Вказати кількість предметів:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Пачку предметів в тайник:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Продати пачку предметів:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "У вас недостатньо потрібних предметів." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Наразі неможливо використати цей предмет." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Цей предмет може бути використаний лише з панелі дій." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Інвентар заповнений." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Недостатньо %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Цей предмет не можна продати." @@ -1109,214 +1315,259 @@ msgid "Quests" msgstr "Квести" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Досвід: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Цей предмет не можна викинути." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Вкажіть кількість:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Пасивне" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Коштує %d Мани" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Коштує %d Здоров'я" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Очікування:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Шкоди за секунду" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "Здоров'я за секунду" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "Мани за секунду" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Сковування" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Імунітет" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Імунітет до шкоди протягом часу" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Імунітет до уповільнення" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Імунітет до оглушення" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Імунітет до крадіжки Здоров'я" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Імунітет до крадіжки Мани" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Імунітет до відкидання" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Імунітет до відбиття шкоди." -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Оглушення" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Автоматичне відродження при смерті" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Перетворення" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Страх" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Тривалість життя" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Магічний Щит" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Лікування" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Відкидання" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% шанс" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Базова Точність" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Базовий Критичний Шанс" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Ігнорує Поглинання" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Ігнорує Уникнення" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% Шанс на крит. сповільненої цілі" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "Шкода від стихії (%s)" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Вимагає %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Вимагає Уміння: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Клацніть для вивчення (потребує 1 очко Умінь)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Вимагає 1 очко Умінь" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d невитрачене очко Умінь" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d невитрачених очок Умінь" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Натсупний рівень:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Загальний тайник" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Квестові речі не можна зберігати в тайнику." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "Тайник" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "Особистий" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "Загальний" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "Цю річ не можна зберегти в тайнику." + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "Цю річ не можна зберігати в приватному сховку." + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "Цю річ не можна зберігати в спільному сховку." + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Тайник заповнений." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "Неможливо зберегти в тайнику: %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Торгувати" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Викуп" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Торговець" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d Захисту" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Ви вже трансформовані, спершу відновіть початкову форму." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Не можу змінити форму в цьому місці." @@ -1324,132 +1575,225 @@ msgid "Completed Quests" msgstr "Завершені квести" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Гру збережено." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "Backspace" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "CapsLock" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "End" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "Escape" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "Home" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "Insert" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Лівий Alt" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Лівий Ctrl" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Лівий Shift" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "NumLock" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "PageDown" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "PageUp" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "Pause" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "PrintScreen" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Правий Alt" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Правий Ctrl" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "Enter" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Правий Shift" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "ScrollLock" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "Пробіл" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "Tab" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Мишка %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "Вісь %d -" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "Вісь %d +" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Кнопка %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(нічого)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "Торкніться кнопок переміщення" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "Торкніться кнопок керування" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Торкніться" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "Неможливо прив'язати клавішу: %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "'%s' більше не повязаний з:" @@ -1613,16 +1957,16 @@ msgid "Base MP" msgstr "Базова Мана" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "к" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s секунда" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s секунд" diff --git a/mods/default/languages/engine.vi.po b/mods/default/languages/engine.vi.po index 5b541d8..a350ade 100644 --- a/mods/default/languages/engine.vi.po +++ b/mods/default/languages/engine.vi.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" "Last-Translator: Justin Jacobs , 2018\n" "Language-Team: Vietnamese (https://www.transifex.com/flareorg/teams/84925/vi/)\n" @@ -21,76 +21,83 @@ "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" msgstr "Chúc mừng, bạn đã đạt cấp độ %d!" -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "Bạn có thể tăng một chỉ số qua menu Nhân vật." - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "" -"Bạn đã bị đánh bại. Trò chơi kết thúc! Nhấn ${INPUT_CONTINUE} để thoát ra " -"Trang đầu." - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "Bạn đã bị đánh bại. Nhấn ${INPUT_CONTINUE} để tiếp tục." - -#: ../../../src/Avatar.cpp:839 +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." msgstr "Sự biến đổi kết thúc. Bạn đã được chuyển về vị trí an toàn." -#: ../../../src/CampaignManager.cpp:153 +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." msgstr "%d %s đã bị lấy đi." -#: ../../../src/CampaignManager.cpp:162 +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." msgstr "%s đã bị lấy đi." -#: ../../../src/CampaignManager.cpp:175 +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "Bạn nhận được %d %s." + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "Bạn nhận được %s x%d." + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." msgstr "Bạn nhận được %s." -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "Bạn nhận được %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "Bạn nhận được %d %s." - -#: ../../../src/CampaignManager.cpp:195 +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." msgstr "Bạn nhận được %d điểm kinh nghiệm." -#: ../../../src/CampaignManager.cpp:201 +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." msgstr "Thể chất đã hồi phục." -#: ../../../src/CampaignManager.cpp:205 +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." msgstr "Ma pháp đã hồi phục." -#: ../../../src/CampaignManager.cpp:210 +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." msgstr "Thể chất và ma pháp đã hồi phục." -#: ../../../src/CampaignManager.cpp:214 +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." msgstr "Các lời nguyền đã bị vô hiệu." -#: ../../../src/CampaignManager.cpp:220 +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" msgstr "Thể chất và ma pháp đã hồi phục, các lời nguyền đã bị vô hiệu" @@ -112,150 +119,772 @@ "Kết xuất đồ hoạ SDL bằng phần cứng\n" "Bộ kết xuất mặc định, thường nhanh hơn bằng phần mềm." -#: ../../../src/EngineSettings.cpp:561 +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" msgstr "Người phiêu lưu" -#: ../../../src/Entity.cpp:511 +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "trượt" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" msgstr "+%d điểm thể chất" -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" msgstr "+%d điểm ma pháp" -#: ../../../src/EventManager.cpp:738 +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "Điểm đến chưa xác định" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "Đang tải..." + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "Xoá bản lưư" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "Xoá bản lưư này?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "Thoát ra tiêu đề" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "Trò chơi mới" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "Chọn một ô" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "Chọn một bản mod cốt truyện để tiếp tục" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "Mở bản lưu" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "Đang tiến vào thế giới trò chơi..." + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "Đang mở bản lưu..." + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "Bản lưu không hợp lệ" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "Cấp độ %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "Hủy" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "Tạo" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "Ngẫu nhiên" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "Chọn chân dung" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "Chọn tên" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "Chết vĩnh viễn?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "Chọn một giai cấp" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "Chơi trò chơi" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "Chọn một bản mod lõi để tiếp tục" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "Thiết lập" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "Các đóng góp" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "Thoát trò chơi" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "Đồng ý" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "Lên" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "Xuống" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "Trái" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "Phải" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "Thanh1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "Thanh2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "Thanh3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "Thanh4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "Thanh5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "Thanh6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "Thanh7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "Thanh8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "Thanh9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "Thanh0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "Nhân vật" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "Hành trang" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "Sức mạnh" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "Nhật kí" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "Chính1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "Chính2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "ActionBar chọn" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "ActionBar trái" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "ActionBar phải" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "ActionBar dùng" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "Menu phát triển" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "Chuột trái" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "Chuột giữa" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "Chuột phải" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "Lăn lên" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "Lăn xuống" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "Phím X1 chuột" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "Phím X2 chuột" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "Vật chưa xác định" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%% tốc độ" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%% tốc độ tấn công" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "Khả năng kháng %s" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "Yêu cầu %s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "Đồ nhiệm vụ" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "Chất lượng: %s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "Hấp thụ: %d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "Hấp thụ: %d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "Yêu cầu cấp độ %d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "Yêu cầu %s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "Yêu cầu thuộc giai cấp: %s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "Giá mua: %d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "Giá mua mỗi chiếc: %d %s" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "Giá bán: %d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "Giá bán mỗi chiếc: %d %s" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "Đặt:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d vật:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "Nhấn [%s] để đọc" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "Nhấn [%s] để sử dụng" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "Phím: %s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "Không đủ ma pháp." + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "Còn lại:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d chồng" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "Tên" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "Cấp độ" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "Giảm sát thương từ nguyên tố %s." + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "Điểm kinh nghiệm: %d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "Tiếp: %d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "gốc %d, thêm %d" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "Thuộc tính liên quan:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "Mỗi cấp độ tăng %d." + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "Mỗi điểm của %s tăng %d." + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "Xoá" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "Gán với:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "Mặc định" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" msgstr "Thiết lập lại TẤT CẢ?" -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "Hủy" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "Thoát" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "Đồ hoạ" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "Âm thanh" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "Giao diện" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "Đầu vào" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "Phím điều khiển" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "Các bản mod" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "Đang tạm dừng" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "Thiết bị kết xuất đồ hoạ" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "Toàn màn hình" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "Kết xuất bề mặt bằng phần cứng" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "Lọc kết cấu bề mặt (texture)" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "Phóng theo DPI" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "Cho phép thay đổi gamma" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "Âm lượng" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "Âm lượng nhạc" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "Âm lượng" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "Ngôn ngữ" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "Hiển thị FPS" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "Con trỏ hệ thống" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "Chế độ cho người mù màu" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "Con trỏ hệ thống" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "Chế độ cho người phát triển" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "Phụ đề" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "Bản mod đang bật" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "Bản mod còn lại" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< Tắt" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr "Bật >>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "Phiên bản:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "Trò chơi:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "Phiên bản engine:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "Yêu cầu bản mod:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "Xoá" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "Gán với:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "Đồ hoạ" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "Đầu vào" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "Phím điều khiển" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "Luôn hiển thị nhãn thanh thuộc tính" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "Hiển thị nội dung chiến trận" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "Tự động trang bị đồ" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "Di chuyển nhân vật bằng chuột" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "Ngắm bằng chuột" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "Không sử dụng chuột" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "Khoảng chết của joystick" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." @@ -263,7 +892,7 @@ "Lưu dữ liệu bề mặt vào bộ nhớ đồ hoạ thay cho RAM. Hiệu quả của tuỳ chọn này" " phụ thuộc vào thiết bị kết xuất." -#: ../../../src/GameStateConfigDesktop.cpp:189 +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." @@ -271,7 +900,7 @@ "Giúp tránh rách hình. Tắt nếu bạn thấy lag khi điều khiển hoặc chế độ cửa sổ" " bị \"lắp\"." -#: ../../../src/GameStateConfigDesktop.cpp:190 +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" @@ -280,628 +909,190 @@ "Khi bật, sử dụng thêm DPI màn hình cùng kích thước cửa sổ để phóng đồ hoạ. " "Nếu không, chỉ sử dụng kích thước cửa sổ." -#: ../../../src/GameStateConfigDesktop.cpp:191 +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "Đang thử nghiệm" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "Cho thiết bị cầm tay" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "Thiết bị kết xuất đồ hoạ" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "Toàn màn hình" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "Di chuyển nhân vật bằng chuột" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "Kết xuất bề mặt bằng phần cứng" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "Lọc kết cấu bề mặt (texture)" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "Phóng theo DPI" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "Cho phép thay đổi gamma" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "Sử dụng joystick" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "Ngắm bằng chuột" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "Không sử dụng chuột" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "Khoảng chết của joystick" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "Đang tải..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "Xoá bản lưư" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "Xoá bản lưư này?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "Thoát ra tiêu đề" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "Trò chơi mới" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "Chọn một ô" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "Chọn một bản mod cốt truyện để tiếp tục" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "Mở bản lưu" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "Đang tiến vào thế giới trò chơi..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "Đang mở bản lưu..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "Bản lưu không hợp lệ" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "Cấp độ %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "Tạo" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "Ngẫu nhiên" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "Chọn chân dung" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "Chọn tên" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "Chết vĩnh viễn?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "Chọn một giai cấp" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "Chơi trò chơi" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "Chọn một bản mod lõi để tiếp tục" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "Thiết lập" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "Các đóng góp" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "Thoát trò chơi" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "Đồng ý" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "Lên" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "Xuống" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "Trái" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "Phải" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "Thanh1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "Thanh2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "Thanh3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "Thanh4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "Thanh5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "Thanh6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "Thanh7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "Thanh8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "Thanh9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "Thanh0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "Nhân vật" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "Hành trang" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "Sức mạnh" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "Nhật kí" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "Chính1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "Chính2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "ActionBar chọn" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "ActionBar trái" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "ActionBar phải" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "ActionBar dùng" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "Menu phát triển" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "Chuột trái" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "Chuột giữa" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "Chuột phải" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "Lăn lên" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "Lăn xuống" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "Phím X1 chuột" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "Phím X2 chuột" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "Vật chưa xác định" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "%d%% tốc độ" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "%d%% tốc độ tấn công" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "Khả năng kháng %s" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "Yêu cầu %s" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "Đồ nhiệm vụ" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "Chất lượng: %s" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "Hấp thụ: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "Hấp thụ: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "Yêu cầu cấp độ %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "Yêu cầu %s %d" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "Yêu cầu thuộc giai cấp: %s" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "Giá mua: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "Giá mua mỗi chiếc: %d %s" - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "Giá bán: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "Giá bán mỗi chiếc: %d %s" - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "Đặt:" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "%d vật:" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "Nhấn [%s] để sử dụng" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "Nhấn [%s] để đọc" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "Luôn hiển thị nhãn thanh thuộc tính" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "Hiển thị nội dung chiến trận" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "Phím: %s" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "Không đủ ma pháp." - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "Còn lại:" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "x%d chồng" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "Tên" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "Cấp độ" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "%d điểm thuộc tính chưa dùng" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "%d điểm thuộc tính chưa dùng" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "Giảm sát thương từ nguyên tố %s." - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "Điểm kinh nghiệm: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Tiếp: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "gốc %d, thêm %d" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "Thuộc tính liên quan:" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "Mỗi cấp độ tăng %d." - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "Mỗi điểm của %s tăng %d." - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." +msgstr "" + +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "Bản mod đang bật" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "Bản mod còn lại" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< Tắt" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "Bật >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "Phiên bản:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "Trò chơi:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "Phiên bản engine:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "Yêu cầu bản mod:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(không)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "Lưư & Thoát" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" msgstr "Chạy" -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" msgstr "Bảng điều khiển cho nhà phát triển" -#: ../../../src/MenuDevConsole.cpp:141 +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." msgstr "Dùng [%s] để điều tra bằng con trỏ." -#: ../../../src/MenuDevConsole.cpp:146 +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" msgstr "Tham số chứa khoảng trắng nên được đặt trong ngoặc kép. Ví dụ:" -#: ../../../src/MenuDevConsole.cpp:147 +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." msgstr "Gõ 'help' để in danh sách các lệnh." -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" msgstr "" -#: ../../../src/MenuDevConsole.cpp:224 +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" msgstr "Khoảng cách" -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" msgstr "Thực thể" -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" msgstr "trống" -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" msgstr "tường" -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" msgstr "tường thấp / hố" -#: ../../../src/MenuDevConsole.cpp:266 +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" msgstr "thực thể" -#: ../../../src/MenuDevConsole.cpp:267 +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" msgstr "thực thể, liên kết" -#: ../../../src/MenuDevConsole.cpp:274 +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" msgstr "Ô" -#: ../../../src/MenuDevConsole.cpp:360 +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" msgstr "thêm một sức mạnh vào thanh hành động" -#: ../../../src/MenuDevConsole.cpp:361 +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:362 +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" msgstr "bật/tắt tất cả các HUD" -#: ../../../src/MenuDevConsole.cpp:363 +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" msgstr "bật tắt HUD cho nhà phát triển" -#: ../../../src/MenuDevConsole.cpp:364 +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" @@ -909,11 +1100,11 @@ "In các sức mạnh khớp với từ khoá tìm kiếm. Nếu không cung cấp từ khoá, liệt " "kê tất cả." -#: ../../../src/MenuDevConsole.cpp:365 +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." msgstr "In tất cả các tệp bản đồ trong thư mục \"maps\"." -#: ../../../src/MenuDevConsole.cpp:366 +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" @@ -921,7 +1112,7 @@ "In tất cả các trạng thái chiến dịch hiện hành khớp từ khoá tìm kiếm. Nếu " "không cung cấp từ khoá, liệt kê tất cả." -#: ../../../src/MenuDevConsole.cpp:367 +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" @@ -929,171 +1120,155 @@ "In các đồ vật khớp với từ khoá tìm kiếm. Nếu không cung cấp từ khoá, liệt kê" " tất cả." -#: ../../../src/MenuDevConsole.cpp:368 +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" msgstr "" "nhận một chuỗi các bộ phận sự kiện và thực hiện chúng như một sự kiện duy " "nhất" -#: ../../../src/MenuDevConsole.cpp:369 +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" msgstr "xoá lịch sử lệnh" -#: ../../../src/MenuDevConsole.cpp:370 +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" msgstr "hiển thị văn bản này" -#: ../../../src/MenuDevConsole.cpp:377 +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" msgstr "Đã bật/tắt HUD cho nhà phát triển" -#: ../../../src/MenuDevConsole.cpp:381 +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" msgstr "Đã bật/tắt HUD" -#: ../../../src/MenuDevConsole.cpp:385 +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" msgstr "" -#: ../../../src/MenuDevConsole.cpp:534 +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" msgstr "LỖI: Số tham số không đúng" -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" msgstr "GỌI Ý:" -#: ../../../src/MenuDevConsole.cpp:536 +#: ../../../src/MenuDevConsole.cpp:554 msgid "" msgstr "" -#: ../../../src/MenuDevConsole.cpp:552 +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" msgstr "LỖI: '%s' không phải là một key sự kiện hợp lệ" -#: ../../../src/MenuDevConsole.cpp:562 +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" msgstr "LỖI: Quá ít tham số" -#: ../../../src/MenuDevConsole.cpp:564 +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." msgstr "= = ..." -#: ../../../src/MenuDevConsole.cpp:569 +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" msgstr "LỖI: Lệnh không xác định" -#: ../../../src/MenuDevConsole.cpp:571 +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" msgstr "GỢI Ý: Gõ 'help'" -#: ../../../src/MenuEnemy.cpp:138 +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" msgstr "%s cấp độ %d" -#: ../../../src/MenuEnemy.cpp:162 +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "Đã chết" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" msgstr "Đã bị phá huỷ" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "Đang tạm dừng" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "Lưư & Thoát" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "Thoát" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "Tiếp tục" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "Tự động trang bị đồ" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" +msgstr "" + +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." msgstr "Mất %d%% %s." -#: ../../../src/MenuInventory.cpp:195 +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." msgstr "Mất %d%% tổng điểm kinh nghiệm." -#: ../../../src/MenuInventory.cpp:200 +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." msgstr "Mất %d%% điểm kinh nghiệm cấp độ hiện tại." -#: ../../../src/MenuInventory.cpp:226 +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." msgstr "Mất %s." -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" msgstr "" -#: ../../../src/MenuInventory.cpp:317 +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" msgstr "Nhặt vật:" -#: ../../../src/MenuInventory.cpp:318 +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" msgstr "Sử dụng hoặc trang bị đồ:" -#: ../../../src/MenuInventory.cpp:319 +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" msgstr "Các phím chức năng kết hợp với %s:" -#: ../../../src/MenuInventory.cpp:320 +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" msgstr "Chọn số lượng đồ:" -#: ../../../src/MenuInventory.cpp:323 +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" msgstr "Cất chồng đồ:" -#: ../../../src/MenuInventory.cpp:325 +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" msgstr "Bán chồng đồ:" -#: ../../../src/MenuInventory.cpp:592 +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." msgstr "Bạn không đủ số đồ vật yêu cầu." -#: ../../../src/MenuInventory.cpp:599 +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." msgstr "Bạn không thể dùng vật này bây giờ." -#: ../../../src/MenuInventory.cpp:611 +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." msgstr "Vật này chỉ có thể được dùng ở thanh hành động." -#: ../../../src/MenuInventory.cpp:729 +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." msgstr "Hành trang đã đầy." -#: ../../../src/MenuInventory.cpp:849 +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." msgstr "Không đủ %s." -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." msgstr "Không thể bán vật này." @@ -1105,214 +1280,259 @@ msgid "Quests" msgstr "Nhiệm vụ" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" msgstr "Điểm kinh nghiệm: %d/%d" -#: ../../../src/MenuManager.cpp:827 +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." msgstr "Không thể vứt vật này." + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" +msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" msgstr "Nhập số lượng:" -#: ../../../src/MenuPowers.cpp:787 +#: ../../../src/MenuPowers.cpp:872 msgid "Passive" msgstr "Thụ động" -#: ../../../src/MenuPowers.cpp:792 +#: ../../../src/MenuPowers.cpp:879 #, c-format msgid "Costs %d MP" msgstr "Tốn %d điểm ma pháp" -#: ../../../src/MenuPowers.cpp:796 +#: ../../../src/MenuPowers.cpp:883 #, c-format msgid "Costs %d HP" msgstr "Tốn %d điểm thể chất" -#: ../../../src/MenuPowers.cpp:801 +#: ../../../src/MenuPowers.cpp:887 msgid "Cooldown:" msgstr "Nguội:" -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 msgid "Damage per second" msgstr "Sát thương trên giây" -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 msgid "HP per second" msgstr "Điểm thể chất trên giây" -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 msgid "MP per second" msgstr "Điểm ma pháp trên giây" -#: ../../../src/MenuPowers.cpp:885 +#: ../../../src/MenuPowers.cpp:957 msgid "Immobilize" msgstr "Làm bất động" -#: ../../../src/MenuPowers.cpp:893 +#: ../../../src/MenuPowers.cpp:965 msgid "Immunity" msgstr "Đề kháng" -#: ../../../src/MenuPowers.cpp:896 +#: ../../../src/MenuPowers.cpp:968 msgid "Immunity to damage over time" msgstr "Kháng sát thương theo thời gian" -#: ../../../src/MenuPowers.cpp:899 +#: ../../../src/MenuPowers.cpp:971 msgid "Immunity to slow" msgstr "Chống bị làm chậm" -#: ../../../src/MenuPowers.cpp:902 +#: ../../../src/MenuPowers.cpp:974 msgid "Immunity to stun" msgstr "Chống bất động" -#: ../../../src/MenuPowers.cpp:905 +#: ../../../src/MenuPowers.cpp:977 msgid "Immunity to HP steal" msgstr "Chống trộm điểm thể chất" -#: ../../../src/MenuPowers.cpp:908 +#: ../../../src/MenuPowers.cpp:980 msgid "Immunity to MP steal" msgstr "Chống trộm điểm ma pháp" -#: ../../../src/MenuPowers.cpp:911 +#: ../../../src/MenuPowers.cpp:983 msgid "Immunity to knockback" msgstr "Chống bị đẩy lại" -#: ../../../src/MenuPowers.cpp:914 +#: ../../../src/MenuPowers.cpp:986 msgid "Immunity to damage reflection" msgstr "Chống phản sát thương" -#: ../../../src/MenuPowers.cpp:917 +#: ../../../src/MenuPowers.cpp:992 msgid "Stun" msgstr "Làm bất động" -#: ../../../src/MenuPowers.cpp:920 +#: ../../../src/MenuPowers.cpp:995 msgid "Automatic revive on death" msgstr "Tự động hồi sinh" -#: ../../../src/MenuPowers.cpp:923 +#: ../../../src/MenuPowers.cpp:998 msgid "Convert" msgstr "Biến đổi" -#: ../../../src/MenuPowers.cpp:926 +#: ../../../src/MenuPowers.cpp:1001 msgid "Fear" msgstr "Sợ hãi" -#: ../../../src/MenuPowers.cpp:929 +#: ../../../src/MenuPowers.cpp:1004 msgid "Lifespan" msgstr "Vòng đời" -#: ../../../src/MenuPowers.cpp:953 +#: ../../../src/MenuPowers.cpp:1028 msgid "Magical Shield" msgstr "Khiên ma thuật" -#: ../../../src/MenuPowers.cpp:982 +#: ../../../src/MenuPowers.cpp:1057 msgid "Healing" msgstr "Hồi sức" -#: ../../../src/MenuPowers.cpp:985 +#: ../../../src/MenuPowers.cpp:1060 msgid "Knockback" msgstr "Đẩy lại" -#: ../../../src/MenuPowers.cpp:1010 +#: ../../../src/MenuPowers.cpp:1084 #, c-format msgid "%d%% chance" msgstr "%d%% khả năng" -#: ../../../src/MenuPowers.cpp:1062 +#: ../../../src/MenuPowers.cpp:1136 msgid "Base Accuracy" msgstr "Độ chính xác gốc" -#: ../../../src/MenuPowers.cpp:1082 +#: ../../../src/MenuPowers.cpp:1156 msgid "Base Critical Chance" msgstr "Xác suất siêu sát thương gốc" -#: ../../../src/MenuPowers.cpp:1090 +#: ../../../src/MenuPowers.cpp:1164 msgid "Ignores Absorbtion" msgstr "Bỏ qua hấp thụ sát thương" -#: ../../../src/MenuPowers.cpp:1095 +#: ../../../src/MenuPowers.cpp:1169 msgid "Ignores Avoidance" msgstr "Bỏ qua khả năng tránh đòn" -#: ../../../src/MenuPowers.cpp:1100 +#: ../../../src/MenuPowers.cpp:1174 #, c-format msgid "%d%% Chance to crit slowed targets" msgstr "%d%% khả năng siêu sát thương với mục tiêu bị làm chậm" -#: ../../../src/MenuPowers.cpp:1105 +#: ../../../src/MenuPowers.cpp:1179 #, c-format msgid "Elemental Damage (%s)" msgstr "Sát thương nguyên tố %s" -#: ../../../src/MenuPowers.cpp:1114 +#: ../../../src/MenuPowers.cpp:1188 #, c-format msgid "Requires a %s" msgstr "Yêu cầu %s" -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 #, c-format msgid "Requires Power: %s" msgstr "Yêu cầu sức mạnh: %s" -#: ../../../src/MenuPowers.cpp:1163 +#: ../../../src/MenuPowers.cpp:1238 msgid "Click to Unlock (uses 1 Skill Point)" msgstr "Nhấn để mở khoá (dùng 1 điểm kĩ năng)" -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 msgid "Requires 1 Skill Point" msgstr "Yêu cầu 1 điểm kĩ năng" -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "%d điểm kĩ năng chưa dùng" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "%d điểm kĩ năng chưa dùng" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" +msgstr "" + +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" msgstr "Cấp độ tiếp:" -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" -msgstr "Hòm đồ chung" - -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "Không thể giữ đồ nhiệm vụ trong hòm." - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" +msgstr "" + +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." msgstr "Hòm đã đầy." -#: ../../../src/MenuTalker.cpp:454 +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "Trao đổi" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "Mua lại" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "Thương nhân" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" msgstr "+%d giáp" -#: ../../../src/PowerManager.cpp:1392 +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." msgstr "Bạn đã biến đổi rồi, phải biến về trạng thái ban đầu trước tiên." -#: ../../../src/PowerManager.cpp:1404 +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." msgstr "Không thể biến về trạng thái ban đầu ở vị trí này." @@ -1320,132 +1540,225 @@ msgid "Completed Quests" msgstr "Nhiệm vụ đã hoàn thành" -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." msgstr "Đã lưư trò chơi." -#: ../../../src/SDLInputState.cpp:582 +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" msgstr "" -#: ../../../src/SDLInputState.cpp:583 +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" msgstr "" -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" msgstr "" -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" msgstr "" -#: ../../../src/SDLInputState.cpp:590 +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" msgstr "Alt trái" -#: ../../../src/SDLInputState.cpp:591 +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" msgstr "Ctrl trái" -#: ../../../src/SDLInputState.cpp:593 +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" msgstr "Shift trái" -#: ../../../src/SDLInputState.cpp:594 +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" msgstr "" -#: ../../../src/SDLInputState.cpp:595 +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" msgstr "" -#: ../../../src/SDLInputState.cpp:596 +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" msgstr "" -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" msgstr "" -#: ../../../src/SDLInputState.cpp:599 +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" msgstr "Alt phải" -#: ../../../src/SDLInputState.cpp:600 +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" msgstr "Ctrl phải" -#: ../../../src/SDLInputState.cpp:601 +#: ../../../src/SDLInputState.cpp:692 msgid "Return" msgstr "" -#: ../../../src/SDLInputState.cpp:603 +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" msgstr "Shift phải" -#: ../../../src/SDLInputState.cpp:604 +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" msgstr "" -#: ../../../src/SDLInputState.cpp:605 +#: ../../../src/SDLInputState.cpp:696 msgid "Space" msgstr "" -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" msgstr "Chuột %d" -#: ../../../src/SDLInputState.cpp:628 +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" msgstr "" -#: ../../../src/SDLInputState.cpp:630 +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" msgstr "" -#: ../../../src/SDLInputState.cpp:633 +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" msgstr "Nút %d" -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "(không)" - -#: ../../../src/SDLInputState.cpp:677 +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" msgstr "" -#: ../../../src/SDLInputState.cpp:701 +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" msgstr "" -#: ../../../src/SDLInputState.cpp:716 +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" msgstr "Vỗ" -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" msgstr "[%s] không còn được gán với:" @@ -1606,16 +1919,16 @@ msgid "Base MP" msgstr "Ma pháp khởi điểm" -#: ../../../src/Utils.cpp:346 +#: ../../../src/Utils.cpp:365 msgid "k" msgstr "" -#: ../../../src/Utils.cpp:580 +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" msgstr "%s giây" -#: ../../../src/Utils.cpp:583 +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" msgstr "%s giây" diff --git a/mods/default/languages/engine.zh.po b/mods/default/languages/engine.zh.po index e676c35..3ac2110 100644 --- a/mods/default/languages/engine.zh.po +++ b/mods/default/languages/engine.zh.po @@ -4,17 +4,17 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Justin Jacobs , 2018 -# 杜茂森 , 2018 +# Justin Jacobs , 2019 +# CodingJellyfish , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-11-17 21:50-0500\n" +"POT-Creation-Date: 2021-05-23 20:34-0400\n" "PO-Revision-Date: 2018-03-28 19:16+0000\n" -"Last-Translator: 杜茂森 , 2018\n" +"Last-Translator: CodingJellyfish , 2020\n" "Language-Team: Chinese (https://www.transifex.com/flareorg/teams/84925/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,76 +22,85 @@ "Language: zh\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/Avatar.cpp:367 +#: ../../../src/Avatar.cpp:391 +msgid "Your health is low!" +msgstr "您已奄奄一息!" + +#: ../../../src/Avatar.cpp:421 #, c-format msgid "Congratulations, you have reached level %d!" -msgstr "恭喜!你达到了等级 %d!" - -#: ../../../src/Avatar.cpp:369 -msgid "You may increase one attribute through the Character Menu." -msgstr "你可以在角色菜单增加一点属性" - -#: ../../../src/Avatar.cpp:583 -msgid "You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title." -msgstr "你被打败了,游戏结束!按下${INPUT_CONTINUE}返回游戏开始界面。" - -#: ../../../src/Avatar.cpp:589 -msgid "You are defeated. ${INPUT_CONTINUE} to continue." -msgstr "你被打败了。按下${INPUT_CONTINUE}以继续。" - -#: ../../../src/Avatar.cpp:839 +msgstr "恭喜,你达到了等级%d!" + +#: ../../../src/Avatar.cpp:423 +msgid "You may increase one or more attributes through the Character Menu." +msgstr "你可以在角色菜单增加一点或多点属性。" + +#: ../../../src/Avatar.cpp:427 +msgid "You may unlock one or more abilities through the Powers Menu." +msgstr "你可以在技能菜单增加一点或多点技能。" + +#: ../../../src/Avatar.cpp:689 +msgid "You are defeated." +msgstr "" + +#: ../../../src/Avatar.cpp:935 msgid "Transformation expired. You have been moved back to a safe place." -msgstr "转换已过期。 你已回到一个安全的地方。" - -#: ../../../src/CampaignManager.cpp:153 +msgstr "传送已过期。你已回到了一个安全的地方。" + +#: ../../../src/CampaignManager.cpp:152 #, c-format msgid "%d %s removed." -msgstr "%d %s 已移除" - -#: ../../../src/CampaignManager.cpp:162 +msgstr "%d个%s已移除。" + +#: ../../../src/CampaignManager.cpp:171 +#, c-format +msgid "%s x%d removed." +msgstr "%s个%d已移除。" + +#: ../../../src/CampaignManager.cpp:173 #, c-format msgid "%s removed." -msgstr "%s已移除" - -#: ../../../src/CampaignManager.cpp:175 +msgstr "%s已移除。" + +#: ../../../src/CampaignManager.cpp:187 +#, c-format +msgid "You receive %d %s." +msgstr "你得到%d个%s。" + +#: ../../../src/CampaignManager.cpp:191 +#, c-format +msgid "You receive %s x%d." +msgstr "你收到%s x%d。" + +#: ../../../src/CampaignManager.cpp:193 #, c-format msgid "You receive %s." -msgstr "你收到 %s." - -#: ../../../src/CampaignManager.cpp:177 -#, c-format -msgid "You receive %s x%d." -msgstr "你收到 %s x%d." - -#: ../../../src/CampaignManager.cpp:186 -#, c-format -msgid "You receive %d %s." -msgstr "你收到 %d %s." - -#: ../../../src/CampaignManager.cpp:195 +msgstr "你收到%s。" + +#: ../../../src/CampaignManager.cpp:210 #, c-format msgid "You receive %d XP." -msgstr "你收到 %d XP." - -#: ../../../src/CampaignManager.cpp:201 +msgstr "你得到%dXP。" + +#: ../../../src/CampaignManager.cpp:216 msgid "HP restored." -msgstr "HP 已恢复." - -#: ../../../src/CampaignManager.cpp:205 +msgstr "HP已恢复。" + +#: ../../../src/CampaignManager.cpp:220 msgid "MP restored." -msgstr "MP 已恢复." - -#: ../../../src/CampaignManager.cpp:210 +msgstr "MP已恢复。" + +#: ../../../src/CampaignManager.cpp:225 msgid "HP and MP restored." -msgstr "HP 和 MP 已恢复." - -#: ../../../src/CampaignManager.cpp:214 +msgstr "HP和MP已恢复。" + +#: ../../../src/CampaignManager.cpp:229 msgid "Negative effects removed." -msgstr "负面影响已消除." - -#: ../../../src/CampaignManager.cpp:220 +msgstr "负面效果已消除。" + +#: ../../../src/CampaignManager.cpp:235 msgid "HP and MP restored, negative effects removed" -msgstr "HP 和MP 已恢复, 负面影响已消除" +msgstr "HP和MP已恢复,负面效果已消除。" #: ../../../src/DeviceList.cpp:56 msgid "" @@ -100,7 +109,8 @@ "Often slower, but less likely to have issues." msgstr "" "SDL软件渲染器\n" -"通常较慢,但不太可能出现问题。" +"\n" +"通常较慢,但出现问题几率更低。" #: ../../../src/DeviceList.cpp:59 msgid "" @@ -109,978 +119,1147 @@ "The default renderer that is often faster than the SDL software renderer." msgstr "" "SDL硬件渲染器\n" -"默认渲染器,通常比SDL软件渲染器更快。" - -#: ../../../src/EngineSettings.cpp:561 +"\n" +"默认渲染器,通常比软件渲染器更快。" + +#: ../../../src/EngineSettings.cpp:586 msgid "Adventurer" -msgstr "玩家" - -#: ../../../src/Entity.cpp:511 +msgstr "冒险者" + +#: ../../../src/Entity.cpp:527 msgid "miss" msgstr "未击中" -#: ../../../src/Entity.cpp:548 ../../../src/PowerManager.cpp:1152 -#: ../../../src/StatBlock.cpp:805 ../../../src/StatBlock.cpp:811 +#: ../../../src/Entity.cpp:565 ../../../src/PowerManager.cpp:1224 +#: ../../../src/StatBlock.cpp:917 ../../../src/StatBlock.cpp:923 #, c-format msgid "+%d HP" -msgstr "+%d HP" - -#: ../../../src/Entity.cpp:555 ../../../src/StatBlock.cpp:816 -#: ../../../src/StatBlock.cpp:822 +msgstr "+%dHP" + +#: ../../../src/Entity.cpp:572 ../../../src/StatBlock.cpp:928 +#: ../../../src/StatBlock.cpp:934 #, c-format msgid "+%d MP" -msgstr "+%d MP" - -#: ../../../src/EventManager.cpp:738 +msgstr "+%dMP" + +#: ../../../src/EventManager.cpp:792 msgid "Unknown destination" msgstr "无法进入" -#: ../../../src/GameStateConfigBase.cpp:89 -#: ../../../src/GameStateConfigBase.cpp:110 +#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 +msgid "Loading..." +msgstr "载入中……" + +#: ../../../src/GameStateLoad.cpp:90 ../../../src/GameStateLoad.cpp:103 +msgid "Delete Save" +msgstr "删除存档" + +#: ../../../src/GameStateLoad.cpp:90 +msgid "Delete this save?" +msgstr "确定删除存档?" + +#: ../../../src/GameStateLoad.cpp:92 +msgid "Exit to Title" +msgstr "回到标题界面" + +#: ../../../src/GameStateLoad.cpp:95 +msgid "New Game" +msgstr "新游戏" + +#: ../../../src/GameStateLoad.cpp:99 ../../../src/GameStateLoad.cpp:607 +msgid "Choose a Slot" +msgstr "选择一个人物存档" + +#: ../../../src/GameStateLoad.cpp:580 ../../../src/GameStateLoad.cpp:601 +msgid "Enable a story mod to continue" +msgstr "启用故事模块以继续" + +#: ../../../src/GameStateLoad.cpp:596 +msgid "Load Game" +msgstr "载入游戏" + +#: ../../../src/GameStateLoad.cpp:705 +msgid "Entering game world..." +msgstr "进入游戏世界……" + +#: ../../../src/GameStateLoad.cpp:708 +msgid "Loading saved game..." +msgstr "载入游戏……" + +#: ../../../src/GameStateLoad.cpp:741 +msgid "Invalid save" +msgstr "保存无效" + +#: ../../../src/GameStateLoad.cpp:765 ../../../src/ItemManager.cpp:745 +#: ../../../src/MenuPowers.cpp:860 ../../../src/MenuPowers.cpp:1219 +#: ../../../src/MenuPowers.cpp:1631 +#, c-format +msgid "Level %d" +msgstr "等级 %d" + +#: ../../../src/GameStateNew.cpp:66 ../../../src/InputState.cpp:416 +#: ../../../src/MenuConfig.cpp:246 +msgid "Cancel" +msgstr "取消" + +#: ../../../src/GameStateNew.cpp:69 +msgid "Create" +msgstr "创建" + +#: ../../../src/GameStateNew.cpp:77 +msgid "Randomize" +msgstr "随机" + +#: ../../../src/GameStateNew.cpp:93 +msgid "Choose a Portrait" +msgstr "选择头像" + +#: ../../../src/GameStateNew.cpp:97 +msgid "Choose a Name" +msgstr "输入名字" + +#: ../../../src/GameStateNew.cpp:101 +msgid "Permadeath?" +msgstr "死亡后不可复活?" + +#: ../../../src/GameStateNew.cpp:105 +msgid "Choose a Class" +msgstr "选择职业" + +#: ../../../src/GameStateTitle.cpp:107 +msgid "Play Game" +msgstr "开始游戏" + +#: ../../../src/GameStateTitle.cpp:110 +msgid "Enable a core mod to continue" +msgstr "开启核心模块以继续" + +#: ../../../src/GameStateTitle.cpp:114 ../../../src/MenuMiniMap.cpp:152 +msgid "Configuration" +msgstr "设置" + +#: ../../../src/GameStateTitle.cpp:117 +msgid "Credits" +msgstr "致谢" + +#: ../../../src/GameStateTitle.cpp:120 +msgid "Exit Game" +msgstr "退出游戏" + +#: ../../../src/InputState.cpp:417 +msgid "Accept" +msgstr "确定" + +#: ../../../src/InputState.cpp:418 ../../../src/MenuMovementType.cpp:123 +#: ../../../src/MenuMovementType.cpp:132 ../../../src/SDLInputState.cpp:668 +#: ../../../src/SDLInputState.cpp:698 +msgid "Up" +msgstr "上" + +#: ../../../src/InputState.cpp:419 ../../../src/MenuMovementType.cpp:125 +#: ../../../src/MenuMovementType.cpp:134 ../../../src/SDLInputState.cpp:646 +#: ../../../src/SDLInputState.cpp:676 +msgid "Down" +msgstr "下" + +#: ../../../src/InputState.cpp:420 ../../../src/MenuMovementType.cpp:124 +#: ../../../src/MenuMovementType.cpp:133 ../../../src/SDLInputState.cpp:653 +#: ../../../src/SDLInputState.cpp:683 +msgid "Left" +msgstr "左" + +#: ../../../src/InputState.cpp:421 ../../../src/MenuMovementType.cpp:126 +#: ../../../src/MenuMovementType.cpp:135 ../../../src/SDLInputState.cpp:663 +#: ../../../src/SDLInputState.cpp:693 +msgid "Right" +msgstr "右" + +#: ../../../src/InputState.cpp:422 +msgid "Bar1" +msgstr "槽1" + +#: ../../../src/InputState.cpp:423 +msgid "Bar2" +msgstr "槽2" + +#: ../../../src/InputState.cpp:424 +msgid "Bar3" +msgstr "槽3" + +#: ../../../src/InputState.cpp:425 +msgid "Bar4" +msgstr "槽4" + +#: ../../../src/InputState.cpp:426 +msgid "Bar5" +msgstr "槽5" + +#: ../../../src/InputState.cpp:427 +msgid "Bar6" +msgstr "槽6" + +#: ../../../src/InputState.cpp:428 +msgid "Bar7" +msgstr "槽7" + +#: ../../../src/InputState.cpp:429 +msgid "Bar8" +msgstr "槽8" + +#: ../../../src/InputState.cpp:430 +msgid "Bar9" +msgstr "槽9" + +#: ../../../src/InputState.cpp:431 +msgid "Bar0" +msgstr "槽0" + +#: ../../../src/InputState.cpp:432 ../../../src/MenuActionBar.cpp:84 +#: ../../../src/MenuCharacter.cpp:54 +msgid "Character" +msgstr "角色" + +#: ../../../src/InputState.cpp:433 ../../../src/MenuActionBar.cpp:85 +#: ../../../src/MenuInventory.cpp:130 ../../../src/MenuVendor.cpp:59 +msgid "Inventory" +msgstr "物品" + +#: ../../../src/InputState.cpp:434 ../../../src/MenuActionBar.cpp:86 +#: ../../../src/MenuPowers.cpp:158 +msgid "Powers" +msgstr "技能" + +#: ../../../src/InputState.cpp:435 ../../../src/MenuActionBar.cpp:87 +#: ../../../src/MenuLog.cpp:72 +msgid "Log" +msgstr "日志" + +#: ../../../src/InputState.cpp:436 +msgid "Main1" +msgstr "主按键1" + +#: ../../../src/InputState.cpp:437 +msgid "Main2" +msgstr "主按键2" + +#: ../../../src/InputState.cpp:438 +msgid "Ctrl" +msgstr "Ctrl" + +#: ../../../src/InputState.cpp:439 +msgid "Shift" +msgstr "Shift" + +#: ../../../src/InputState.cpp:440 +msgid "Alt" +msgstr "Alt" + +#: ../../../src/InputState.cpp:441 ../../../src/SDLInputState.cpp:675 +msgid "Delete" +msgstr "Delete" + +#: ../../../src/InputState.cpp:442 +msgid "ActionBar Accept" +msgstr "操作栏接受" + +#: ../../../src/InputState.cpp:443 +msgid "ActionBar Left" +msgstr "操作栏左" + +#: ../../../src/InputState.cpp:444 +msgid "ActionBar Right" +msgstr "操作栏右" + +#: ../../../src/InputState.cpp:445 +msgid "ActionBar Use" +msgstr "操作栏使用" + +#: ../../../src/InputState.cpp:446 +msgid "Developer Menu" +msgstr "开发者菜单" + +#: ../../../src/InputState.cpp:448 +msgid "Left Mouse" +msgstr "鼠标左键" + +#: ../../../src/InputState.cpp:449 +msgid "Middle Mouse" +msgstr "鼠标中键" + +#: ../../../src/InputState.cpp:450 +msgid "Right Mouse" +msgstr "鼠标右键" + +#: ../../../src/InputState.cpp:451 +msgid "Wheel Up" +msgstr "滚轮向上" + +#: ../../../src/InputState.cpp:452 +msgid "Wheel Down" +msgstr "滚轮向下" + +#: ../../../src/InputState.cpp:453 +msgid "Mouse X1" +msgstr "鼠标X1" + +#: ../../../src/InputState.cpp:454 +msgid "Mouse X2" +msgstr "鼠标X2" + +#: ../../../src/ItemManager.cpp:475 +msgid "Unknown Item" +msgstr "未知物品" + +#: ../../../src/ItemManager.cpp:646 ../../../src/MenuPowers.cpp:959 +#, c-format +msgid "%d%% Speed" +msgstr "%d%%速度" + +#: ../../../src/ItemManager.cpp:650 ../../../src/MenuPowers.cpp:962 +#, c-format +msgid "%d%% Attack Speed" +msgstr "%d%%攻击速度" + +#: ../../../src/ItemManager.cpp:672 ../../../src/MenuCharacter.cpp:352 +#: ../../../src/MenuPowers.cpp:931 +#, c-format +msgid "Resistance (%s)" +msgstr "抗性(%s)" + +#: ../../../src/ItemManager.cpp:682 +#, c-format +msgid "Requires %s" +msgstr "需要%s" + +#: ../../../src/ItemManager.cpp:731 +msgid "Quest Item" +msgstr "任务物品" + +#: ../../../src/ItemManager.cpp:758 +#, c-format +msgid "Quality: %s" +msgstr "质量:%s" + +#: ../../../src/ItemManager.cpp:783 +#, c-format +msgid "Absorb: %d-%d" +msgstr "伤害吸收:%d-%d" + +#: ../../../src/ItemManager.cpp:785 +#, c-format +msgid "Absorb: %d" +msgstr "伤害吸收:%d" + +#: ../../../src/ItemManager.cpp:825 ../../../src/MenuPowers.cpp:1206 +#: ../../../src/MenuPowers.cpp:1209 +#, c-format +msgid "Requires Level %d" +msgstr "需要等级%d" + +#: ../../../src/ItemManager.cpp:836 ../../../src/MenuPowers.cpp:1198 +#: ../../../src/MenuPowers.cpp:1200 +#, c-format +msgid "Requires %s %d" +msgstr "需要%s %d" + +#: ../../../src/ItemManager.cpp:847 +#, c-format +msgid "Requires Class: %s" +msgstr "需要职业:%s" + +#: ../../../src/ItemManager.cpp:863 ../../../src/ItemManager.cpp:875 +#, c-format +msgid "Buy Price: %d %s" +msgstr "购买价格:%d %s" + +#: ../../../src/ItemManager.cpp:865 ../../../src/ItemManager.cpp:877 +#, c-format +msgid "Buy Price: %d %s each" +msgstr "购买单价:%d 每个%s" + +#: ../../../src/ItemManager.cpp:885 +#, c-format +msgid "Sell Price: %d %s" +msgstr "出售价格:%d %s" + +#: ../../../src/ItemManager.cpp:887 +#, c-format +msgid "Sell Price: %d %s each" +msgstr "出售单价:%d 每个%s" + +#: ../../../src/ItemManager.cpp:896 +msgid "Set:" +msgstr "设置:" + +#: ../../../src/ItemManager.cpp:903 +#, c-format +msgid "%d items:" +msgstr "%d个物品:" + +#: ../../../src/ItemManager.cpp:915 +#, c-format +msgid "Press [%s] to read" +msgstr "按[%s]阅读" + +#: ../../../src/ItemManager.cpp:918 +#, c-format +msgid "Press [%s] to use" +msgstr "按[%s]使用" + +#: ../../../src/MenuActionBar.cpp:239 ../../../src/MenuActionBar.cpp:246 +#: ../../../src/MenuActionBar.cpp:249 ../../../src/MenuActionBar.cpp:255 +#, c-format +msgid "Hotkey: %s" +msgstr "快捷键:%s" + +#: ../../../src/MenuActionBar.cpp:621 +msgid "Not enough MP." +msgstr "MP不足。" + +#: ../../../src/MenuActiveEffects.cpp:124 +#, c-format +msgid "x%d" +msgstr "x%d" + +#: ../../../src/MenuActiveEffects.cpp:219 +msgid "Remaining:" +msgstr "剩余:" + +#: ../../../src/MenuActiveEffects.cpp:225 +#, c-format +msgid "x%d stacks" +msgstr "x%d" + +#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 +msgid "Name" +msgstr "名字" + +#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 +msgid "Level" +msgstr "等级" + +#: ../../../src/MenuCharacter.cpp:309 +#, c-format +msgid "Available stat points: %d" +msgstr "" + +#: ../../../src/MenuCharacter.cpp:353 +#, c-format +msgid "Reduces the damage taken from \"%s\" elemental attacks." +msgstr "减少来自“%s”的元素攻击伤害。" + +#: ../../../src/MenuCharacter.cpp:363 ../../../src/MenuManager.cpp:301 +#, c-format +msgid "XP: %d" +msgstr "经验值XP:%d" + +#: ../../../src/MenuCharacter.cpp:365 +#, c-format +msgid "Next: %d" +msgstr "下一级:%d" + +#: ../../../src/MenuCharacter.cpp:371 +#, c-format +msgid "base (%d), bonus (%d)" +msgstr "基础(%d),增益(%d)" + +#: ../../../src/MenuCharacter.cpp:379 ../../../src/MenuCharacter.cpp:393 +msgid "Related stats:" +msgstr "相关的属性:" + +#: ../../../src/MenuCharacter.cpp:419 ../../../src/MenuCharacter.cpp:443 +#, c-format +msgid "Each level grants %d." +msgstr "每一级增长%d。" + +#: ../../../src/MenuCharacter.cpp:423 ../../../src/MenuCharacter.cpp:447 +#, c-format +msgid "Each point of %s grants %d." +msgstr "每点%s增长%d。" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1171 +msgid "Clear" +msgstr "清空" + +#: ../../../src/MenuConfig.cpp:122 ../../../src/MenuConfig.cpp:1169 +msgid "Assign:" +msgstr "分配:" + +#: ../../../src/MenuConfig.cpp:123 ../../../src/MenuConfig.cpp:245 msgid "Defaults" msgstr "默认设置" -#: ../../../src/GameStateConfigBase.cpp:89 +#: ../../../src/MenuConfig.cpp:123 msgid "Reset ALL settings?" -msgstr "确定重置?" - -#: ../../../src/GameStateConfigBase.cpp:109 ../../../src/MenuNumPicker.cpp:49 +msgstr "确定重置所有设置吗?" + +#: ../../../src/MenuConfig.cpp:244 ../../../src/MenuNumPicker.cpp:49 msgid "OK" msgstr "确定" -#: ../../../src/GameStateConfigBase.cpp:111 ../../../src/GameStateNew.cpp:65 -#: ../../../src/InputState.cpp:401 -msgid "Cancel" -msgstr "取消设置" - -#: ../../../src/GameStateConfigBase.cpp:160 -#: ../../../src/GameStateConfigDesktop.cpp:130 +#: ../../../src/MenuConfig.cpp:248 ../../../src/MenuGameOver.cpp:72 +msgid "Continue" +msgstr "继续" + +#: ../../../src/MenuConfig.cpp:250 +msgid "Save Game" +msgstr "保存游戏" + +#: ../../../src/MenuConfig.cpp:293 +msgid "Default" +msgstr "默认" + +#: ../../../src/MenuConfig.cpp:293 +msgid "" +"Show all loot tooltips, except for those that would be obscured by the " +"player or an enemy. Temporarily show all loot tooltips with 'Alt'." +msgstr "显示全部的战利品提示,除了那些被玩家或敌人遮盖的。按‘Alt’临时显示全部的战利品提示。" + +#: ../../../src/MenuConfig.cpp:294 +msgid "Show all" +msgstr "全部显示" + +#: ../../../src/MenuConfig.cpp:294 +msgid "" +"Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'." +msgstr "总是显示战利品提示。按‘Alt’临时隐藏全部的战利品提示。" + +#: ../../../src/MenuConfig.cpp:295 ../../../src/MenuConfig.cpp:300 +msgid "Hidden" +msgstr "隐藏" + +#: ../../../src/MenuConfig.cpp:295 +msgid "" +"Always hide loot tooltips, except for when a piece of loot is hovered with " +"the mouse cursor. Temporarily show all loot tooltips with 'Alt'." +msgstr "总是隐藏战利品提示,除了光标指向的。按 ‘Alt’ 显示全部的战利品提示。" + +#: ../../../src/MenuConfig.cpp:298 +msgid "Visible" +msgstr "可见" + +#: ../../../src/MenuConfig.cpp:299 +msgid "Visible (2x zoom)" +msgstr "可见(两倍缩放)" + +#: ../../../src/MenuConfig.cpp:303 +msgid "" +"Controls the type of warning to be activated when the player is below the " +"low health threshold." +msgstr "这将控制玩家在低生命阈值以下时使用何种通知。" + +#: ../../../src/MenuConfig.cpp:304 +msgid "- Display a message" +msgstr "- 显示消息" + +#: ../../../src/MenuConfig.cpp:305 +msgid "- Play a sound" +msgstr "- 播放声音" + +#: ../../../src/MenuConfig.cpp:306 +msgid "- Change the cursor" +msgstr "- 切换光标" + +#: ../../../src/MenuConfig.cpp:308 +msgid "Disabled" +msgstr "已禁用" + +#: ../../../src/MenuConfig.cpp:309 +msgid "All" +msgstr "全部" + +#: ../../../src/MenuConfig.cpp:310 +msgid "Message & Cursor" +msgstr "消息和光标" + +#: ../../../src/MenuConfig.cpp:311 +msgid "Message & Sound" +msgstr "消息和声音" + +#: ../../../src/MenuConfig.cpp:312 +msgid "Sound & Cursor" +msgstr "声音和光标" + +#: ../../../src/MenuConfig.cpp:313 +msgid "Message" +msgstr "消息" + +#: ../../../src/MenuConfig.cpp:314 +msgid "Cursor" +msgstr "光标" + +#: ../../../src/MenuConfig.cpp:315 +msgid "Sound" +msgstr "音效" + +#: ../../../src/MenuConfig.cpp:321 +msgid "" +"When the player's health drops below the given threshold, the low health " +"notifications are triggered if one or more of them is enabled." +msgstr "当玩家的HP低于一个特定的阈值时,如果您已启用一种或更多低生命通知,它将被触发。" + +#: ../../../src/MenuConfig.cpp:334 ../../../src/MenuConfig.cpp:1587 +#: ../../../src/MenuGameOver.cpp:116 +msgid "Exit" +msgstr "退出" + +#: ../../../src/MenuConfig.cpp:335 +msgid "Video" +msgstr "画面" + +#: ../../../src/MenuConfig.cpp:336 msgid "Audio" msgstr "声音" -#: ../../../src/GameStateConfigBase.cpp:161 -#: ../../../src/GameStateConfigDesktop.cpp:131 +#: ../../../src/MenuConfig.cpp:337 msgid "Interface" msgstr "界面" -#: ../../../src/GameStateConfigBase.cpp:162 -#: ../../../src/GameStateConfigDesktop.cpp:134 +#: ../../../src/MenuConfig.cpp:338 +msgid "Input" +msgstr "输入" + +#: ../../../src/MenuConfig.cpp:339 +msgid "Keybindings" +msgstr "快捷键" + +#: ../../../src/MenuConfig.cpp:340 msgid "Mods" msgstr "模块" -#: ../../../src/GameStateConfigBase.cpp:249 ../../../src/MenuExit.cpp:72 +#: ../../../src/MenuConfig.cpp:352 +msgid "Paused" +msgstr "暂停" + +#: ../../../src/MenuConfig.cpp:355 +msgid "Time Played" +msgstr "已玩时间" + +#: ../../../src/MenuConfig.cpp:361 +msgid "Renderer" +msgstr "渲染器" + +#: ../../../src/MenuConfig.cpp:362 +msgid "Full Screen Mode" +msgstr "全屏模式" + +#: ../../../src/MenuConfig.cpp:363 +msgid "Hardware surfaces" +msgstr "硬件加速" + +#: ../../../src/MenuConfig.cpp:364 +msgid "V-Sync" +msgstr "垂直同步" + +#: ../../../src/MenuConfig.cpp:365 +msgid "Texture Filtering" +msgstr "纹理过滤" + +#: ../../../src/MenuConfig.cpp:366 +msgid "DPI scaling" +msgstr "DPI缩放" + +#: ../../../src/MenuConfig.cpp:367 +msgid "Parallax Layers" +msgstr "视差层" + +#: ../../../src/MenuConfig.cpp:368 +msgid "Allow changing gamma" +msgstr "允许更改伽马" + +#: ../../../src/MenuConfig.cpp:369 +msgid "Gamma" +msgstr "伽马" + +#: ../../../src/MenuConfig.cpp:371 +msgid "Sound Volume" +msgstr "游戏音乐音量" + +#: ../../../src/MenuConfig.cpp:372 msgid "Music Volume" msgstr "背景音乐音量" -#: ../../../src/GameStateConfigBase.cpp:253 ../../../src/MenuExit.cpp:77 -msgid "Sound Volume" -msgstr "游戏音乐音量" - -#: ../../../src/GameStateConfigBase.cpp:257 +#: ../../../src/MenuConfig.cpp:374 msgid "Language" msgstr "语言" -#: ../../../src/GameStateConfigBase.cpp:266 +#: ../../../src/MenuConfig.cpp:375 msgid "Show FPS" msgstr "显示画面每秒帧数" -#: ../../../src/GameStateConfigBase.cpp:270 +#: ../../../src/MenuConfig.cpp:376 +msgid "Hardware mouse cursor" +msgstr "硬件光标" + +#: ../../../src/MenuConfig.cpp:377 msgid "Colorblind Mode" msgstr "色盲模式" -#: ../../../src/GameStateConfigBase.cpp:274 -msgid "Hardware mouse cursor" -msgstr "硬件鼠标光标" - -#: ../../../src/GameStateConfigBase.cpp:278 +#: ../../../src/MenuConfig.cpp:378 msgid "Developer Mode" msgstr "开发者模式" -#: ../../../src/GameStateConfigBase.cpp:282 +#: ../../../src/MenuConfig.cpp:379 msgid "Subtitles" msgstr "字幕" -#: ../../../src/GameStateConfigBase.cpp:286 -msgid "Active Mods" -msgstr "激活模块" - -#: ../../../src/GameStateConfigBase.cpp:295 -msgid "Available Mods" -msgstr "可用模块" - -#: ../../../src/GameStateConfigBase.cpp:314 -msgid "<< Disable" -msgstr "<< 禁用" - -#: ../../../src/GameStateConfigBase.cpp:320 -msgid "Enable >>" -msgstr " 启用>>" - -#: ../../../src/GameStateConfigBase.cpp:873 -msgid "Version:" -msgstr "版本号:" - -#: ../../../src/GameStateConfigBase.cpp:878 -msgid "Game:" -msgstr "游戏:" - -#: ../../../src/GameStateConfigBase.cpp:883 -msgid "Engine version:" -msgstr "引擎版本号:" - -#: ../../../src/GameStateConfigBase.cpp:891 -msgid "Requires mods:" -msgstr "需要的模组:" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:751 -msgid "Clear" -msgstr "清空" - -#: ../../../src/GameStateConfigDesktop.cpp:83 -#: ../../../src/GameStateConfigDesktop.cpp:749 -msgid "Assign:" -msgstr "分配:" - -#: ../../../src/GameStateConfigDesktop.cpp:128 -msgid "Video" -msgstr "画面" - -#: ../../../src/GameStateConfigDesktop.cpp:132 -msgid "Input" -msgstr "输入" - -#: ../../../src/GameStateConfigDesktop.cpp:133 -msgid "Keybindings" -msgstr "快捷键" - -#: ../../../src/GameStateConfigDesktop.cpp:188 +#: ../../../src/MenuConfig.cpp:380 +msgid "Loot tooltip visibility" +msgstr "战利品提示可见性" + +#: ../../../src/MenuConfig.cpp:381 +msgid "Mini-map mode" +msgstr "小地图模式" + +#: ../../../src/MenuConfig.cpp:382 +msgid "Always show stat bar labels" +msgstr "始终显示进度条标签" + +#: ../../../src/MenuConfig.cpp:383 +msgid "Allow stat bar auto-hiding" +msgstr "允许状态栏自动隐藏" + +#: ../../../src/MenuConfig.cpp:384 +msgid "Show combat text" +msgstr "显示战斗文字" + +#: ../../../src/MenuConfig.cpp:385 +msgid "Automatically equip items" +msgstr "自动装备物品" + +#: ../../../src/MenuConfig.cpp:386 +msgid "Show hidden entity markers" +msgstr "显示隐藏的敌人标记" + +#: ../../../src/MenuConfig.cpp:387 +msgid "Low health notification" +msgstr "低生命通知" + +#: ../../../src/MenuConfig.cpp:388 +msgid "Low health threshold" +msgstr "低生命阈值" + +#: ../../../src/MenuConfig.cpp:389 +msgid "Show item comparison tooltips" +msgstr "" + +#: ../../../src/MenuConfig.cpp:392 ../../../src/MenuMovementType.cpp:94 +#: ../../../src/MenuMovementType.cpp:131 +msgid "Joystick" +msgstr "摇杆" + +#: ../../../src/MenuConfig.cpp:393 +msgid "Move hero using mouse" +msgstr "使用鼠标移动英雄" + +#: ../../../src/MenuConfig.cpp:394 +msgid "Mouse aim" +msgstr "使用鼠标瞄准敌人" + +#: ../../../src/MenuConfig.cpp:395 +msgid "Do not use mouse" +msgstr "不要使用鼠标" + +#: ../../../src/MenuConfig.cpp:396 +msgid "Swap mouse movement button" +msgstr "交换鼠标移动键" + +#: ../../../src/MenuConfig.cpp:397 +msgid "Attack with mouse movement" +msgstr "用鼠标移动键攻击" + +#: ../../../src/MenuConfig.cpp:398 +msgid "Joystick Deadzone" +msgstr "摇杆灵敏度" + +#: ../../../src/MenuConfig.cpp:408 +#, c-format +msgid "Primary binding: %s" +msgstr "主要键位:%s" + +#: ../../../src/MenuConfig.cpp:409 +#, c-format +msgid "Alternate binding: %s" +msgstr "备用键位:%s" + +#: ../../../src/MenuConfig.cpp:410 +#, c-format +msgid "Joystick binding: %s" +msgstr "摇杆键位:%s" + +#: ../../../src/MenuConfig.cpp:511 msgid "" "Will try to store surfaces in video memory versus system memory. The effect " "this has on performance depends on the renderer." -msgstr "将尝试在视频内存中存储表面与系统内存。 这对性能的影响取决于渲染器。" - -#: ../../../src/GameStateConfigDesktop.cpp:189 +msgstr "将尝试在视频内存中存储表面而不是系统内存。这对性能的影响取决于渲染器。" + +#: ../../../src/MenuConfig.cpp:512 msgid "" "Prevents screen tearing. Disable if you experience \"stuttering\" in " "windowed mode or input lag." -msgstr "防止画面撕裂。 如果在窗口模式或输入时卡顿则禁用。" - -#: ../../../src/GameStateConfigDesktop.cpp:190 +msgstr "防止画面撕裂。如果在窗口模式或输入时“卡顿”则禁用。" + +#: ../../../src/MenuConfig.cpp:513 msgid "" "When enabled, this uses the screen DPI in addition to the window dimensions " "to scale the rendering resolution. Otherwise, only the window dimensions are" " used." -msgstr "启用后,除了窗口尺寸外,还会使用屏幕DPI来调整渲染分辨率。 否则,只使用窗口尺寸。" - -#: ../../../src/GameStateConfigDesktop.cpp:191 +msgstr "启用后,除了窗口尺寸外,还会使用屏幕DPI来调整渲染分辨率。否则,只使用窗口尺寸。" + +#: ../../../src/MenuConfig.cpp:514 msgid "" "This enables parallax (non-tile) layers. Disabling this setting can improve " "performance in some cases." +msgstr "启用视差(非瓦片)层。 禁用此设置在一些情况下能提升性能。" + +#: ../../../src/MenuConfig.cpp:515 +msgid "" +"Enables the below setting that controls the screen gamma level. The behavior" +" of the gamma setting can vary between platforms." +msgstr "启用以下设置来控制屏幕伽马级别。这个伽马设置的行为依平台而异。" + +#: ../../../src/MenuConfig.cpp:516 +msgid "" +"Provides additional text for information that is primarily conveyed through " +"color." +msgstr "提供从颜色传递的额外的文字信息。" + +#: ../../../src/MenuConfig.cpp:517 +msgid "" +"Some mods will automatically hide the stat bars when they are inactive. " +"Disabling this option will keep them displayed at all times." +msgstr "当状态栏闲置时,一些组件会自动隐藏它。禁用它以让状态栏持续显示。" + +#: ../../../src/MenuConfig.cpp:518 +msgid "" +"When enabled, empty equipment slots will be filled with applicable items " +"when they are obtained." +msgstr "当开启时,获取适当的物品的时候空的装备栏将被填充。" + +#: ../../../src/MenuConfig.cpp:519 +msgid "" +"Shows a marker above enemies, allies, and the player when they are obscured " +"by tall objects." +msgstr "敌人、友军和玩家被高的物体遮蔽时在上面显示标记。" + +#: ../../../src/MenuConfig.cpp:520 +msgid "" +"When enabled, tooltips for equipped items of the same type are shown next to" +" standard item tooltips." msgstr "" -#: ../../../src/GameStateConfigDesktop.cpp:192 -msgid "Experimental" -msgstr "实验功能" - -#: ../../../src/GameStateConfigDesktop.cpp:193 -msgid "For handheld devices" -msgstr "对于手持设备" - -#: ../../../src/GameStateConfigDesktop.cpp:211 -msgid "Renderer" -msgstr "渲染" - -#: ../../../src/GameStateConfigDesktop.cpp:227 -msgid "Full Screen Mode" -msgstr "全屏模式" - -#: ../../../src/GameStateConfigDesktop.cpp:231 -msgid "Move hero using mouse" -msgstr "使用鼠标移动人物" - -#: ../../../src/GameStateConfigDesktop.cpp:235 -msgid "Hardware surfaces" -msgstr "硬件加速" - -#: ../../../src/GameStateConfigDesktop.cpp:239 -msgid "V-Sync" -msgstr "垂直同步" - -#: ../../../src/GameStateConfigDesktop.cpp:243 -msgid "Texture Filtering" -msgstr "纹理过滤" - -#: ../../../src/GameStateConfigDesktop.cpp:247 -msgid "DPI scaling" -msgstr "DPI缩放" - -#: ../../../src/GameStateConfigDesktop.cpp:251 -msgid "Parallax Layers" -msgstr "" - -#: ../../../src/GameStateConfigDesktop.cpp:255 -msgid "Allow changing gamma" -msgstr "允许更改亮度" - -#: ../../../src/GameStateConfigDesktop.cpp:259 -msgid "Gamma" -msgstr "亮度" - -#: ../../../src/GameStateConfigDesktop.cpp:263 -msgid "Use joystick" -msgstr "使用摇杆" - -#: ../../../src/GameStateConfigDesktop.cpp:267 -msgid "Joystick" -msgstr "摇杆" - -#: ../../../src/GameStateConfigDesktop.cpp:283 -msgid "Mouse aim" -msgstr "使用鼠标瞄准敌人" - -#: ../../../src/GameStateConfigDesktop.cpp:287 -msgid "Do not use mouse" -msgstr "不要使用鼠标" - -#: ../../../src/GameStateConfigDesktop.cpp:291 -msgid "Joystick Deadzone" -msgstr "操纵杆灵敏度" - -#: ../../../src/GameState.cpp:37 ../../../src/GameState.cpp:58 -msgid "Loading..." -msgstr "载入中..." - -#: ../../../src/GameStateLoad.cpp:88 ../../../src/GameStateLoad.cpp:101 -msgid "Delete Save" -msgstr "删除角色" - -#: ../../../src/GameStateLoad.cpp:88 -msgid "Delete this save?" -msgstr "确定删除角色?" - -#: ../../../src/GameStateLoad.cpp:90 -msgid "Exit to Title" -msgstr "回到游戏开始" - -#: ../../../src/GameStateLoad.cpp:93 -msgid "New Game" -msgstr "新游戏" - -#: ../../../src/GameStateLoad.cpp:97 ../../../src/GameStateLoad.cpp:600 -msgid "Choose a Slot" -msgstr "选择一个人物" - -#: ../../../src/GameStateLoad.cpp:573 ../../../src/GameStateLoad.cpp:594 -msgid "Enable a story mod to continue" -msgstr "使用故事模式继续" - -#: ../../../src/GameStateLoad.cpp:589 -msgid "Load Game" -msgstr "载入游戏" - -#: ../../../src/GameStateLoad.cpp:695 -msgid "Entering game world..." -msgstr "进入游戏..." - -#: ../../../src/GameStateLoad.cpp:698 -msgid "Loading saved game..." -msgstr "载入游戏..." - -#: ../../../src/GameStateLoad.cpp:731 -msgid "Invalid save" -msgstr "保存无效" - -#: ../../../src/GameStateLoad.cpp:755 ../../../src/ItemManager.cpp:747 -#: ../../../src/MenuPowers.cpp:778 ../../../src/MenuPowers.cpp:1144 -#: ../../../src/MenuPowers.cpp:1542 -#, c-format -msgid "Level %d" -msgstr "级别 %d" - -#: ../../../src/GameStateNew.cpp:68 -msgid "Create" -msgstr "创建" - -#: ../../../src/GameStateNew.cpp:76 -msgid "Randomize" -msgstr "随机化" - -#: ../../../src/GameStateNew.cpp:92 -msgid "Choose a Portrait" -msgstr "选择头像" - -#: ../../../src/GameStateNew.cpp:96 -msgid "Choose a Name" -msgstr "输入名字" - -#: ../../../src/GameStateNew.cpp:100 -msgid "Permadeath?" -msgstr "死亡后不可复活?" - -#: ../../../src/GameStateNew.cpp:104 -msgid "Choose a Class" -msgstr "选择职业" - -#: ../../../src/GameStateTitle.cpp:108 -msgid "Play Game" -msgstr "开始游戏" - -#: ../../../src/GameStateTitle.cpp:111 -msgid "Enable a core mod to continue" -msgstr "使用 core mod 继续" - -#: ../../../src/GameStateTitle.cpp:115 -msgid "Configuration" -msgstr "配置" - -#: ../../../src/GameStateTitle.cpp:118 -msgid "Credits" -msgstr "参与人员" - -#: ../../../src/GameStateTitle.cpp:121 -msgid "Exit Game" -msgstr "退出游戏" - -#: ../../../src/InputState.cpp:402 -msgid "Accept" -msgstr "确定" - -#: ../../../src/InputState.cpp:403 ../../../src/SDLInputState.cpp:607 -msgid "Up" -msgstr "上" - -#: ../../../src/InputState.cpp:404 ../../../src/SDLInputState.cpp:585 -msgid "Down" -msgstr "下" - -#: ../../../src/InputState.cpp:405 ../../../src/SDLInputState.cpp:592 -msgid "Left" -msgstr "左" - -#: ../../../src/InputState.cpp:406 ../../../src/SDLInputState.cpp:602 -msgid "Right" -msgstr "右" - -#: ../../../src/InputState.cpp:407 -msgid "Bar1" -msgstr "槽1" - -#: ../../../src/InputState.cpp:408 -msgid "Bar2" -msgstr "槽2" - -#: ../../../src/InputState.cpp:409 -msgid "Bar3" -msgstr "槽3" - -#: ../../../src/InputState.cpp:410 -msgid "Bar4" -msgstr "槽4" - -#: ../../../src/InputState.cpp:411 -msgid "Bar5" -msgstr "槽5" - -#: ../../../src/InputState.cpp:412 -msgid "Bar6" -msgstr "槽6" - -#: ../../../src/InputState.cpp:413 -msgid "Bar7" -msgstr "槽7" - -#: ../../../src/InputState.cpp:414 -msgid "Bar8" -msgstr "槽8" - -#: ../../../src/InputState.cpp:415 -msgid "Bar9" -msgstr "槽9" - -#: ../../../src/InputState.cpp:416 -msgid "Bar0" -msgstr "槽0" - -#: ../../../src/InputState.cpp:417 ../../../src/MenuActionBar.cpp:83 -#: ../../../src/MenuCharacter.cpp:54 -msgid "Character" -msgstr "角色" - -#: ../../../src/InputState.cpp:418 ../../../src/MenuActionBar.cpp:84 -#: ../../../src/MenuInventory.cpp:137 ../../../src/MenuVendor.cpp:57 -msgid "Inventory" -msgstr "物品" - -#: ../../../src/InputState.cpp:419 ../../../src/MenuActionBar.cpp:85 -#: ../../../src/MenuPowers.cpp:168 -msgid "Powers" -msgstr "技能" - -#: ../../../src/InputState.cpp:420 ../../../src/MenuActionBar.cpp:86 -#: ../../../src/MenuLog.cpp:72 -msgid "Log" -msgstr "说明" - -#: ../../../src/InputState.cpp:421 -msgid "Main1" -msgstr "主槽1" - -#: ../../../src/InputState.cpp:422 -msgid "Main2" -msgstr "主槽2" - -#: ../../../src/InputState.cpp:423 -msgid "Ctrl" -msgstr "Ctrl" - -#: ../../../src/InputState.cpp:424 -msgid "Shift" -msgstr "Shift" - -#: ../../../src/InputState.cpp:425 -msgid "Alt" -msgstr "其他" - -#: ../../../src/InputState.cpp:426 ../../../src/SDLInputState.cpp:584 -msgid "Delete" -msgstr "删除" - -#: ../../../src/InputState.cpp:427 -msgid "ActionBar Accept" -msgstr "操作栏 接受" - -#: ../../../src/InputState.cpp:428 -msgid "ActionBar Left" -msgstr "操作栏 左" - -#: ../../../src/InputState.cpp:429 -msgid "ActionBar Right" -msgstr "" - -#: ../../../src/InputState.cpp:430 -msgid "ActionBar Use" -msgstr "" - -#: ../../../src/InputState.cpp:431 -msgid "Developer Menu" -msgstr "" - -#: ../../../src/InputState.cpp:433 -msgid "Left Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:434 -msgid "Middle Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:435 -msgid "Right Mouse" -msgstr "" - -#: ../../../src/InputState.cpp:436 -msgid "Wheel Up" -msgstr "" - -#: ../../../src/InputState.cpp:437 -msgid "Wheel Down" -msgstr "" - -#: ../../../src/InputState.cpp:438 -msgid "Mouse X1" -msgstr "" - -#: ../../../src/InputState.cpp:439 -msgid "Mouse X2" -msgstr "" - -#: ../../../src/ItemManager.cpp:450 ../../../src/ItemManager.cpp:453 -msgid "Unknown Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:648 ../../../src/MenuPowers.cpp:887 -#, c-format -msgid "%d%% Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:652 ../../../src/MenuPowers.cpp:890 -#, c-format -msgid "%d%% Attack Speed" -msgstr "" - -#: ../../../src/ItemManager.cpp:674 ../../../src/MenuCharacter.cpp:354 -#: ../../../src/MenuPowers.cpp:833 -#, c-format -msgid "Resistance (%s)" -msgstr "" - -#: ../../../src/ItemManager.cpp:684 -#, c-format -msgid "Requires %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:733 -msgid "Quest Item" -msgstr "" - -#: ../../../src/ItemManager.cpp:760 -#, c-format -msgid "Quality: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:785 -#, c-format -msgid "Absorb: %d-%d" -msgstr "抵消攻击: %d-%d" - -#: ../../../src/ItemManager.cpp:787 -#, c-format -msgid "Absorb: %d" -msgstr "抵消攻击: %d" - -#: ../../../src/ItemManager.cpp:827 ../../../src/MenuPowers.cpp:1131 -#: ../../../src/MenuPowers.cpp:1134 -#, c-format -msgid "Requires Level %d" -msgstr "需要级别 %d" - -#: ../../../src/ItemManager.cpp:838 ../../../src/MenuPowers.cpp:1123 -#: ../../../src/MenuPowers.cpp:1125 -#, c-format -msgid "Requires %s %d" -msgstr "" - -#: ../../../src/ItemManager.cpp:849 -#, c-format -msgid "Requires Class: %s" -msgstr "" - -#: ../../../src/ItemManager.cpp:864 ../../../src/ItemManager.cpp:876 -#, c-format -msgid "Buy Price: %d %s" -msgstr "购买价格: %d %s" - -#: ../../../src/ItemManager.cpp:866 ../../../src/ItemManager.cpp:878 -#, c-format -msgid "Buy Price: %d %s each" -msgstr "购买单价: %d %s " - -#: ../../../src/ItemManager.cpp:886 -#, c-format -msgid "Sell Price: %d %s" -msgstr "出售价格: %d %s" - -#: ../../../src/ItemManager.cpp:888 -#, c-format -msgid "Sell Price: %d %s each" -msgstr "出售单价: %d %s " - -#: ../../../src/ItemManager.cpp:897 -msgid "Set:" -msgstr "" - -#: ../../../src/ItemManager.cpp:904 -#, c-format -msgid "%d items:" -msgstr "" - -#: ../../../src/ItemManager.cpp:917 -#, c-format -msgid "Press [%s] to use" -msgstr "" - -#: ../../../src/ItemManager.cpp:920 -#, c-format -msgid "Press [%s] to read" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:87 -msgid "Loot tooltip visibility" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:88 -msgid "Mini-map mode" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:89 -msgid "Always show stat bar labels" -msgstr "始终显示进度条标签" - -#: ../../../src/MenuActionBar.cpp:90 -msgid "Show combat text" -msgstr "显示战斗文字" - -#: ../../../src/MenuActionBar.cpp:254 ../../../src/MenuActionBar.cpp:261 -#: ../../../src/MenuActionBar.cpp:264 ../../../src/MenuActionBar.cpp:271 -#, c-format -msgid "Hotkey: %s" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:474 -#, c-format -msgid "Default. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:476 -#, c-format -msgid "Show All. Temporarily hide all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:478 -#, c-format -msgid "Hide All. Temporarily show all loot tooltips with '%s'." -msgstr "" - -#: ../../../src/MenuActionBar.cpp:482 -msgid "Visible" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:484 -msgid "Visible (2x zoom)" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:486 -msgid "Hidden" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:490 ../../../src/MenuActionBar.cpp:496 -msgid "Enabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:492 ../../../src/MenuActionBar.cpp:498 -msgid "Disabled" -msgstr "" - -#: ../../../src/MenuActionBar.cpp:657 -msgid "Not enough MP." -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:124 -#, c-format -msgid "x%d" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:219 -msgid "Remaining:" -msgstr "" - -#: ../../../src/MenuActiveEffects.cpp:225 -#, c-format -msgid "x%d stacks" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:73 ../../../src/MenuCharacter.cpp:78 -msgid "Name" -msgstr "名字" - -#: ../../../src/MenuCharacter.cpp:74 ../../../src/MenuCharacter.cpp:79 -msgid "Level" -msgstr "级别" - -#: ../../../src/MenuCharacter.cpp:310 -#, c-format -msgid "%d unspent stat point" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:313 -#, c-format -msgid "%d unspent stat points" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:355 -#, c-format -msgid "Reduces the damage taken from \"%s\" elemental attacks." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:365 ../../../src/MenuManager.cpp:283 -#, c-format -msgid "XP: %d" -msgstr "经验值: %d" - -#: ../../../src/MenuCharacter.cpp:367 -#, c-format -msgid "Next: %d" -msgstr "Next: %d" - -#: ../../../src/MenuCharacter.cpp:373 -#, c-format -msgid "base (%d), bonus (%d)" -msgstr "base (%d), bonus (%d)" - -#: ../../../src/MenuCharacter.cpp:381 ../../../src/MenuCharacter.cpp:395 -msgid "Related stats:" -msgstr "" - -#: ../../../src/MenuCharacter.cpp:421 ../../../src/MenuCharacter.cpp:445 -#, c-format -msgid "Each level grants %d." -msgstr "" - -#: ../../../src/MenuCharacter.cpp:425 ../../../src/MenuCharacter.cpp:449 -#, c-format -msgid "Each point of %s grants %d." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:63 +#: ../../../src/MenuConfig.cpp:521 +msgid "" +"This allows the game to be controlled entirely with the keyboard (or " +"joystick)." +msgstr "允许游戏完全被键盘(或摇杆)控制。" + +#: ../../../src/MenuConfig.cpp:522 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or" +" 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero " +"instead of 'Main1'." +msgstr "当开启‘使用鼠标移动英雄’时,这设置使用‘主按键1’还是‘主按键2’来移动英雄。开启时,使用‘主按键2’来移动英雄而不是‘主按键1’。" + +#: ../../../src/MenuConfig.cpp:523 +msgid "" +"When 'Move hero using mouse' is enabled, this setting controls if the Power " +"assigned to the movement button can be used by targeting an enemy. If this " +"setting is disabled, it is required to use 'Shift' to access the Power " +"assigned to the movement button." +msgstr "当开启‘使用鼠标移动英雄’时,这设置分配到移动键的技能是否能向敌人使用。如果这个设置被禁用,需要使用‘Shift’访问分配到移动键的技能。" + +#: ../../../src/MenuConfig.cpp:524 +msgid "" +"The player's attacks will be aimed in the direction of the mouse cursor when" +" this is enabled." +msgstr "开启后玩家的攻击将指向光标。" + +#: ../../../src/MenuConfig.cpp:575 +msgid "Active Mods" +msgstr "激活模块" + +#: ../../../src/MenuConfig.cpp:584 +msgid "Available Mods" +msgstr "可用模块" + +#: ../../../src/MenuConfig.cpp:603 +msgid "<< Disable" +msgstr "<< 禁用" + +#: ../../../src/MenuConfig.cpp:609 +msgid "Enable >>" +msgstr "启用 >>" + +#: ../../../src/MenuConfig.cpp:1444 +msgid "Version:" +msgstr "版本号:" + +#: ../../../src/MenuConfig.cpp:1449 +msgid "Game:" +msgstr "游戏:" + +#: ../../../src/MenuConfig.cpp:1454 +msgid "Engine version:" +msgstr "引擎版本号:" + +#: ../../../src/MenuConfig.cpp:1462 +msgid "Requires mods:" +msgstr "需要的模块:" + +#: ../../../src/MenuConfig.cpp:1570 ../../../src/SDLInputState.cpp:748 +msgid "(none)" +msgstr "(无)" + +#: ../../../src/MenuConfig.cpp:1587 ../../../src/MenuGameOver.cpp:73 +msgid "Save & Exit" +msgstr "保存并退出" + +#: ../../../src/MenuDevConsole.cpp:65 msgid "Execute" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:101 ../../../src/MenuDevConsole.cpp:151 +msgstr "执行" + +#: ../../../src/MenuDevConsole.cpp:103 ../../../src/MenuDevConsole.cpp:153 msgid "Developer Console" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:141 +msgstr "开发者控制台" + +#: ../../../src/MenuDevConsole.cpp:143 #, c-format msgid "Use '%s' to inspect with the cursor." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:146 +msgstr "使用‘%s’使用光标检视" + +#: ../../../src/MenuDevConsole.cpp:148 msgid "Arguments with spaces should be enclosed with double quotes. Example:" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:147 +msgstr "参数中的空格需要以双引号包围。比如:" + +#: ../../../src/MenuDevConsole.cpp:149 msgid "Type 'help' to get a list of commands." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:209 ../../../src/MenuDevConsole.cpp:213 +msgstr "输入‘help’获取命令列表。" + +#: ../../../src/MenuDevConsole.cpp:211 ../../../src/MenuDevConsole.cpp:215 msgid "px" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:224 +msgstr "像素" + +#: ../../../src/MenuDevConsole.cpp:226 msgid "Distance" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:239 ../../../src/MenuDevConsole.cpp:286 +msgstr "距离" + +#: ../../../src/MenuDevConsole.cpp:241 ../../../src/MenuDevConsole.cpp:289 +#: ../../../src/MenuDevConsole.cpp:303 msgid "Entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:261 ../../../src/MenuDevConsole.cpp:268 +msgstr "实体" + +#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:270 msgid "none" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:262 ../../../src/MenuDevConsole.cpp:264 +msgstr "无" + +#: ../../../src/MenuDevConsole.cpp:264 ../../../src/MenuDevConsole.cpp:266 msgid "wall" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:263 ../../../src/MenuDevConsole.cpp:265 +msgstr "墙" + +#: ../../../src/MenuDevConsole.cpp:265 ../../../src/MenuDevConsole.cpp:267 msgid "short wall / pit" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:266 +msgstr "矮墙/坑洞" + +#: ../../../src/MenuDevConsole.cpp:268 msgid "entity" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:267 +msgstr "敌人" + +#: ../../../src/MenuDevConsole.cpp:269 msgid "entity, ally" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:274 +msgstr "敌人,友军" + +#: ../../../src/MenuDevConsole.cpp:276 msgid "Tile" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:360 +msgstr "瓦片" + +#: ../../../src/MenuDevConsole.cpp:377 msgid "adds a power to the action bar" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:361 +msgstr "向动作槽添加一个技能" + +#: ../../../src/MenuDevConsole.cpp:378 msgid "turns on/off the display of the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:362 +msgstr "打开/关闭FPS计数器的显示" + +#: ../../../src/MenuDevConsole.cpp:379 msgid "turns on/off all of the HUD elements" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:363 +msgstr "打开/关闭全部HUD元素" + +#: ../../../src/MenuDevConsole.cpp:380 msgid "turns on/off the developer hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:364 +msgstr "打开/关闭开发者HUD" + +#: ../../../src/MenuDevConsole.cpp:381 msgid "" "Prints a list of powers that match a search term. No search term will list " "all items" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:365 +msgstr "输出匹配搜索词的技能列表。没有搜索词将会列出所有对象" + +#: ../../../src/MenuDevConsole.cpp:382 msgid "Prints out all the map filenames located in the \"maps/\" directory." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:366 +msgstr "输出“maps/”文件夹里所有地图的文件名。" + +#: ../../../src/MenuDevConsole.cpp:383 msgid "" "Prints out the active campaign statuses that match a search term. No search " "term will list all active statuses" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:367 +msgstr "输出匹配搜索词的活动战役状态。没有搜索词将会列出所有活动状态" + +#: ../../../src/MenuDevConsole.cpp:384 msgid "" "Prints a list of items that match a search term. No search term will list " "all items" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:368 +msgstr "输出匹配搜索词的物品。没有搜索词将会列出所有物品" + +#: ../../../src/MenuDevConsole.cpp:385 msgid "" "parses a series of event components and executes them as a single event" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:369 +msgstr "解析一串事件元素并且像一个事件一样执行它们" + +#: ../../../src/MenuDevConsole.cpp:386 msgid "clears the command history" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:370 +msgstr "清除命令历史" + +#: ../../../src/MenuDevConsole.cpp:387 msgid "displays this text" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:377 +msgstr "显示这个文字" + +#: ../../../src/MenuDevConsole.cpp:394 msgid "Toggled the developer hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:381 +msgstr "切换开发者HUD" + +#: ../../../src/MenuDevConsole.cpp:398 msgid "Toggled the hud" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:385 +msgstr "切换HUD" + +#: ../../../src/MenuDevConsole.cpp:402 msgid "Toggled the FPS counter" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:534 +msgstr "切换FPS计数器" + +#: ../../../src/MenuDevConsole.cpp:552 msgid "ERROR: Incorrect number of arguments" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 ../../../src/MenuDevConsole.cpp:564 +msgstr "错误:参数个数错误" + +#: ../../../src/MenuDevConsole.cpp:554 ../../../src/MenuDevConsole.cpp:582 msgid "HINT:" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:536 +msgstr "提示:" + +#: ../../../src/MenuDevConsole.cpp:554 msgid "" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:552 +msgstr "" + +#: ../../../src/MenuDevConsole.cpp:570 #, c-format msgid "ERROR: '%s' is not a valid event key" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:562 +msgstr "错误:'%s'是非法事件代码" + +#: ../../../src/MenuDevConsole.cpp:580 msgid "ERROR: Too few arguments" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:564 +msgstr "错误:参数太少" + +#: ../../../src/MenuDevConsole.cpp:582 msgid "= = ..." -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:569 +msgstr "= = ..." + +#: ../../../src/MenuDevConsole.cpp:587 msgid "ERROR: Unknown command" -msgstr "" - -#: ../../../src/MenuDevConsole.cpp:571 +msgstr "错误:未知命令" + +#: ../../../src/MenuDevConsole.cpp:589 msgid "HINT: Type help" -msgstr "" - -#: ../../../src/MenuEnemy.cpp:138 +msgstr "提示:类型帮助" + +#: ../../../src/MenuEnemy.cpp:162 #, c-format msgid "%s level %d" -msgstr "%s 级别 %d" - -#: ../../../src/MenuEnemy.cpp:162 +msgstr "%s 等级%d" + +#: ../../../src/MenuEnemy.cpp:186 msgid "Dead" msgstr "死亡" -#: ../../../src/MenuEnemy.cpp:164 +#: ../../../src/MenuEnemy.cpp:188 msgid "Destroyed" +msgstr "摧毁" + +#: ../../../src/MenuGameOver.cpp:69 +msgid "Game Over" msgstr "" -#: ../../../src/MenuExit.cpp:85 ../../../src/MenuExit.cpp:139 -msgid "Paused" -msgstr "" - -#: ../../../src/MenuExit.cpp:91 -msgid "Save & Exit" -msgstr "" - -#: ../../../src/MenuExit.cpp:92 -msgid "Exit" -msgstr "退出" - -#: ../../../src/MenuExit.cpp:96 -msgid "Continue" -msgstr "" - -#: ../../../src/MenuInventory.cpp:73 -msgid "Automatically equip items" -msgstr "自动装备物品" - -#: ../../../src/MenuInventory.cpp:188 +#: ../../../src/MenuInventory.cpp:178 #, c-format msgid "Lost %d%% of %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:195 +msgstr "失去%d%%的%s。" + +#: ../../../src/MenuInventory.cpp:185 #, c-format msgid "Lost %d%% of total XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:200 +msgstr "失去%d%%总XP。" + +#: ../../../src/MenuInventory.cpp:190 #, c-format msgid "Lost %d%% of current level XP." -msgstr "" - -#: ../../../src/MenuInventory.cpp:226 +msgstr "失去%d%%当前等级的XP。" + +#: ../../../src/MenuInventory.cpp:216 #, c-format msgid "Lost %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:274 ../../../src/MenuStash.cpp:146 +msgstr "失去%s。" + +#: ../../../src/MenuInventory.cpp:258 ../../../src/MenuStash.cpp:276 #, c-format msgid "%d %s" -msgstr "%d %s" - -#: ../../../src/MenuInventory.cpp:317 +msgstr "%d个%s" + +#: ../../../src/MenuInventory.cpp:301 msgid "Pick up item(s):" -msgstr "" - -#: ../../../src/MenuInventory.cpp:318 +msgstr "捡起物品:" + +#: ../../../src/MenuInventory.cpp:302 msgid "Use or equip item:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:319 +msgstr "使用或装备物品:" + +#: ../../../src/MenuInventory.cpp:303 #, c-format msgid "%s modifiers" -msgstr "" - -#: ../../../src/MenuInventory.cpp:320 +msgstr "来调整" + +#: ../../../src/MenuInventory.cpp:304 msgid "Select a quantity of item:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:323 +msgstr "选择物品的数量:" + +#: ../../../src/MenuInventory.cpp:307 msgid "Stash item stack:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:325 +msgstr "储物物品的栈:" + +#: ../../../src/MenuInventory.cpp:309 msgid "Sell item stack:" -msgstr "" - -#: ../../../src/MenuInventory.cpp:592 +msgstr "卖出物品的栈:" + +#: ../../../src/MenuInventory.cpp:576 msgid "You don't have enough of the required item." -msgstr "" - -#: ../../../src/MenuInventory.cpp:599 +msgstr "你没有足够的需要的物品。" + +#: ../../../src/MenuInventory.cpp:588 msgid "You can't use this item right now." -msgstr "" - -#: ../../../src/MenuInventory.cpp:611 +msgstr "你无法立刻使用这个物品。" + +#: ../../../src/MenuInventory.cpp:600 msgid "This item can only be used from the action bar." -msgstr "此物品只能从动作槽使用" - -#: ../../../src/MenuInventory.cpp:729 +msgstr "此物品只能从动作槽使用。" + +#: ../../../src/MenuInventory.cpp:718 msgid "Inventory is full." -msgstr "背包已满" - -#: ../../../src/MenuInventory.cpp:849 +msgstr "背包已满。" + +#: ../../../src/MenuInventory.cpp:843 #, c-format msgid "Not enough %s." -msgstr "" - -#: ../../../src/MenuInventory.cpp:869 ../../../src/MenuInventory.cpp:876 +msgstr "%s不足。" + +#: ../../../src/MenuInventory.cpp:863 ../../../src/MenuInventory.cpp:870 msgid "This item can not be sold." -msgstr "" +msgstr "这个物品无法卖出。" #: ../../../src/MenuLog.cpp:91 msgid "Notes" @@ -1090,523 +1269,661 @@ msgid "Quests" msgstr "任务" -#: ../../../src/MenuManager.cpp:286 +#: ../../../src/MenuManager.cpp:305 #, c-format msgid "XP: %d/%d" -msgstr "经验值: %d/%d" - -#: ../../../src/MenuManager.cpp:827 +msgstr "经验值:%d/%d" + +#: ../../../src/MenuManager.cpp:875 msgid "This item can not be dropped." +msgstr "这个物品无法丢弃。" + +#: ../../../src/MenuManager.cpp:1501 +msgid "Equipped" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:87 +msgid "Select a Movement Type" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:89 +msgid "Can be changed later in the Configuration menu." +msgstr "" + +#: ../../../src/MenuMovementType.cpp:92 ../../../src/MenuMovementType.cpp:122 +msgid "Keyboard" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:93 ../../../src/MenuMovementType.cpp:128 +msgid "Mouse" +msgstr "" + +#: ../../../src/MenuMovementType.cpp:129 +msgid "Button" msgstr "" #: ../../../src/MenuNumPicker.cpp:59 msgid "Enter amount:" +msgstr "输入数目:" + +#: ../../../src/MenuPowers.cpp:872 +msgid "Passive" +msgstr "被动" + +#: ../../../src/MenuPowers.cpp:879 +#, c-format +msgid "Costs %d MP" +msgstr "消耗%dMP" + +#: ../../../src/MenuPowers.cpp:883 +#, c-format +msgid "Costs %d HP" +msgstr "消耗%dHP" + +#: ../../../src/MenuPowers.cpp:887 +msgid "Cooldown:" +msgstr "冷却:" + +#: ../../../src/MenuPowers.cpp:938 ../../../src/MenuPowers.cpp:941 +msgid "Damage per second" +msgstr "每秒伤害:" + +#: ../../../src/MenuPowers.cpp:944 ../../../src/MenuPowers.cpp:947 +msgid "HP per second" +msgstr "每秒HP" + +#: ../../../src/MenuPowers.cpp:950 ../../../src/MenuPowers.cpp:953 +msgid "MP per second" +msgstr "每秒MP" + +#: ../../../src/MenuPowers.cpp:957 +msgid "Immobilize" +msgstr "固定" + +#: ../../../src/MenuPowers.cpp:965 +msgid "Immunity" +msgstr "豁免" + +#: ../../../src/MenuPowers.cpp:968 +msgid "Immunity to damage over time" +msgstr "慢性伤害豁免" + +#: ../../../src/MenuPowers.cpp:971 +msgid "Immunity to slow" +msgstr "减速豁免" + +#: ../../../src/MenuPowers.cpp:974 +msgid "Immunity to stun" +msgstr "击晕豁免" + +#: ../../../src/MenuPowers.cpp:977 +msgid "Immunity to HP steal" +msgstr "HP偷取豁免" + +#: ../../../src/MenuPowers.cpp:980 +msgid "Immunity to MP steal" +msgstr "MP偷取豁免" + +#: ../../../src/MenuPowers.cpp:983 +msgid "Immunity to knockback" +msgstr "击退豁免" + +#: ../../../src/MenuPowers.cpp:986 +msgid "Immunity to damage reflection" +msgstr "伤害反射豁免" + +#: ../../../src/MenuPowers.cpp:992 +msgid "Stun" +msgstr "击晕" + +#: ../../../src/MenuPowers.cpp:995 +msgid "Automatic revive on death" +msgstr "死亡自动复活" + +#: ../../../src/MenuPowers.cpp:998 +msgid "Convert" +msgstr "转换" + +#: ../../../src/MenuPowers.cpp:1001 +msgid "Fear" +msgstr "恐惧" + +#: ../../../src/MenuPowers.cpp:1004 +msgid "Lifespan" +msgstr "有效期" + +#: ../../../src/MenuPowers.cpp:1028 +msgid "Magical Shield" +msgstr "魔法盾" + +#: ../../../src/MenuPowers.cpp:1057 +msgid "Healing" +msgstr "治疗" + +#: ../../../src/MenuPowers.cpp:1060 +msgid "Knockback" +msgstr "击退" + +#: ../../../src/MenuPowers.cpp:1084 +#, c-format +msgid "%d%% chance" +msgstr "%d%%几率" + +#: ../../../src/MenuPowers.cpp:1136 +msgid "Base Accuracy" +msgstr "基础精准度" + +#: ../../../src/MenuPowers.cpp:1156 +msgid "Base Critical Chance" +msgstr "基础致命一击几率" + +#: ../../../src/MenuPowers.cpp:1164 +msgid "Ignores Absorbtion" +msgstr "无视伤害吸收" + +#: ../../../src/MenuPowers.cpp:1169 +msgid "Ignores Avoidance" +msgstr "无视闪避" + +#: ../../../src/MenuPowers.cpp:1174 +#, c-format +msgid "%d%% Chance to crit slowed targets" +msgstr "%d%%几率重击减慢的敌人" + +#: ../../../src/MenuPowers.cpp:1179 +#, c-format +msgid "Elemental Damage (%s)" +msgstr "元素伤害(%s)" + +#: ../../../src/MenuPowers.cpp:1188 +#, c-format +msgid "Requires a %s" +msgstr "需要一个%s" + +#: ../../../src/MenuPowers.cpp:1226 ../../../src/MenuPowers.cpp:1229 +#, c-format +msgid "Requires Power: %s" +msgstr "需要技能点:%s" + +#: ../../../src/MenuPowers.cpp:1238 +msgid "Click to Unlock (uses 1 Skill Point)" +msgstr "点击以解锁(使用一个技能点)" + +#: ../../../src/MenuPowers.cpp:1242 ../../../src/MenuPowers.cpp:1244 +msgid "Requires 1 Skill Point" +msgstr "需要一个技能点" + +#: ../../../src/MenuPowers.cpp:1444 +#, c-format +msgid "Available skill points: %d" msgstr "" -#: ../../../src/MenuPowers.cpp:787 -msgid "Passive" -msgstr "" - -#: ../../../src/MenuPowers.cpp:792 -#, c-format -msgid "Costs %d MP" -msgstr "消耗 %d MP" - -#: ../../../src/MenuPowers.cpp:796 -#, c-format -msgid "Costs %d HP" -msgstr "消耗 %d HP" - -#: ../../../src/MenuPowers.cpp:801 -msgid "Cooldown:" -msgstr "" - -#: ../../../src/MenuPowers.cpp:866 ../../../src/MenuPowers.cpp:869 -msgid "Damage per second" -msgstr "" - -#: ../../../src/MenuPowers.cpp:872 ../../../src/MenuPowers.cpp:875 -msgid "HP per second" -msgstr "" - -#: ../../../src/MenuPowers.cpp:878 ../../../src/MenuPowers.cpp:881 -msgid "MP per second" -msgstr "" - -#: ../../../src/MenuPowers.cpp:885 -msgid "Immobilize" -msgstr "" - -#: ../../../src/MenuPowers.cpp:893 -msgid "Immunity" -msgstr "" - -#: ../../../src/MenuPowers.cpp:896 -msgid "Immunity to damage over time" -msgstr "" - -#: ../../../src/MenuPowers.cpp:899 -msgid "Immunity to slow" -msgstr "" - -#: ../../../src/MenuPowers.cpp:902 -msgid "Immunity to stun" -msgstr "" - -#: ../../../src/MenuPowers.cpp:905 -msgid "Immunity to HP steal" -msgstr "" - -#: ../../../src/MenuPowers.cpp:908 -msgid "Immunity to MP steal" -msgstr "" - -#: ../../../src/MenuPowers.cpp:911 -msgid "Immunity to knockback" -msgstr "" - -#: ../../../src/MenuPowers.cpp:914 -msgid "Immunity to damage reflection" -msgstr "" - -#: ../../../src/MenuPowers.cpp:917 -msgid "Stun" -msgstr "" - -#: ../../../src/MenuPowers.cpp:920 -msgid "Automatic revive on death" -msgstr "" - -#: ../../../src/MenuPowers.cpp:923 -msgid "Convert" -msgstr "" - -#: ../../../src/MenuPowers.cpp:926 -msgid "Fear" -msgstr "" - -#: ../../../src/MenuPowers.cpp:929 -msgid "Lifespan" -msgstr "" - -#: ../../../src/MenuPowers.cpp:953 -msgid "Magical Shield" -msgstr "" - -#: ../../../src/MenuPowers.cpp:982 -msgid "Healing" -msgstr "" - -#: ../../../src/MenuPowers.cpp:985 -msgid "Knockback" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1010 -#, c-format -msgid "%d%% chance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1062 -msgid "Base Accuracy" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1082 -msgid "Base Critical Chance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1090 -msgid "Ignores Absorbtion" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1095 -msgid "Ignores Avoidance" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1100 -#, c-format -msgid "%d%% Chance to crit slowed targets" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1105 -#, c-format -msgid "Elemental Damage (%s)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1114 -#, c-format -msgid "Requires a %s" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1151 ../../../src/MenuPowers.cpp:1154 -#, c-format -msgid "Requires Power: %s" -msgstr "需要技能点: %s" - -#: ../../../src/MenuPowers.cpp:1163 -msgid "Click to Unlock (uses 1 Skill Point)" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1167 ../../../src/MenuPowers.cpp:1169 -msgid "Requires 1 Skill Point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1355 -#, c-format -msgid "%d unspent skill point" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1358 -#, c-format -msgid "%d unspent skill points" -msgstr "" - -#: ../../../src/MenuPowers.cpp:1388 +#: ../../../src/MenuPowers.cpp:1476 msgid "Next Level:" -msgstr "" - -#: ../../../src/MenuStash.cpp:96 -msgid "Shared Stash" +msgstr "下一级:" + +#: ../../../src/MenuStash.cpp:80 ../../../src/MenuStash.cpp:161 +msgid "Stash" msgstr "储物柜" -#: ../../../src/MenuStash.cpp:209 -msgid "Can not store quest items in the stash." -msgstr "" - -#: ../../../src/MenuStash.cpp:219 +#: ../../../src/MenuStash.cpp:174 ../../../src/MenuStash.cpp:188 +msgid "Private" +msgstr "隐私" + +#: ../../../src/MenuStash.cpp:175 +msgid "Shared" +msgstr "公用" + +#: ../../../src/MenuStash.cpp:340 +msgid "This item can not be stored in the stash." +msgstr "此物品无法存放在储物柜中。" + +#: ../../../src/MenuStash.cpp:345 +msgid "This item can not be stored in the private stash." +msgstr "此物品无法存放在私人储物柜中。" + +#: ../../../src/MenuStash.cpp:350 +msgid "This item can not be stored in the shared stash." +msgstr "此物品无法存放在公用储物柜中。" + +#: ../../../src/MenuStash.cpp:360 msgid "Stash is full." -msgstr "" - -#: ../../../src/MenuTalker.cpp:454 +msgstr "储物柜已满。" + +#: ../../../src/MenuStash.cpp:414 +#, c-format +msgid "Can not store item in stash: %s" +msgstr "无法在储物柜中存放物品 %s" + +#: ../../../src/MenuTalker.cpp:448 +#, c-format +msgid "" +msgstr "" + +#: ../../../src/MenuTalker.cpp:456 msgid "Trade" msgstr "交易" -#: ../../../src/MenuVendor.cpp:58 +#: ../../../src/MenuVendor.cpp:60 msgid "Buyback" msgstr "购回" -#: ../../../src/MenuVendor.cpp:279 +#: ../../../src/MenuVendor.cpp:283 msgid "Vendor" msgstr "商人" -#: ../../../src/PowerManager.cpp:1136 +#: ../../../src/PowerManager.cpp:1208 #, c-format msgid "+%d Shield" -msgstr "+%d Shield" - -#: ../../../src/PowerManager.cpp:1392 +msgstr "+%d护盾" + +#: ../../../src/PowerManager.cpp:1465 msgid "You are already transformed, untransform first." -msgstr "You are already transformed, untransform first." - -#: ../../../src/PowerManager.cpp:1404 +msgstr "你已经被传送了,得先反传送。" + +#: ../../../src/PowerManager.cpp:1477 msgid "Could not untransform at this position." -msgstr "" +msgstr "不能反传送回这个位置。" #: ../../../src/QuestLog.cpp:234 msgid "Completed Quests" -msgstr "" - -#: ../../../src/SaveLoad.cpp:243 ../../../src/SaveLoad.cpp:244 +msgstr "完成的任务" + +#: ../../../src/SaveLoad.cpp:250 ../../../src/SaveLoad.cpp:251 msgid "Game saved." -msgstr "" - -#: ../../../src/SDLInputState.cpp:582 +msgstr "游戏已保存。" + +#: ../../../src/SDLInputState.cpp:643 +msgid "BkSp" +msgstr "回格键" + +#: ../../../src/SDLInputState.cpp:644 +msgid "Caps" +msgstr "大写锁定" + +#: ../../../src/SDLInputState.cpp:645 +msgid "Del" +msgstr "删除键" + +#: ../../../src/SDLInputState.cpp:647 ../../../src/SDLInputState.cpp:677 +msgid "End" +msgstr "End" + +#: ../../../src/SDLInputState.cpp:648 +msgid "Esc" +msgstr "退出键" + +#: ../../../src/SDLInputState.cpp:649 ../../../src/SDLInputState.cpp:679 +msgid "Home" +msgstr "Home" + +#: ../../../src/SDLInputState.cpp:650 +msgid "Ins" +msgstr "Ins" + +#: ../../../src/SDLInputState.cpp:651 +msgid "LAlt" +msgstr "左Alt" + +#: ../../../src/SDLInputState.cpp:652 +msgid "LCtrl" +msgstr "左Ctrl" + +#: ../../../src/SDLInputState.cpp:654 +msgid "LShft" +msgstr "左Shift" + +#: ../../../src/SDLInputState.cpp:655 +msgid "Num" +msgstr "Num" + +#: ../../../src/SDLInputState.cpp:656 +msgid "PgDn" +msgstr "PgDn" + +#: ../../../src/SDLInputState.cpp:657 +msgid "PgUp" +msgstr "PgUp" + +#: ../../../src/SDLInputState.cpp:658 ../../../src/SDLInputState.cpp:688 +msgid "Pause" +msgstr "Pause" + +#: ../../../src/SDLInputState.cpp:659 +msgid "Print" +msgstr "Print" + +#: ../../../src/SDLInputState.cpp:660 +msgid "RAlt" +msgstr "右Alt" + +#: ../../../src/SDLInputState.cpp:661 +msgid "RCtrl" +msgstr "右Ctrl" + +#: ../../../src/SDLInputState.cpp:662 +msgid "Ret" +msgstr "Ret" + +#: ../../../src/SDLInputState.cpp:664 +msgid "RShft" +msgstr "右Shift" + +#: ../../../src/SDLInputState.cpp:665 +msgid "SLock" +msgstr "SLock" + +#: ../../../src/SDLInputState.cpp:666 +msgid "Spc" +msgstr "Spc" + +#: ../../../src/SDLInputState.cpp:667 ../../../src/SDLInputState.cpp:697 +msgid "Tab" +msgstr "Tab" + +#: ../../../src/SDLInputState.cpp:673 msgid "Backspace" -msgstr "" - -#: ../../../src/SDLInputState.cpp:583 +msgstr "Backspace" + +#: ../../../src/SDLInputState.cpp:674 msgid "CapsLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:586 -msgid "End" -msgstr "" - -#: ../../../src/SDLInputState.cpp:587 +msgstr "CapsLock" + +#: ../../../src/SDLInputState.cpp:678 msgid "Escape" -msgstr "" - -#: ../../../src/SDLInputState.cpp:588 -msgid "Home" -msgstr "" - -#: ../../../src/SDLInputState.cpp:589 +msgstr "Escape" + +#: ../../../src/SDLInputState.cpp:680 msgid "Insert" -msgstr "" - -#: ../../../src/SDLInputState.cpp:590 +msgstr "Insert" + +#: ../../../src/SDLInputState.cpp:681 msgid "Left Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:591 +msgstr "左Alt" + +#: ../../../src/SDLInputState.cpp:682 msgid "Left Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:593 +msgstr "左Ctrl" + +#: ../../../src/SDLInputState.cpp:684 msgid "Left Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:594 +msgstr "左Shift" + +#: ../../../src/SDLInputState.cpp:685 msgid "NumLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:595 +msgstr "NumLock" + +#: ../../../src/SDLInputState.cpp:686 msgid "PageDown" -msgstr "" - -#: ../../../src/SDLInputState.cpp:596 +msgstr "PageDown" + +#: ../../../src/SDLInputState.cpp:687 msgid "PageUp" -msgstr "" - -#: ../../../src/SDLInputState.cpp:597 -msgid "Pause" -msgstr "" - -#: ../../../src/SDLInputState.cpp:598 +msgstr "PageUp" + +#: ../../../src/SDLInputState.cpp:689 msgid "PrintScreen" -msgstr "" - -#: ../../../src/SDLInputState.cpp:599 +msgstr "PrintScreen" + +#: ../../../src/SDLInputState.cpp:690 msgid "Right Alt" -msgstr "" - -#: ../../../src/SDLInputState.cpp:600 +msgstr "右Alt" + +#: ../../../src/SDLInputState.cpp:691 msgid "Right Ctrl" -msgstr "" - -#: ../../../src/SDLInputState.cpp:601 +msgstr "右Ctrl" + +#: ../../../src/SDLInputState.cpp:692 msgid "Return" -msgstr "" - -#: ../../../src/SDLInputState.cpp:603 +msgstr "Return" + +#: ../../../src/SDLInputState.cpp:694 msgid "Right Shift" -msgstr "" - -#: ../../../src/SDLInputState.cpp:604 +msgstr "右Shift" + +#: ../../../src/SDLInputState.cpp:695 msgid "ScrollLock" -msgstr "" - -#: ../../../src/SDLInputState.cpp:605 +msgstr "ScrollLock" + +#: ../../../src/SDLInputState.cpp:696 msgid "Space" -msgstr "" - -#: ../../../src/SDLInputState.cpp:606 -msgid "Tab" -msgstr "" - -#: ../../../src/SDLInputState.cpp:620 +msgstr "Space" + +#: ../../../src/SDLInputState.cpp:710 +#, c-format +msgid "M%d" +msgstr "M%d" + +#: ../../../src/SDLInputState.cpp:716 #, c-format msgid "Mouse %d" -msgstr "" - -#: ../../../src/SDLInputState.cpp:628 +msgstr "鼠标 %d" + +#: ../../../src/SDLInputState.cpp:726 +#, c-format +msgid "JX%d-" +msgstr "JX%d-" + +#: ../../../src/SDLInputState.cpp:728 #, c-format msgid "Axis %d -" -msgstr "" - -#: ../../../src/SDLInputState.cpp:630 +msgstr "摇杆轴 %d-" + +#: ../../../src/SDLInputState.cpp:732 +#, c-format +msgid "JX%d+" +msgstr "JX%d+" + +#: ../../../src/SDLInputState.cpp:734 #, c-format msgid "Axis %d +" -msgstr "" - -#: ../../../src/SDLInputState.cpp:633 +msgstr "摇杆轴 %d+" + +#: ../../../src/SDLInputState.cpp:739 +#, c-format +msgid "JB%d" +msgstr "JB%d" + +#: ../../../src/SDLInputState.cpp:741 #, c-format msgid "Button %d" -msgstr "" - -#: ../../../src/SDLInputState.cpp:637 -msgid "(none)" -msgstr "" - -#: ../../../src/SDLInputState.cpp:677 +msgstr "按钮 %d" + +#: ../../../src/SDLInputState.cpp:787 msgid "Touch control D-Pad" -msgstr "" - -#: ../../../src/SDLInputState.cpp:701 +msgstr "触摸控制D-Pad" + +#: ../../../src/SDLInputState.cpp:810 msgid "Touch control buttons" -msgstr "" - -#: ../../../src/SDLInputState.cpp:716 +msgstr "触摸控制按钮" + +#: ../../../src/SDLInputState.cpp:824 msgid "Tap" -msgstr "" - -#: ../../../src/SDLInputState.cpp:760 ../../../src/SDLInputState.cpp:764 -#: ../../../src/SDLInputState.cpp:768 +msgstr "点按" + +#: ../../../src/SDLInputState.cpp:876 ../../../src/SDLInputState.cpp:878 +#, c-format +msgid "Can not bind: %s" +msgstr "无法绑定 %s" + +#: ../../../src/SDLInputState.cpp:890 ../../../src/SDLInputState.cpp:894 +#: ../../../src/SDLInputState.cpp:898 #, c-format msgid "'%s' is no longer bound to:" -msgstr "" +msgstr "‘%s’不再绑定到:" #: ../../../src/Stats.cpp:38 msgid "Max HP" -msgstr "" +msgstr "最大HP" #: ../../../src/Stats.cpp:39 msgid "Total amount of HP." -msgstr "" +msgstr "HP总量。" #: ../../../src/Stats.cpp:43 msgid "HP Regen" -msgstr "" +msgstr "HP恢复" #: ../../../src/Stats.cpp:44 msgid "Ticks of HP regen per minute." -msgstr "" +msgstr "每分钟恢复的HP数。" #: ../../../src/Stats.cpp:48 msgid "Max MP" -msgstr "" +msgstr "最大MP" #: ../../../src/Stats.cpp:49 msgid "Total amount of MP." -msgstr "" +msgstr "MP总量。" #: ../../../src/Stats.cpp:53 msgid "MP Regen" -msgstr "" +msgstr "MP恢复" #: ../../../src/Stats.cpp:54 msgid "Ticks of MP regen per minute." -msgstr "" +msgstr "每分钟恢复的MP数。" #: ../../../src/Stats.cpp:58 msgid "Accuracy" -msgstr "" +msgstr "精准度" #: ../../../src/Stats.cpp:59 msgid "" "Accuracy rating. The enemy's Avoidance rating is subtracted from this value " "to calculate your likeliness to land a direct hit." -msgstr "" +msgstr "精准度等级。这个值减去敌人的闪避等级计算为你直接击中敌人的可能性。" #: ../../../src/Stats.cpp:63 msgid "Avoidance" -msgstr "" +msgstr "闪避" #: ../../../src/Stats.cpp:64 msgid "" "Avoidance rating. This value is subtracted from the enemy's Accuracy rating " "to calculate their likeliness to land a direct hit." -msgstr "" +msgstr "闪避等级。敌人的精准度等级减去这个值计算为敌人直接击中你的可能性。" #: ../../../src/Stats.cpp:68 msgid "Absorb Min" -msgstr "" +msgstr "伤害吸收最小值" #: ../../../src/Stats.cpp:69 ../../../src/Stats.cpp:74 msgid "Reduces the amount of damage taken." -msgstr "" +msgstr "减少受到的伤害数量。" #: ../../../src/Stats.cpp:73 msgid "Absorb Max" -msgstr "" +msgstr "伤害吸收最大值" #: ../../../src/Stats.cpp:78 msgid "Critical Hit Chance" -msgstr "" +msgstr "致命一击几率" #: ../../../src/Stats.cpp:79 msgid "Chance for an attack to do extra damage." -msgstr "" +msgstr "攻击造成额外伤害的几率。" #: ../../../src/Stats.cpp:83 msgid "Bonus XP" -msgstr "" +msgstr "奖励XP" #: ../../../src/Stats.cpp:84 msgid "Increases the XP gained per kill." -msgstr "" +msgstr "增加每个击杀得到的XP。" #: ../../../src/Stats.cpp:88 #, c-format msgid "Bonus %s" -msgstr "" +msgstr "奖励%s" #: ../../../src/Stats.cpp:89 #, c-format msgid "Increases the %s found per drop." -msgstr "" +msgstr "每次掉落增加%s。" #: ../../../src/Stats.cpp:93 msgid "Item Find Chance" -msgstr "" +msgstr "发现物品的几率" #: ../../../src/Stats.cpp:94 msgid "Increases the chance that an enemy will drop an item." -msgstr "" +msgstr "增加敌人掉落物品的几率。" #: ../../../src/Stats.cpp:98 msgid "Stealth" -msgstr "" +msgstr "潜行" #: ../../../src/Stats.cpp:99 msgid "Increases your ability to move undetected." -msgstr "" +msgstr "增加你不被发现地移动的能力。" #: ../../../src/Stats.cpp:103 msgid "Poise" -msgstr "" +msgstr "平稳" #: ../../../src/Stats.cpp:104 msgid "Reduces your chance of stumbling when hit." -msgstr "" +msgstr "减少你被击中时跌倒的几率。" #: ../../../src/Stats.cpp:108 msgid "Missile Reflect Chance" -msgstr "" +msgstr "投射物反弹几率" #: ../../../src/Stats.cpp:109 msgid "Increases your chance of reflecting missiles back at enemies." -msgstr "" +msgstr "增加你反弹投射物回敌人的几率。" #: ../../../src/Stats.cpp:113 msgid "Damage Reflection" -msgstr "" +msgstr "伤害反弹" #: ../../../src/Stats.cpp:114 msgid "Deals a percentage of damage taken back to the attacker." -msgstr "" +msgstr "返回给攻击者一定比例的伤害。" #: ../../../src/Stats.cpp:118 msgid "HP Steal" -msgstr "" +msgstr "HP偷取" #: ../../../src/Stats.cpp:119 msgid "Percentage of HP stolen per hit." -msgstr "" +msgstr "每次击中偷取的MP百分比。" #: ../../../src/Stats.cpp:123 msgid "MP Steal" -msgstr "" +msgstr "MP偷取" #: ../../../src/Stats.cpp:124 msgid "Percentage of MP stolen per hit." -msgstr "" +msgstr "每次击中偷取的MP百分比。" #: ../../../src/Stats.cpp:128 msgid "Base HP" -msgstr "" +msgstr "基础MP" #: ../../../src/Stats.cpp:133 msgid "Base MP" -msgstr "" - -#: ../../../src/Utils.cpp:346 +msgstr "基础MP" + +#: ../../../src/Utils.cpp:365 msgid "k" -msgstr "" - -#: ../../../src/Utils.cpp:580 +msgstr "k" + +#: ../../../src/Utils.cpp:635 #, c-format msgid "%s second" -msgstr "" - -#: ../../../src/Utils.cpp:583 +msgstr "%s秒" + +#: ../../../src/Utils.cpp:638 #, c-format msgid "%s seconds" -msgstr "" +msgstr "%s秒" #: ../../../src/Version.cpp:139 msgid "or newer" -msgstr "" +msgstr "或更新的" #: ../../../src/Version.cpp:142 msgid "or older" -msgstr "" +msgstr "或更旧的" diff --git a/mods/default/languages/regenerate_po.sh b/mods/default/languages/regenerate_po.sh new file mode 100755 index 0000000..cdc1e27 --- /dev/null +++ b/mods/default/languages/regenerate_po.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# Run this script in the language directory to update the pot and all *.po files + +DO_MERGE=0 +for i in "$@"; do + if [ "$i" == "--do-merge" ]; then + DO_MERGE=1 + fi +done + +# For the engine +# To generate the appropriate .pot file, you need to run the following command from the languages directory: +if [ -e engine.pot ] ; then + echo "Generating engine.pot" + + xgettext --keyword=get -o engine.pot ../../../src/*.cpp + + # xgettext doesn't allow defining a charset, but we want UTF-8 across the board + sed -i "s/charset=CHARSET/charset=UTF-8/" engine.pot + + if [ $DO_MERGE == 1 ]; then + # To update existing .po files, you need to run the following command from the languages directory: + # msgmerge -U -N + + for f in $(ls engine.*.po) ; do + echo "Processing $f" + msgmerge -U -N --backup=none $f engine.pot + done + fi +fi + +if [ -e data.pot ] ; then + echo "Generating data.pot" + + # For mods: + ./xgettext.py + + if [ $DO_MERGE == 1 ]; then + for f in $(ls data.*.po) ; do + echo "Processing $f" + msgmerge -U -N --backup=none $f data.pot + done + fi +fi diff --git a/mods/default/languages/xgettext.py b/mods/default/languages/xgettext.py new file mode 100755 index 0000000..d5753ed --- /dev/null +++ b/mods/default/languages/xgettext.py @@ -0,0 +1,145 @@ +#! /usr/bin/python +import os +import datetime +import codecs # proper UTF8 handling with files + +keys = [] +comments = [] +now = datetime.datetime.now() +header = r'''# Copyright (C) 2011 Clint Bellanger +# This file is distributed under the same license as the FLARE package. +# +# FIRST AUTHOR , YEAR. +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: {now}\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +''' + +POT_STRING = u'''\ +#: {comment} +msgid "{msgid}" +msgstr "" + +''' + +# this extracts translatable strings from the flare data file +def extract(filename): + if not os.path.exists(filename): + return + infile = codecs.open(filename, encoding='UTF-8', mode='r') + triggers = [ + 'msg', 'him', 'her', 'you', 'name', 'title', 'tooltip', + 'power_desc', 'quest_text', 'description', + 'tab_title', 'currency_name', 'flavor', 'topic', 'option', + 'caption', 'text', 'name_min', 'name_max' + ] + plain_text = [ + 'msg', 'him', 'her', 'you', 'name', 'title', 'tooltip', + 'quest_text', 'description', 'topic', 'flavor', 'caption', 'text' + ] + # The credits cutscenes mostly contain names of people that we don't want to translate. + # However, there are a few strings that we DO want translated, which we define here: + allowed_credits_strings = [ + 'Flare Engine Credits', 'Lead Programmers', 'Programmers', 'Default Art', + 'Translators', 'Distributors', 'Special Thanks', 'For giving constant feedback and testing:', + 'The community at OpenGameArt', 'For Tiled and the Flare map exporter:', + 'Flare Game Credits - fantasycore', 'Lead Visual Artists', 'Visual Artists', 'Composers', + 'Foley Artists', 'Voice Actors', 'Flare Game Credits - empyrean_campaign', + 'Lead Content Designers', 'Flare Game Credits - alpha_demo', 'Content Designers' + ] + for i, line in enumerate(infile, start=1): + for trigger in triggers: + if line.startswith(trigger + '='): + line = line.split('=')[1] + line = line.strip('\n') + values = line.split(',') + # TODO checking length of values isn't reliable, check trigger too? + if (trigger in plain_text): + stat = line.replace("\"", "\\\""); + elif len(values) == 1: + # {key}={value} + stat, = values + elif len(values) == 2: + # bonus={stat},{value} + stat, value = values + elif len(values) == 3: + # bonus={set_level},{stat},{value} + set_level, stat, value = values + elif len(values) == 5: + # option=base,head,portrait,name + stat = values[-1] + + test_key = stat.rstrip() + if test_key == "": + continue + if filename.endswith('cutscenes/credits.txt') and test_key not in allowed_credits_strings: + continue + + comment = filename + ':' + str(i) + comments.append(comment) + keys.append(test_key) + +# this removes duplicates from keys in a clean way (without screwing up the order) +def remove_duplicates(): + global comments + global keys + tmp = [] + tmp_c = [] + for node_c,node in zip(comments,keys): + if node not in tmp: + tmp_c.append(node_c) + tmp.append(node) + comments = tmp_c + keys = tmp + +# this writes the list of keys to a gettext .po file +def save(filename): + outfile = codecs.open('data.pot', encoding='UTF-8', mode='w') + outfile.write(header.format(now=now.strftime('%Y-%m-%d %H:%M+%z'))) + remove_duplicates() + for line_c,line in zip(comments,keys): + outfile.write(POT_STRING.format(comment=line_c, msgid=line)) + +# HERE'S THE MAIN EXECUTION +extract('../items/items.txt') +extract('../items/types.txt') +extract('../items/sets.txt') +extract('../items/qualities.txt') +extract('../menus/powers.txt') +extract('../powers/effects.txt') +extract('../powers/powers.txt') +extract('../engine/elements.txt') +extract('../engine/loot.txt') +extract('../engine/classes.txt') +extract('../engine/hero_options.txt') +extract('../engine/titles.txt') +extract('../engine/equip_flags.txt') +extract('../engine/primary_stats.txt') +extract('../engine/damage_types.txt') +extract('../soundfx/subtitles.txt') + +for folder in ['enemies', 'maps', 'quests', 'npcs', 'cutscenes', 'books', 'items', 'powers', 'scripts']: + target = os.path.join('..', folder) + if os.path.isdir(target): + for filename in sorted(os.listdir(target)): + subfolder = os.path.join(target, filename) + if os.path.isdir(subfolder): + for root, dirs, files in os.walk(subfolder): + for f in files: + f = os.path.join(root, f) + if os.path.isfile(f): + extract(f) + elif os.path.isfile(subfolder): + extract(subfolder) + +save('data.pot') diff --git a/mods/default/menus/config.txt b/mods/default/menus/config.txt index 8bb3f95..3a6b452 100644 --- a/mods/default/menus/config.txt +++ b/mods/default/menus/config.txt @@ -9,81 +9,12 @@ listbox_scrollbar_offset=2 -[video] -renderer=104,16,32,32 -fullscreen=568,36,584,32 -hwsurface=568,68,584,64 -vsync=568,100,584,96 -texture_filter=568,132,584,128 -dpi_scaling=568,164,584,160 -parallax_layers=568,196,584,192 -change_gamma=568,228,584,224 -gamma=368,264,384,256 - -[audio] -music_volume=368,40,384,32 -sound_volume=368,72,384,64 - -[interface] -language=104,16,32,32 -show_fps=568,36,584,32 -colorblind=568,68,584,64 -hardware_cursor=568,100,584,96 -dev_mode=568,132,584,128 -subtitles=568,164,584,160 - -[input] -joystick_device=104,16,32,32 -enable_joystick=568,36,584,32 -mouse_move=568,68,584,64 -mouse_aim=568,100,584,96 -no_mouse=568,132,584,128 -mouse_move_swap=568,164,584,160 -mouse_move_attack=568,196,584,192 -joystick_deadzone=368,232,384,224 - -[key_bindings] - # scrollpane values are positions x, y and sizes width, height -scrollpane=0,4,600,320 -# scrollpane_contents is the height of the scrollpane's internal area -scrollpane_contents=940 - -keybinds_bg_color=26,26,26 -cancel=120,14,138,10 -accept=120,44,138,40 -up=120,74,138,70 -down=120,104,138,100 -left=120,134,138,130 -right=120,164,138,160 -bar1=120,194,138,190 -bar2=120,224,138,220 - -bar3=120,254,138,250 -bar4=120,284,138,280 -bar5=120,314,138,310 -bar6=120,344,138,340 -bar7=120,374,138,370 -bar8=120,404,138,400 -bar9=120,434,138,430 -bar0=120,464,138,460 - -main1=120,494,138,490 -main2=120,524,138,520 -character=120,554,138,550 -inventory=120,584,138,580 -powers=120,614,138,610 -log=120,644,138,640 -ctrl=120,674,138,670 -shift=120,704,138,700 -alt=120,734,138,730 -delete=120,764,138,760 -actionbar=120,794,138,790 -actionbar_back=120,824,138,820 -actionbar_forward=120,854,138,850 -actionbar_use=120,884,138,880 -developer_menu=120,914,138,910 -secondary_offset=145,0 +# scrollpane=0,4,600,320 +scrollpane=-6,-6,616,344 +scrollpane_padding=80,40 +# scrollpane_bg_color=26,26,26,127 +scrollpane_separator_color=63,63,63 [mods] activemods=456,16,384,32 diff --git a/mods/default/menus/movement_type.txt b/mods/default/menus/movement_type.txt new file mode 100644 index 0000000..3a859b9 --- /dev/null +++ b/mods/default/menus/movement_type.txt @@ -0,0 +1,15 @@ +# Configuration for the "Select a Movement Type" dialog + +pos=0,0,480,192 +align=center + +label_title=240,8,center,top +label_config_hint=240,28,center,top + +button_keyboard=19,144 +button_mouse=169,144 +button_joystick=319,144 + +icon_keyboard=58,64 +icon_mouse=208,64 +icon_joystick=358,64 diff --git a/package_osx.sh b/package_osx.sh index 47394eb..c168fc7 100755 --- a/package_osx.sh +++ b/package_osx.sh @@ -1,18 +1,36 @@ #!/usr/bin/env bash -e FLARE_EXE=$1 +FLARE_DEPS_SRC="http" +FLARE_GAME="" -if [ -z "$FLARE_EXE" ]; then +if [ -z "${FLARE_EXE}" ]; then echo "usage: $0 " exit 1 fi if [ ! -f ${FLARE_EXE} ]; then - echo "no Flare executable found at $FLARE_EXE. Please follow README in order to build Flare engine first" + echo "no Flare executable found at ${FLARE_EXE}. Please follow README in order to build Flare engine first" exit 1 fi if [ `otool -L ${FLARE_EXE} | egrep libSDL2 | wc -l` -lt 1 ]; then echo "invalid Flare executable" exit 1 +fi + +if [ "$2" != "" ]; then + FLARE_DEPS_SRC=$2 +fi +if [ ${FLARE_DEPS_SRC} == "http" ]; then + echo "download dependencies from website" +elif [ ${FLARE_DEPS_SRC} == "homebrew" ]; then + echo "copy dependencies from homebrew" +else + echo "usage: $0 " + exit 1 +fi + +if [ "$3" != "" ]; then + FLARE_GAME=$3 fi DST=/tmp/___flare.build @@ -25,10 +43,67 @@ ${FLARE_EXE} \ mods ${DST} -#feel free to build dependencies by yourself btw -wget 'http://files.ruads.org/flare_osx_dependencies.tar.gz' -P ${DST} -tar -zxf ${DST}/flare_osx_dependencies.tar.gz -C ${DST} -rm -f ${DST}/flare_osx_dependencies.tar.gz +if [ ${FLARE_DEPS_SRC} == "http" ]; then + #feel free to build dependencies by yourself btw + wget 'http://files.ruads.org/flare_osx_dependencies.tar.gz' -P ${DST} + tar -zxf ${DST}/flare_osx_dependencies.tar.gz -C ${DST} + rm -f ${DST}/flare_osx_dependencies.tar.gz +elif [ ${FLARE_DEPS_SRC} == "homebrew" ]; then + LIB=${DST}/lib + mkdir ${LIB} + # SDL2 + cp /usr/local/opt/sdl2/COPYING.txt ${LIB}/SDL2-COPYING.txt + cp /usr/local/opt/sdl2/README.txt ${LIB}/SDL2-README.txt + cp /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib ${LIB} + cp /usr/local/opt/sdl2_image/lib/libSDL2_image-2.0.0.dylib ${LIB} + cp /usr/local/opt/sdl2_mixer/lib/libSDL2_mixer-2.0.0.dylib ${LIB} + cp /usr/local/opt/sdl2_ttf/lib/libSDL2_ttf-2.0.0.dylib ${LIB} + # VORBIS + cp /usr/local/opt/libvorbis/COPYING ${LIB}/VORBIS-COPYING + cp /usr/local/opt/libvorbis/lib/libvorbis.0.dylib ${LIB} + cp /usr/local/opt/libvorbis/lib/libvorbisenc.2.dylib ${LIB} + cp /usr/local/opt/libvorbis/lib/libvorbisfile.3.dylib ${LIB} + # OGG + cp /usr/local/opt/libogg/COPYING ${LIB}/OGG-COPYING + cp /usr/local/opt/libogg/lib/libogg.0.dylib ${LIB} + # PNG + cp /usr/local/opt/libpng/lib/libpng16.16.dylib ${LIB} + + # Verify all homebrew deps using using otool + for DYLIB in ${LIB}/*.dylib; do + #echo "dylib: ${DYLIB}" + for LINE in $(otool -L ${DYLIB}); do + #echo "line: ${LINE}" + if [[ $LINE == *"/usr/local/opt/"* ]]; then + NEED=$(basename ${LINE}) + #echo "${DYLIB} need: ${NEED}" + FILE="${LIB}/${NEED}" + if [ ! -f "${FILE}" ]; then + echo "${NEED} not found, copying" + cp ${LINE} ${LIB} + fi + fi + done + done + +else + echo "'${FLARE_DEPS_SRC}' unknown dependency source" + exit 1 +fi + +if [ "${FLARE_GAME}" != "" ]; then + FLARE_ENGINE_MOD_LIST=mods/mods.txt + FLARE_GAME_MOD=${FLARE_GAME}/mods + while IFS= read -r MOD; do + MOD_DIR=${FLARE_GAME_MOD}/${MOD} + if [ "${MOD}" != "" ] && [ -d "${MOD_DIR}" ]; then + cp -r ${MOD_DIR} ${DST}/mods + echo "copied ${MOD}" + fi + done < "${FLARE_ENGINE_MOD_LIST}" + cp ${FLARE_GAME}/CREDITS.txt ${DST} + cp ${FLARE_GAME}/LICENSE.txt ${DST} +fi echo '#!/bin/sh' >> ${DST}/start.sh echo 'cd "$(dirname "${BASH_SOURCE[0]}")"' >> ${DST}/start.sh diff --git a/qt.xml b/qt.xml new file mode 100644 index 0000000..c18f70c --- /dev/null +++ b/qt.xml @@ -0,0 +1,35 @@ + + + + + + CodeStyleData + + false + false + true + false + true + false + false + false + true + true + false + true + false + false + false + 4 + true + false + 2 + false + 4 + + + + DisplayName + Flare + + diff --git a/regenerate_wiki_attributepage.sh b/regenerate_wiki_attributepage.sh new file mode 100755 index 0000000..cf4dc63 --- /dev/null +++ b/regenerate_wiki_attributepage.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +SOURCE=./docs/gen/attribute-reference.md +DESTINATION=./Attribute-Reference.md + +cp ${SOURCE} ${DESTINATION} +./extract_xml.sh | xsltproc wiki.xslt - | sed -e '1,3d' >> ${DESTINATION} + +echo "Created ${DESTINATION}" +echo "Now move it to the wiki." diff --git a/src/Animation.cpp b/src/Animation.cpp index f3d1cc3..b7206b3 100644 --- a/src/Animation.cpp +++ b/src/Animation.cpp @@ -31,7 +31,7 @@ #include "Animation.h" #include "RenderDevice.h" -Animation::Animation(const std::string &_name, const std::string &_type, Image *_sprite, uint8_t _blend_mode, uint8_t _alpha_mod, Color _color_mod) +Animation::Animation(const std::string &_name, const std::string &_type, AnimationMedia *_sprite, uint8_t _blend_mode, uint8_t _alpha_mod, Color _color_mod) : name(_name) , type( _type == "play_once" ? ANIMTYPE_PLAY_ONCE : _type == "back_forth" ? ANIMTYPE_BACK_FORTH : @@ -67,10 +67,12 @@ for (unsigned short i = 0 ; i < _frames; i++) { int base_index = max_kinds*i; for (unsigned short kind = 0 ; kind < max_kinds; kind++) { - gfx[base_index + kind].x = _render_size.x * (_position + i); - gfx[base_index + kind].y = _render_size.y * kind; - gfx[base_index + kind].w = _render_size.x; - gfx[base_index + kind].h = _render_size.y; + // TODO handle multiple images for uncompressed animation defintions + gfx[base_index + kind].first = sprite->getImageFromKey(""); + gfx[base_index + kind].second.x = _render_size.x * (_position + i); + gfx[base_index + kind].second.y = _render_size.y * kind; + gfx[base_index + kind].second.w = _render_size.x; + gfx[base_index + kind].second.h = _render_size.y; render_offset[base_index + kind].x = _render_offset.x; render_offset[base_index + kind].y = _render_offset.y; } @@ -148,7 +150,7 @@ render_offset.resize(i); } -void Animation::addFrame(unsigned short index, unsigned short kind, const Rect& rect, const Point& _render_offset) { +void Animation::addFrame(unsigned short index, unsigned short kind, const Rect& rect, const Point& _render_offset, const std::string& key) { if (index >= gfx.size()/max_kinds) { Utils::logError("Animation: Animation(%s) adding rect(%d, %d, %d, %d) to frame index(%u) out of bounds. must be in [0, %d]", @@ -162,7 +164,8 @@ } unsigned i = max_kinds*index+kind; - gfx[i] = rect; + gfx[i].first = sprite->getImageFromKey(key); + gfx[i].second = rect; render_offset[i] = _render_offset; } @@ -234,13 +237,13 @@ Renderable r; if (!frames.empty()) { const int index = (max_kinds*frames[cur_frame_index]) + kind; - r.src.x = gfx[index].x; - r.src.y = gfx[index].y; - r.src.w = gfx[index].w; - r.src.h = gfx[index].h; + r.src.x = gfx[index].second.x; + r.src.y = gfx[index].second.y; + r.src.w = gfx[index].second.w; + r.src.h = gfx[index].second.h; r.offset.x = render_offset[index].x; r.offset.y = render_offset[index].y; - r.image = sprite; + r.image = gfx[index].first; r.blend_mode = blend_mode; r.color_mod = color_mod; r.alpha_mod = alpha_mod; @@ -311,7 +314,7 @@ } bool Animation::isFirstFrame() { - return cur_frame_index == 0; + return cur_frame_index == 0 && static_cast(cur_frame_index) == cur_frame_index_f; } bool Animation::isLastFrame() { @@ -325,11 +328,11 @@ bool Animation::isActiveFrame() { if (type == ANIMTYPE_BACK_FORTH) { if (std::find(active_frames.begin(), active_frames.end(), elapsed_frames) != active_frames.end()) - return cur_frame_index == getLastFrameIndex(cur_frame); + return cur_frame_index == getLastFrameIndex(cur_frame) && static_cast(cur_frame_index) == cur_frame_index_f; } else { if (std::find(active_frames.begin(), active_frames.end(), cur_frame) != active_frames.end()) { - if (cur_frame_index == getLastFrameIndex(cur_frame)) { + if (cur_frame_index == getLastFrameIndex(cur_frame) && static_cast(cur_frame_index) == cur_frame_index_f) { if (type == ANIMTYPE_PLAY_ONCE) active_frame_triggered = true; diff --git a/src/Animation.h b/src/Animation.h index 2ea3a30..cc01156 100644 --- a/src/Animation.h +++ b/src/Animation.h @@ -33,6 +33,7 @@ #include "CommonIncludes.h" #include "Utils.h" +#include "AnimationMedia.h" class Animation { protected: @@ -40,7 +41,7 @@ const std::string name; const int type; - Image *sprite; + AnimationMedia *sprite; uint8_t blend_mode; uint8_t alpha_mod; Color color_mod; @@ -63,7 +64,7 @@ // Frame data, all vectors must have the same length: // These are indexed as 8*cur_frame_index + direction. - std::vector gfx; // position on the spritesheet to be used. + std::vector > gfx; // position on the spritesheet to be used. std::vector render_offset; // "virtual point on the floor" std::vector frames; // a list of frames to play on each tick @@ -86,7 +87,7 @@ }; public: - Animation(const std::string &_name, const std::string &_type, Image *_sprite, uint8_t _blend_mode, uint8_t _alpha_mod, Color _color_mod); + Animation(const std::string &_name, const std::string &_type, AnimationMedia *_sprite, uint8_t _blend_mode, uint8_t _alpha_mod, Color _color_mod); // Traditional way to create an animation. // The frames are stored in a grid like fashion, so the individual frame @@ -101,7 +102,7 @@ void setup(unsigned short _frames, unsigned short _duration, unsigned short _maxkinds = 8); // kind can be used for direction(enemies, hero) or randomness(powers) - void addFrame(unsigned short index, unsigned short kind, const Rect& rect, const Point& _render_offset); + void addFrame(unsigned short index, unsigned short kind, const Rect& rect, const Point& _render_offset, const std::string &key); // advance the animation one frame void advanceFrame(); diff --git a/src/AnimationMedia.cpp b/src/AnimationMedia.cpp new file mode 100644 index 0000000..da51cd3 --- /dev/null +++ b/src/AnimationMedia.cpp @@ -0,0 +1,67 @@ +/* +Copyright © 2020 bloodhero +Copyright © 2020 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +#include "AnimationMedia.h" +#include "RenderDevice.h" +#include "SharedResources.h" + +AnimationMedia::AnimationMedia() + : first_key("") { +} + +AnimationMedia::~AnimationMedia() { +} + +void AnimationMedia::loadImage(std::string path, std::string key) { + Image* loaded_img = render_device->loadImage(path, RenderDevice::ERROR_NORMAL); + if (!loaded_img) + return; + + if (sprites.find(key) == sprites.end()) { + sprites[key] = loaded_img; + } + else { + sprites[key]->unref(); + sprites[key] = loaded_img; + } + + if (sprites.size() == 1) { + first_key = key; + } +} + +Image* AnimationMedia::getImageFromKey(std::string key) { + std::map::iterator it = sprites.find(key); + if (it != sprites.end()) { + return it->second; + } + else if (!sprites.empty()) { + return sprites[first_key]; + } + + return NULL; +} + +void AnimationMedia::unref() { + std::map::iterator it; + for (it = sprites.begin(); it != sprites.end(); it++) { + it->second->unref(); + } + sprites.clear(); +} + diff --git a/src/AnimationMedia.h b/src/AnimationMedia.h new file mode 100644 index 0000000..28e69cd --- /dev/null +++ b/src/AnimationMedia.h @@ -0,0 +1,37 @@ +/* +Copyright © 2020 bloodhero +Copyright © 2020 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +#ifndef ANIMATION_MEDIA_H +#define ANIMATION_MEDIA_H + +#include "CommonIncludes.h" + +class AnimationMedia { +private: + std::map sprites; + std::string first_key; + +public: + AnimationMedia(); + ~AnimationMedia(); + void loadImage(std::string path, std::string key); + Image* getImageFromKey(std::string key); + void unref(); +}; + +#endif diff --git a/src/AnimationSet.cpp b/src/AnimationSet.cpp index d48254b..a8f207c 100644 --- a/src/AnimationSet.cpp +++ b/src/AnimationSet.cpp @@ -57,9 +57,9 @@ : name(animationname) , loaded(false) , parent(NULL) - , animations() - , sprite(NULL) { - defaultAnimation = new Animation("default", "play_once", NULL, Renderable::BLEND_NORMAL, 255, Color(255,255,255)); + , animations() { + sprite = new AnimationMedia(); + defaultAnimation = new Animation("default", "play_once", sprite, Renderable::BLEND_NORMAL, 255, Color(255,255,255)); defaultAnimation->setupUncompressed(Point(), Point(), 0, 1, 0); } @@ -69,7 +69,7 @@ FileParser parser; // @CLASS AnimationSet|Description of animations in animations/ - if (!parser.open(name, FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) + if (name.empty() || !parser.open(name, FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) return; std::string _name = ""; @@ -111,15 +111,10 @@ } if (parser.section.empty()) { if (parser.key == "image") { - // @ATTR image|filename|Filename of sprite-sheet image. - if (sprite != NULL) { - parser.error("AnimationSet: Multiple images specified. Dragons be here!"); - Utils::logErrorDialog("AnimationSet: Multiple images specified. Dragons be here!"); - mods->resetModConfig(); - Utils::Exit(128); - } - - sprite = render_device->loadImage(parser.val, RenderDevice::ERROR_NORMAL); + // @ATTR image|filename, string : Filename, ID|Filename of sprite-sheet image along with an identifier string. The identifier string may be omitted if there is only a single image. + std::string img_filename = Parse::popFirstString(parser.val); + std::string img_id = Parse::popFirstString(parser.val); + sprite->loadImage(img_filename, img_id); } else if (parser.key == "render_size") { // @ATTR render_size|int, int : Width, Height|Width and height of animation. @@ -192,7 +187,7 @@ } } else if (parser.key == "frame") { - // @ATTR animation.frame|int, int, int, int, int, int, int, int : Index, Direction, X, Y, Width, Height, X offset, Y offset|A single frame of a compressed animation. + // @ATTR animation.frame|int, int, int, int, int, int, int, int, string: Index, Direction, X, Y, Width, Height, X offset, Y offset, Image ID|A single frame of a compressed animation. The image ID may be omitted, in which case the first available image will be used. if (compressed_loading == false) { // first frame statement in section newanim = new Animation(_name, type, sprite, blend_mode, alpha_mod, color_mod); newanim->setup(frames, duration); @@ -202,7 +197,7 @@ animations.push_back(newanim); compressed_loading = true; } - // frame = index, direction, x, y, w, h, offsetx, offsety + // frame = index, direction, x, y, w, h, offsetx, offsety, image Rect r; Point offset; const unsigned short index = static_cast(Parse::popFirstInt(parser.val)); @@ -213,7 +208,8 @@ r.h = Parse::popFirstInt(parser.val); offset.x = Parse::popFirstInt(parser.val); offset.y = Parse::popFirstInt(parser.val); - newanim->addFrame(index, direction, r, offset); + std::string key = parser.val; + newanim->addFrame(index, direction, r, offset, key); } else { parser.error("AnimationSet: '%s' is not a valid key.", parser.key.c_str()); @@ -250,5 +246,6 @@ for (unsigned i = 0; i < animations.size(); ++i) delete animations[i]; delete defaultAnimation; -} - + delete sprite; +} + diff --git a/src/AnimationSet.h b/src/AnimationSet.h index 3b9f115..69c2cd7 100644 --- a/src/AnimationSet.h +++ b/src/AnimationSet.h @@ -21,6 +21,7 @@ #define ANIMATION_SET_H #include "CommonIncludes.h" +#include "AnimationMedia.h" class Animation; @@ -45,7 +46,7 @@ std::vector animations; - Image *sprite; + AnimationMedia *sprite; explicit AnimationSet(const std::string &animationname); AnimationSet(const AnimationSet &a); // copy constructor not implemented. diff --git a/src/Avatar.cpp b/src/Avatar.cpp index 79f7dd3..e59013b 100644 --- a/src/Avatar.cpp +++ b/src/Avatar.cpp @@ -32,14 +32,15 @@ #include "CommonIncludes.h" #include "CursorManager.h" #include "EnemyGroupManager.h" -#include "Enemy.h" -#include "EnemyManager.h" +#include "Entity.h" +#include "EntityManager.h" #include "EngineSettings.h" #include "FileParser.h" #include "InputState.h" #include "MapRenderer.h" #include "MenuActionBar.h" #include "MenuExit.h" +#include "MenuGameOver.h" #include "MenuManager.h" #include "MessageEngine.h" #include "ModManager.h" @@ -70,7 +71,10 @@ , time_played(0) , questlog_dismissed(false) , using_main1(false) - , using_main2(false) { + , using_main2(false) + , prev_hp(0) + , playing_lowhp(false) + , teleport_camera_lock(false) { init(); @@ -123,7 +127,7 @@ // other init sprites = 0; - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; if (mapr->hero_pos_enabled) { stats.pos.x = mapr->hero_pos.x; stats.pos.y = mapr->hero_pos.y; @@ -156,25 +160,26 @@ revertPowers = false; last_transform = ""; + power_cooldown_timers.clear(); + power_cast_timers.clear(); + // Find untransform power index to use for manual untransfrom ability untransform_power = 0; - for (unsigned id=0; idpowers.size(); id++) { - if (powers->powers[id].spawn_type == "untransform" && powers->powers[id].required_items.empty()) { - untransform_power = id; - break; - } - } - - power_cooldown_timers.clear(); - power_cooldown_timers.resize(powers->powers.size()); - power_cast_timers.clear(); - power_cast_timers.resize(powers->powers.size()); - + std::map::iterator power_it; + for (power_it = powers->powers.begin(); power_it != powers->powers.end(); ++power_it) { + if (untransform_power == 0 && power_it->second.required_items.empty() && power_it->second.spawn_type == "untransform") { + untransform_power = power_it->first; + } + + power_cooldown_timers[power_it->first] = Timer(); + power_cast_timers[power_it->first] = Timer(); + } } void Avatar::handleNewMap() { cursor_enemy = NULL; lock_enemy = NULL; + playing_lowhp = false; } /** @@ -292,7 +297,7 @@ bool Avatar::pressing_move() { - if (!allow_movement) { + if (!allow_movement || teleport_camera_lock) { return false; } else if (stats.effects.knockback_speed != 0) { @@ -310,9 +315,14 @@ } void Avatar::set_direction() { + if (teleport_camera_lock || !set_dir_timer.isEnd()) + return; + + int old_dir = stats.direction; + // handle direction changes if (settings->mouse_move) { - FPoint target = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, stats.pos.x, stats.pos.y); + FPoint target = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, mapr->cam.pos.x, mapr->cam.pos.y); stats.direction = Utils::calcDirection(stats.pos.x, stats.pos.y, target.x, target.y); } else { @@ -330,6 +340,12 @@ (inpt->pressing[Input::LEFT] && !inpt->lock[Input::LEFT]) || (inpt->pressing[Input::RIGHT] && !inpt->lock[Input::RIGHT]))) stats.direction = static_cast((stats.direction == 7) ? 0 : stats.direction + 1); } + + // give direction changing a 100ms cooldown + // this allows the player to quickly change direction on their own without becoming overly "jittery" + // the cooldown can be ended by releasing the move button, but the cooldown is so fast that it doesn't matter much (maybe a speed run tactic?) + if (stats.direction != old_dir) + set_dir_timer.setDuration(settings->max_frames_per_sec / 10); } /** @@ -338,12 +354,15 @@ * - move the avatar based on buttons pressed * - calculate the next frame of animation * - calculate camera position based on avatar position - * - * @param action The actionbar power activated and the target. action.power == 0 means no power. - * @param restrict_power_use Whether or not to allow power usage on mouse1 - * @param npc True if the player is talking to an NPC. Can limit ability to move/attack in certain conditions */ -void Avatar::logic(std::vector &action_queue, bool restrict_power_use) { +void Avatar::logic() { + bool restrict_power_use = false; + if (settings->mouse_move) { + if(inpt->pressing[mm_key] && !inpt->pressing[Input::SHIFT] && !menu->act->isWithinSlots(inpt->mouse) && !menu->act->isWithinMenus(inpt->mouse)) { + restrict_power_use = true; + } + } + // clear current space to allow correct movement mapr->collider.unblock(stats.pos.x, stats.pos.y); @@ -356,35 +375,68 @@ // handle when the player stops blocking if (stats.effects.triggered_block && !stats.blocking) { - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; stats.effects.triggered_block = false; stats.effects.clearTriggerEffects(Power::TRIGGER_BLOCK); stats.refresh_stats = true; + stats.block_power = 0; } stats.logic(); + + // alert on low health + if (isDroppedToLowHp()) { + // show message if set + if (isLowHpMessageEnabled()) { + logMsg(msg->get("Your health is low!"), MSG_NORMAL); + } + // play a sound if set in settings + if (isLowHpSoundEnabled() && !playing_lowhp) { + // if looping, then do not cleanup + snd->play(sound_lowhp, "lowhp", snd->NO_POS, stats.sfx_lowhp_loop, !stats.sfx_lowhp_loop); + playing_lowhp = true; + } + } + // if looping, stop sounds when HP recovered above threshold + if (isLowHpSoundEnabled() && !isLowHp() && playing_lowhp && stats.sfx_lowhp_loop) { + snd->pauseChannel("lowhp"); + playing_lowhp = false; + } + else if (isLowHpSoundEnabled() && isLowHp() && !playing_lowhp && stats.sfx_lowhp_loop) { + snd->play(sound_lowhp, "lowhp", snd->NO_POS, stats.sfx_lowhp_loop, !stats.sfx_lowhp_loop); + playing_lowhp = true; + } + else if (!isLowHpSoundEnabled() && playing_lowhp) { + snd->pauseChannel("lowhp"); + playing_lowhp = false; + } + + // we can not use stats.prev_hp here + prev_hp = stats.hp; // check level up if (stats.level < eset->xp.getMaxLevel() && stats.xp >= eset->xp.getLevelXP(stats.level + 1)) { stats.level_up = true; - stats.level++; - std::stringstream ss; - ss << msg->get("Congratulations, you have reached level %d!", stats.level); - if (stats.level < stats.max_spendable_stat_points) { - ss << " " << msg->get("You may increase one attribute through the Character Menu."); + stats.level = eset->xp.getLevelFromXP(stats.xp); + logMsg(msg->get("Congratulations, you have reached level %d!", stats.level), MSG_NORMAL); + if (pc->stats.stat_points_per_level > 0) { + logMsg(msg->get("You may increase one or more attributes through the Character Menu."), MSG_NORMAL); newLevelNotification = true; } - logMsg(ss.str(), MSG_NORMAL); + if (pc->stats.power_points_per_level > 0) { + logMsg(msg->get("You may unlock one or more abilities through the Powers Menu."), MSG_NORMAL); + } stats.recalc(); snd->play(sound_levelup, snd->DEFAULT_CHANNEL, snd->NO_POS, !snd->LOOP); // if the player managed to level up while dead (e.g. via a bleeding creature), restore to life - if (stats.cur_state == StatBlock::AVATAR_DEAD) { - stats.cur_state = StatBlock::AVATAR_STANCE; + if (stats.cur_state == StatBlock::ENTITY_DEAD) { + stats.cur_state = StatBlock::ENTITY_STANCE; } } // assist mouse movement + mm_key = settings->mouse_move_swap ? Input::MAIN2 : Input::MAIN1; if (!inpt->pressing[mm_key]) { drag_walking = false; } @@ -408,7 +460,7 @@ transform_map = mapr->getFilename(); } - int mm_attack_id = (settings->mouse_move_swap ? menu->act->getSlotPower(MenuActionBar::SLOT_MAIN2) : menu->act->getSlotPower(MenuActionBar::SLOT_MAIN1)); + PowerID mm_attack_id = (settings->mouse_move_swap ? menu->act->getSlotPower(MenuActionBar::SLOT_MAIN2) : menu->act->getSlotPower(MenuActionBar::SLOT_MAIN1)); bool mm_can_use_power = true; if (settings->mouse_move) { @@ -434,12 +486,21 @@ } } + if (teleport_camera_lock && Utils::calcDist(stats.pos, mapr->cam.pos) < 0.5f) { + teleport_camera_lock = false; + } + + set_dir_timer.tick(); + if (!pressing_move()) { + set_dir_timer.reset(Timer::END); + } + if (!stats.effects.stun) { bool allowed_to_move; bool allowed_to_use_power = true; switch(stats.cur_state) { - case StatBlock::AVATAR_STANCE: + case StatBlock::ENTITY_STANCE: setAnimation("stance"); @@ -468,18 +529,18 @@ drag_walking = true; } - stats.cur_state = StatBlock::AVATAR_RUN; - } - } - - if (settings->mouse_move && settings->mouse_move_attack && cursor_enemy && mm_can_use_power && powers->checkCombatRange(mm_attack_id, &stats, cursor_enemy->stats.pos)) { - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_MOVE; + } + } + + if (settings->mouse_move && settings->mouse_move_attack && cursor_enemy && !cursor_enemy->stats.hero_ally && mm_can_use_power && powers->checkCombatRange(mm_attack_id, &stats, cursor_enemy->stats.pos)) { + stats.cur_state = StatBlock::ENTITY_STANCE; lock_enemy = cursor_enemy; } break; - case StatBlock::AVATAR_RUN: + case StatBlock::ENTITY_MOVE: setAnimation("run"); @@ -495,30 +556,30 @@ // handle transition to STANCE if (!pressing_move()) { - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; break; } else if (!move()) { // collide with wall - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; break; } else if (settings->mouse_move && inpt->pressing[Input::SHIFT]) { // when moving with the mouse, pressing Shift should stop movement and begin attacking - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; break; } if (activeAnimation->getName() != "run") - stats.cur_state = StatBlock::AVATAR_STANCE; - - if (settings->mouse_move && settings->mouse_move_attack && cursor_enemy && mm_can_use_power && powers->checkCombatRange(mm_attack_id, &stats, cursor_enemy->stats.pos)) { - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; + + if (settings->mouse_move && settings->mouse_move_attack && cursor_enemy && !cursor_enemy->stats.hero_ally && mm_can_use_power && powers->checkCombatRange(mm_attack_id, &stats, cursor_enemy->stats.pos)) { + stats.cur_state = StatBlock::ENTITY_STANCE; lock_enemy = cursor_enemy; } break; - case StatBlock::AVATAR_ATTACK: + case StatBlock::ENTITY_POWER: setAnimation(attack_anim); @@ -529,6 +590,10 @@ if (activeAnimation->isFirstFrame()) { float attack_speed = (stats.effects.getAttackSpeed(attack_anim) * powers->powers[current_power].attack_speed) / 100.0f; activeAnimation->setSpeed(attack_speed); + for (size_t i=0; isetSpeed(attack_speed); + } playAttackSound(attack_anim); power_cast_timers[current_power].setDuration(activeAnimation->getDuration()); } @@ -548,7 +613,7 @@ // animation is done, switch back to normal stance if ((activeAnimation->isLastFrame() && stats.state_timer.isEnd()) || activeAnimation->getName() != attack_anim) { - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; stats.cooldown.reset(Timer::BEGIN); allowed_to_use_power = false; stats.prevent_interrupt = false; @@ -563,7 +628,7 @@ break; - case StatBlock::AVATAR_BLOCK: + case StatBlock::ENTITY_BLOCK: setAnimation("block"); @@ -571,7 +636,7 @@ break; - case StatBlock::AVATAR_HIT: + case StatBlock::ENTITY_HIT: setAnimation("hit"); @@ -585,7 +650,7 @@ } if (activeAnimation->getTimesPlayed() >= 1 || activeAnimation->getName() != "hit") { - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; if (settings->mouse_move) { drag_walking = true; } @@ -593,7 +658,7 @@ break; - case StatBlock::AVATAR_DEAD: + case StatBlock::ENTITY_DEAD: allowed_to_use_power = false; if (stats.effects.triggered_death) break; @@ -607,31 +672,32 @@ if (!stats.corpse && activeAnimation->isFirstFrame() && activeAnimation->getTimesPlayed() < 1) { stats.effects.clearEffects(); + stats.powers_passive.clear(); // reset power cooldowns - for (size_t i = 0; i < power_cooldown_timers.size(); i++) { - power_cooldown_timers[i].reset(Timer::END); - power_cast_timers[i].reset(Timer::END); + std::map::iterator pct_it; + for (pct_it = power_cooldown_timers.begin(); pct_it != power_cooldown_timers.end(); ++pct_it) { + pct_it->second.reset(Timer::END); + power_cast_timers[pct_it->first].reset(Timer::END); } // close menus in GameStatePlay close_menus = true; playSound(Entity::SOUND_DIE); + + logMsg(msg->get("You are defeated."), MSG_NORMAL); if (stats.permadeath) { // ignore death penalty on permadeath and instead delete the player's saved game stats.death_penalty = false; Utils::removeSaveDir(save_load->getGameSlot()); menu->exit->disableSave(); - - logMsg(Utils::substituteVarsInString(msg->get("You are defeated. Game over! ${INPUT_CONTINUE} to exit to Title."), this), MSG_NORMAL); + menu->game_over->disableSave(); } else { // raise the death penalty flag. This is handled in MenuInventory stats.death_penalty = true; - - logMsg(Utils::substituteVarsInString(msg->get("You are defeated. ${INPUT_CONTINUE} to continue."), this), MSG_NORMAL); } // if the player is attacking, we need to block further input @@ -639,16 +705,18 @@ inpt->lock[Input::MAIN1] = true; } - if (activeAnimation->getTimesPlayed() >= 1 || activeAnimation->getName() != "die") { + if (!stats.corpse && (activeAnimation->getTimesPlayed() >= 1 || activeAnimation->getName() != "die")) { stats.corpse = true; + menu->game_over->visible = true; } // allow respawn with Accept if not permadeath - if ((inpt->pressing[Input::ACCEPT] || (settings->touchscreen && inpt->pressing[Input::MAIN1] && !inpt->lock[Input::MAIN1])) && stats.corpse) { - if (inpt->pressing[Input::ACCEPT]) inpt->lock[Input::ACCEPT] = true; - if (settings->touchscreen && inpt->pressing[Input::MAIN1]) inpt->lock[Input::MAIN1] = true; + if (menu->game_over->visible && menu->game_over->continue_clicked) { + menu->game_over->close(); + mapr->teleportation = true; mapr->teleport_mapname = mapr->respawn_map; + if (stats.permadeath) { // set these positions so it doesn't flash before jumping to Title mapr->teleport_destination.x = stats.pos.x; @@ -675,26 +743,27 @@ for (unsigned i=0; ipowers[action.power]; + PowerID power_id = powers->checkReplaceByEffect(action.power, &stats); + const Power &power = powers->powers[power_id]; if (power.type == Power::TYPE_BLOCK) blocking = true; - if (action.power != 0 && (stats.cooldown.isEnd() || action.instant_item)) { + if (power_id != 0 && (stats.cooldown.isEnd() || action.instant_item)) { FPoint target = action.target; // check requirements - if ((stats.cur_state == StatBlock::AVATAR_ATTACK || stats.cur_state == StatBlock::AVATAR_HIT) && !action.instant_item) + if ((stats.cur_state == StatBlock::ENTITY_POWER || stats.cur_state == StatBlock::ENTITY_HIT) && !action.instant_item) continue; - if (!stats.canUsePower(action.power, !StatBlock::CAN_USE_PASSIVE)) + if (!stats.canUsePower(power_id, !StatBlock::CAN_USE_PASSIVE)) continue; if (power.requires_los && !mapr->collider.lineOfSight(stats.pos.x, stats.pos.y, target.x, target.y)) continue; if (power.requires_empty_target && !mapr->collider.isEmpty(target.x, target.y)) continue; - if (!power_cooldown_timers[action.power].isEnd()) + if (!power_cooldown_timers[power_id].isEnd()) continue; - if (!powers->hasValidTarget(action.power, &stats, target)) + if (!powers->hasValidTarget(power_id, &stats, target)) continue; // automatically target the selected enemy with melee attacks @@ -708,7 +777,7 @@ } if (power.new_state != Power::STATE_INSTANT) { - current_power = action.power; + current_power = power_id; act_target = target; attack_anim = power.attack_anim; } @@ -727,18 +796,18 @@ switch (power.new_state) { case Power::STATE_ATTACK: // handle attack powers - stats.cur_state = StatBlock::AVATAR_ATTACK; + stats.cur_state = StatBlock::ENTITY_POWER; break; case Power::STATE_INSTANT: // handle instant powers - powers->activate(action.power, &stats, target); - power_cooldown_timers[action.power].setDuration(power.cooldown); + powers->activate(power_id, &stats, target); + power_cooldown_timers[power_id].setDuration(power.cooldown); break; default: if (power.type == Power::TYPE_BLOCK) { - stats.cur_state = StatBlock::AVATAR_BLOCK; - powers->activate(action.power, &stats, target); + stats.cur_state = StatBlock::ENTITY_BLOCK; + powers->activate(power_id, &stats, target); stats.refresh_stats = true; } break; @@ -746,7 +815,7 @@ // if the player is attacking, show the attack cursor attack_cursor = ( - stats.cur_state == StatBlock::AVATAR_ATTACK && + stats.cur_state == StatBlock::ENTITY_POWER && !power.buff && !power.buff_teleport && power.type != Power::TYPE_TRANSFORM && power.type != Power::TYPE_BLOCK && @@ -761,39 +830,17 @@ } - // calc new cam position from player position - // cam is focused at player position - float cam_dx = (Utils::calcDist(FPoint(mapr->cam.x, stats.pos.y), stats.pos)) / eset->misc.camera_speed; - float cam_dy = (Utils::calcDist(FPoint(stats.pos.x, mapr->cam.y), stats.pos)) / eset->misc.camera_speed; - - if (mapr->cam.x < stats.pos.x) { - mapr->cam.x += cam_dx; - if (mapr->cam.x > stats.pos.x) - mapr->cam.x = stats.pos.x; - } - else if (mapr->cam.x > stats.pos.x) { - mapr->cam.x -= cam_dx; - if (mapr->cam.x < stats.pos.x) - mapr->cam.x = stats.pos.x; - } - if (mapr->cam.y < stats.pos.y) { - mapr->cam.y += cam_dy; - if (mapr->cam.y > stats.pos.y) - mapr->cam.y = stats.pos.y; - } - else if (mapr->cam.y > stats.pos.y) { - mapr->cam.y -= cam_dy; - if (mapr->cam.y < stats.pos.y) - mapr->cam.y = stats.pos.y; - } + // update camera + mapr->cam.setTarget(stats.pos); // check for map events mapr->checkEvents(stats.pos); // decrement all cooldowns - for (unsigned i = 0; i < power_cooldown_timers.size(); i++) { - power_cooldown_timers[i].tick(); - power_cast_timers[i].tick(); + std::map::iterator pct_it; + for (pct_it = power_cooldown_timers.begin(); pct_it != power_cooldown_timers.end(); ++pct_it) { + pct_it->second.tick(); + power_cast_timers[pct_it->first].tick(); } // make the current square solid @@ -802,11 +849,15 @@ if (stats.state_timer.isEnd() && stats.hold_state) stats.hold_state = false; - if (stats.cur_state != StatBlock::AVATAR_ATTACK && stats.charge_speed != 0.0f) + if (stats.cur_state != StatBlock::ENTITY_POWER && stats.charge_speed != 0.0f) stats.charge_speed = 0.0f; } void Avatar::transform() { + // dead players can't transform + if (stats.hp <= 0) + return; + // calling a transform power locks the actionbar, so we unlock it here inpt->unlockActionBar(); @@ -853,7 +904,7 @@ animationSet = anim->getAnimationSet(charmed_stats->animations); delete activeAnimation; activeAnimation = animationSet->getAnimation(""); - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; // base stats for (int i=0; igetAnimationSet("animations/hero.txt"); delete activeAnimation; activeAnimation = animationSet->getAnimation(""); - stats.cur_state = StatBlock::AVATAR_STANCE; + stats.cur_state = StatBlock::ENTITY_STANCE; // This is a bit of a hack. // In order to switch to the stance animation, we can't already be in a stance animation @@ -1015,6 +1066,42 @@ log_msg.push(std::pair(str, type)); } +// isLowHp returns true if health is below set threshold +bool Avatar::isLowHp() { + if (stats.hp == 0) + return false; + float hp_one_perc = static_cast(std::max(stats.get(Stats::HP_MAX), 1)) / 100.0f; + return static_cast(stats.hp)/hp_one_perc < static_cast(settings->low_hp_threshold); +} + +// isDroppedToLowHp returns true only if player hp just dropped below threshold +bool Avatar::isDroppedToLowHp() { + float hp_one_perc = static_cast(std::max(stats.get(Stats::HP_MAX), 1)) / 100.0f; + return static_cast(stats.hp)/hp_one_perc < static_cast(settings->low_hp_threshold) && + static_cast(prev_hp)/hp_one_perc >= static_cast(settings->low_hp_threshold); +} + +bool Avatar::isLowHpMessageEnabled() { + return settings->low_hp_warning_type == settings->LHP_WARN_TEXT || + settings->low_hp_warning_type == settings->LHP_WARN_TEXT_CURSOR || + settings->low_hp_warning_type == settings->LHP_WARN_TEXT_SOUND || + settings->low_hp_warning_type == settings->LHP_WARN_ALL; +} + +bool Avatar::isLowHpSoundEnabled() { + return settings->low_hp_warning_type == settings->LHP_WARN_SOUND || + settings->low_hp_warning_type == settings->LHP_WARN_TEXT_SOUND || + settings->low_hp_warning_type == settings->LHP_WARN_CURSOR_SOUND || + settings->low_hp_warning_type == settings->LHP_WARN_ALL; +} + +bool Avatar::isLowHpCursorEnabled() { + return settings->low_hp_warning_type == settings->LHP_WARN_CURSOR || + settings->low_hp_warning_type == settings->LHP_WARN_TEXT_CURSOR || + settings->low_hp_warning_type == settings->LHP_WARN_CURSOR_SOUND || + settings->low_hp_warning_type == settings->LHP_WARN_ALL; +} + Avatar::~Avatar() { if (stats.transformed && charmed_stats && charmed_stats->animations != "") { anim->decreaseCount(charmed_stats->animations); diff --git a/src/Avatar.h b/src/Avatar.h index aac7a48..2fd2fc9 100644 --- a/src/Avatar.h +++ b/src/Avatar.h @@ -31,13 +31,12 @@ #include "Entity.h" #include "Utils.h" -class Enemy; class Entity; class StatBlock; class ActionData { public: - int power; + PowerID power; unsigned hotkey; bool instant_item; FPoint target; @@ -82,6 +81,10 @@ int mm_key; // mouse movement key + Timer set_dir_timer; + + bool isDroppedToLowHp(); + protected: virtual void resetActiveAnimation(); @@ -105,7 +108,7 @@ void loadGraphics(std::vector _img_gfx); void loadStepFX(const std::string& stepname); - void logic(std::vector &action_queue, bool restrict_power_use); + void logic(); // transformation handling bool isTransforming() { @@ -117,6 +120,11 @@ void logMsg(const std::string& str, int type); + bool isLowHp(); + bool isLowHpMessageEnabled(); + bool isLowHpSoundEnabled(); + bool isLowHpCursorEnabled(); + std::vector layer_reference_order; std::vector > layer_def; @@ -125,28 +133,33 @@ std::string attack_anim; bool setPowers; bool revertPowers; - int untransform_power; + PowerID untransform_power; StatBlock *hero_stats; StatBlock *charmed_stats; FPoint transform_pos; std::string transform_map; // vars - int current_power; + PowerID current_power; FPoint act_target; bool drag_walking; bool newLevelNotification; bool respawn; bool close_menus; bool allow_movement; - std::vector power_cooldown_timers; - std::vector power_cast_timers; - Enemy* cursor_enemy; // enemy selected with the mouse cursor - Enemy* lock_enemy; + std::map power_cooldown_timers; + std::map power_cast_timers; + Entity* cursor_enemy; // enemy selected with the mouse cursor + Entity* lock_enemy; unsigned long time_played; bool questlog_dismissed; bool using_main1; bool using_main2; + int prev_hp; + bool playing_lowhp; + bool teleport_camera_lock; + + std::vector action_queue; }; #endif diff --git a/src/BehaviorAlly.cpp b/src/BehaviorAlly.cpp deleted file mode 100644 index 8960f64..0000000 --- a/src/BehaviorAlly.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* -Copyright © 2013 Ryan Dansie -Copyright © 2014-2015 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -#include "Avatar.h" -#include "BehaviorAlly.h" -#include "Enemy.h" -#include "EnemyManager.h" -#include "EngineSettings.h" -#include "MapRenderer.h" -#include "SharedGameResources.h" -#include "SharedResources.h" -#include "UtilsMath.h" - -const float ALLY_FLEE_DISTANCE = 2; -const float ALLY_FOLLOW_DISTANCE_WALK = 5.5; -const float ALLY_FOLLOW_DISTANCE_STOP = 5; -const float ALLY_TELEPORT_DISTANCE = 40; - -const unsigned short BLOCK_TICKS = 10; - -BehaviorAlly::BehaviorAlly(Enemy *_e) : BehaviorStandard(_e) { -} - -BehaviorAlly::~BehaviorAlly() { -} - -void BehaviorAlly::findTarget() { - // dying enemies can't target anything - if (e->stats.cur_state == StatBlock::ENEMY_DEAD || e->stats.cur_state == StatBlock::ENEMY_CRITDEAD) return; - - // stunned minions can't act - if (e->stats.effects.stun) return; - - // check distance and line of sight between minion and hero - if (pc->stats.alive) - hero_dist = Utils::calcDist(e->stats.pos, pc->stats.pos); - else - hero_dist = 0; - - //if the minion gets too far, transport it to the player pos - if(hero_dist > ALLY_TELEPORT_DISTANCE && !e->stats.in_combat) { - mapr->collider.unblock(e->stats.pos.x, e->stats.pos.y); - e->stats.pos.x = pc->stats.pos.x; - e->stats.pos.y = pc->stats.pos.y; - mapr->collider.block(e->stats.pos.x, e->stats.pos.y, MapCollision::IS_ALLY); - hero_dist = 0; - } - - bool enemies_in_combat = false; - //enter combat because enemy is targeting the player or a summon - for (unsigned int i=0; i < enemym->enemies.size(); i++) { - if(enemym->enemies[i]->stats.in_combat && !enemym->enemies[i]->stats.hero_ally && enemym->enemies[i]->stats.hp > 0) { - Enemy* enemy = enemym->enemies[i]; - - //now work out the distance to the enemy and compare it to the distance to the current targer (we want to target the closest enemy) - if(enemies_in_combat) { - float enemy_dist = Utils::calcDist(e->stats.pos, enemy->stats.pos); - if (enemy_dist < target_dist) { - pursue_pos.x = enemy->stats.pos.x; - pursue_pos.y = enemy->stats.pos.y; - target_dist = enemy_dist; - } - } - else { - //minion is not already chasig another enemy so chase this one - pursue_pos.x = enemy->stats.pos.x; - pursue_pos.y = enemy->stats.pos.y; - target_dist = Utils::calcDist(e->stats.pos, enemy->stats.pos); - } - - e->stats.in_combat = true; - enemies_in_combat = true; - } - } - - - //break combat if the player gets too far or all enemies die - if(!enemies_in_combat) - e->stats.in_combat = false; - - // aggressive creatures are always in combat - if (e->stats.combat_style == StatBlock::COMBAT_AGGRESSIVE) - e->stats.in_combat = true; - - //the default target is the player - if(!e->stats.in_combat) { - pursue_pos.x = pc->stats.pos.x; - pursue_pos.y = pc->stats.pos.y; - target_dist = hero_dist; - } - - // check line-of-sight - if (target_dist < e->stats.threat_range && pc->stats.alive) - los = mapr->collider.lineOfSight(e->stats.pos.x, e->stats.pos.y, pursue_pos.x, pursue_pos.y); - else - los = false; - - //if the player is blocked, all summons which the player is facing to move away for the specified frames - //need to set the flag player_blocked so that other allies know to get out of the way as well - //if hero is facing the summon - if(eset->misc.enable_ally_collision_ai) { - if(!enemym->player_blocked && hero_dist < ALLY_FLEE_DISTANCE - && mapr->collider.isFacing(pc->stats.pos.x,pc->stats.pos.y,pc->stats.direction,e->stats.pos.x,e->stats.pos.y)) { - enemym->player_blocked = true; - enemym->player_blocked_timer.reset(Timer::BEGIN); - } - - bool player_closer_than_target = Utils::calcDist(e->stats.pos, pursue_pos) > Utils::calcDist(e->stats.pos, pc->stats.pos); - - if(enemym->player_blocked && (!e->stats.in_combat || player_closer_than_target) - && mapr->collider.isFacing(pc->stats.pos.x,pc->stats.pos.y,pc->stats.direction,e->stats.pos.x,e->stats.pos.y)) { - fleeing = true; - pursue_pos = pc->stats.pos; - } - } - - if(e->stats.effects.fear) fleeing = true; - - // If we have a successful chance_flee roll, try to move to a safe distance - if ( - e->stats.in_combat && - e->stats.cur_state == StatBlock::ENEMY_STANCE && - !move_to_safe_dist && hero_dist < e->stats.flee_range && - hero_dist >= e->stats.melee_range && - Math::percentChance(e->stats.chance_flee) && - e->stats.flee_cooldown_timer.isEnd() - ) - { - move_to_safe_dist = true; - } - - if (move_to_safe_dist) fleeing = true; - - if (fleeing) { - FPoint target_pos = pursue_pos; - - std::vector flee_dirs; - - int middle_dir = Utils::calcDirection(target_pos.x, target_pos.y, e->stats.pos.x, e->stats.pos.y); - for (int i = -2; i <= 2; ++i) { - int test_dir = Utils::rotateDirection(middle_dir, i); - - FPoint test_pos = Utils::calcVector(e->stats.pos, test_dir, 1); - if (mapr->collider.isValidPosition(test_pos.x, test_pos.y, e->stats.movement_type, MapCollision::COLLIDE_NORMAL)) { - if (test_dir == e->stats.direction) { - // if we're already moving in a good direction, favor it over other directions - flee_dirs.clear(); - flee_dirs.push_back(test_dir); - break; - } - else { - flee_dirs.push_back(test_dir); - } - } - } - - if (flee_dirs.empty()) { - // trapped and can't move - move_to_safe_dist = false; - fleeing = false; - } - else { - int index = Math::randBetween(0, static_cast(flee_dirs.size())-1); - pursue_pos = Utils::calcVector(e->stats.pos, flee_dirs[index], 1); - - if (e->stats.flee_timer.isEnd()) { - e->stats.flee_timer.reset(Timer::BEGIN); - } - } - } -} - -void BehaviorAlly::checkMoveStateStance() { - - // If the enemy is capable of fleeing and is at a safe distance, have it hold its position instead of moving - if (hero_dist >= e->stats.flee_range && e->stats.chance_flee > 0) return; - - // try to move to the target if we're either: - // 1. too far away and chance_pursue roll succeeds - // 2. within range, but lack line-of-sight (required to attack) - bool should_move_to_target = (target_dist > e->stats.melee_range && Math::percentChance(e->stats.chance_pursue)) || (target_dist <= e->stats.melee_range && !los) || (hero_dist > ALLY_FOLLOW_DISTANCE_WALK); - - if (should_move_to_target || fleeing) { - if(e->stats.in_combat && target_dist > e->stats.melee_range) { - if (e->move()) - e->stats.cur_state = StatBlock::ENEMY_MOVE; - } - - if((!e->stats.in_combat && hero_dist > ALLY_FOLLOW_DISTANCE_WALK) || fleeing) { - if (e->move()) { - e->stats.cur_state = StatBlock::ENEMY_MOVE; - } - else { - collided = true; - unsigned char prev_direction = e->stats.direction; - - // hit an obstacle, try the next best angle - e->stats.direction = e->faceNextBest(pursue_pos.x, pursue_pos.y); - if (e->move()) { - e->stats.cur_state = StatBlock::ENEMY_MOVE; - } - else e->stats.direction = prev_direction; - } - } - } -} - -void BehaviorAlly::checkMoveStateMove() { - bool can_attack = true; - - if (!e->stats.cooldown.isEnd()) { - can_attack = false; - } - else { - can_attack = false; - for (size_t i = 0; i < e->stats.powers_ai.size(); ++i) { - if (e->stats.powers_ai[i].cooldown.isEnd()) { - can_attack = true; - break; - } - } - } - // in order to prevent infinite fleeing, we re-roll our chance to flee after a certain duration - bool stop_fleeing = can_attack && fleeing && e->stats.flee_timer.isEnd() && !Math::percentChance(e->stats.chance_flee); - - if (!stop_fleeing && e->stats.flee_timer.isEnd()) { - // if the roll to continue fleeing succeeds, but the flee duration has expired, we don't want to reset the duration to the full amount - // instead, we scehdule the next re-roll to happen on the next frame - // this will continue until a roll fails, returning to the stance state - e->stats.flee_timer.setCurrent(1); - } - - //if close enough to hero, stop miving - if((hero_dist < ALLY_FOLLOW_DISTANCE_STOP && !e->stats.in_combat && !fleeing) - || (target_dist < e->stats.melee_range && e->stats.in_combat && !fleeing) - || (move_to_safe_dist && target_dist >= e->stats.threat_range/2) - || stop_fleeing) - { - if (stop_fleeing) { - e->stats.flee_cooldown_timer.reset(Timer::BEGIN); - } - e->stats.cur_state = StatBlock::ENEMY_STANCE; - move_to_safe_dist = false; - fleeing = false; - } - - // try to continue moving - else if (!e->move()) { - collided = true; - unsigned char prev_direction = e->stats.direction; - // hit an obstacle. Try the next best angle - e->stats.direction = e->faceNextBest(pursue_pos.x, pursue_pos.y); - if (!e->move()) { - //this prevents an ally trying to move perpendicular to a bridge if the player gets close to it in a certain position and gets blocked - if(enemym->player_blocked && !e->stats.in_combat) { - e->stats.direction = pc->stats.direction; - if (!e->move()) { - e->stats.cur_state = StatBlock::ENEMY_STANCE; - e->stats.direction = prev_direction; - } - } - else { - e->stats.cur_state = StatBlock::ENEMY_STANCE; - e->stats.direction = prev_direction; - } - } - } -} - diff --git a/src/BehaviorAlly.h b/src/BehaviorAlly.h deleted file mode 100644 index 2ad44d7..0000000 --- a/src/BehaviorAlly.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright © 2013 Ryan Dansie - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - - -#ifndef BEHAVIORALLY_H -#define BEHAVIORALLY_H - -#include "BehaviorStandard.h" - -class BehaviorAlly : public BehaviorStandard { -public: - explicit BehaviorAlly(Enemy *_e); - virtual ~BehaviorAlly(); -protected: -private: - virtual void findTarget(); - virtual void checkMoveStateStance(); - virtual void checkMoveStateMove(); -}; - -#endif // BEHAVIORALLY_H diff --git a/src/BehaviorStandard.cpp b/src/BehaviorStandard.cpp deleted file mode 100644 index 05a36b1..0000000 --- a/src/BehaviorStandard.cpp +++ /dev/null @@ -1,753 +0,0 @@ -/* -Copyright © 2012 Clint Bellanger -Copyright © 2012 Stefan Beller -Copyright © 2012-2016 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -#include "Animation.h" -#include "Avatar.h" -#include "BehaviorStandard.h" -#include "CommonIncludes.h" -#include "Enemy.h" -#include "EnemyManager.h" -#include "EngineSettings.h" -#include "MapRenderer.h" -#include "PowerManager.h" -#include "Settings.h" -#include "SharedGameResources.h" -#include "SharedResources.h" -#include "StatBlock.h" -#include "UtilsMath.h" - -BehaviorStandard::BehaviorStandard(Enemy *_e) - : EnemyBehavior(_e) - , path() - , prev_target() - , collided(false) - , path_found(false) - , chance_calc_path(0) - , hero_dist(0) - , target_dist(0) - , pursue_pos(-1, -1) - , los(false) - , fleeing(false) - , move_to_safe_dist(false) - , turn_timer() -{ -} - -/** - * One frame of logic for this behavior - */ -void BehaviorStandard::logic() { - - // skip all logic if the enemy is dead and no longer animating - if (e->stats.corpse) { - e->stats.corpse_timer.tick(); - return; - } - - if (!e->stats.hero_ally) { - if (Utils::calcDist(e->stats.pos, pc->stats.pos) <= settings->encounter_dist) - e->stats.encountered = true; - - if (!e->stats.encountered) - return; - } - - doUpkeep(); - findTarget(); - checkPower(); - checkMove(); - updateState(); - - fleeing = false; -} - -/** - * Various upkeep on stats - */ -void BehaviorStandard::doUpkeep() { - // activate all passive powers - if (e->stats.hp > 0 || e->stats.effects.triggered_death) - powers->activatePassives(&e->stats); - - e->stats.logic(); - - // bleeding to death - if (e->stats.bleed_source_type != -1) { - e->doRewards(e->stats.bleed_source_type); - e->stats.bleed_source_type = -1; - } - - // check for teleport powers - if (e->stats.teleportation) { - - mapr->collider.unblock(e->stats.pos.x,e->stats.pos.y); - - e->stats.pos.x = e->stats.teleport_destination.x; - e->stats.pos.y = e->stats.teleport_destination.y; - - mapr->collider.block(e->stats.pos.x,e->stats.pos.y, e->stats.hero_ally); - - e->stats.teleportation = false; - } -} - -/** - * Locate the player and set various targeting info - */ -void BehaviorStandard::findTarget() { - // dying enemies can't target anything - if (e->stats.cur_state == StatBlock::ENEMY_DEAD || e->stats.cur_state == StatBlock::ENEMY_CRITDEAD) return; - - float stealth_threat_range = (e->stats.threat_range * (100 - static_cast(e->stats.hero_stealth))) / 100; - - // stunned enemies can't act - if (e->stats.effects.stun) return; - - // check distance and line of sight between enemy and hero - if (pc->stats.alive) - hero_dist = Utils::calcDist(e->stats.pos, pc->stats.pos); - else - hero_dist = 0; - - - // aggressive enemies are always in combat - if (!e->stats.in_combat && e->stats.combat_style == StatBlock::COMBAT_AGGRESSIVE) { - e->stats.join_combat = true; - } - - // check entering combat (because the player got too close) - if (e->stats.alive && !e->stats.in_combat && los && hero_dist < stealth_threat_range && e->stats.combat_style != StatBlock::COMBAT_PASSIVE) { - e->stats.join_combat = true; - } - - // check entering combat (because the player hit the enemy) - if (e->stats.join_combat) { - e->stats.in_combat = true; - - StatBlock::AIPower* ai_power = e->stats.getAIPower(StatBlock::AI_POWER_BEACON); - if (ai_power != NULL) { - powers->activate(ai_power->id, &e->stats, e->stats.pos); //emit beacon - } - - ai_power = e->stats.getAIPower(StatBlock::AI_POWER_JOIN_COMBAT); - if (ai_power != NULL) { - e->stats.cur_state = StatBlock::ENEMY_POWER; - e->stats.activated_power = ai_power; - } - - e->stats.join_combat = false; - } - - // check exiting combat (player died or got too far away) - if (e->stats.in_combat && hero_dist > (e->stats.threat_range_far) && !e->stats.join_combat && e->stats.combat_style != StatBlock::COMBAT_AGGRESSIVE) { - e->stats.in_combat = false; - } - - // check exiting combat (player or enemy died) - if ((!e->stats.alive || !pc->stats.alive) && e->stats.combat_style != StatBlock::COMBAT_AGGRESSIVE) { - e->stats.in_combat = false; - } - - // by default, the enemy pursues the hero directly - pursue_pos.x = pc->stats.pos.x; - pursue_pos.y = pc->stats.pos.y; - target_dist = hero_dist; - - - //if there are player allies closer than the hero, target an ally instead - if(e->stats.in_combat) { - for (unsigned int i=0; i < enemym->enemies.size(); i++) { - if(!enemym->enemies[i]->stats.corpse && enemym->enemies[i]->stats.hero_ally) { - //now work out the distance to the minion and compare it to the distance to the current targer (we want to target the closest ally) - float ally_dist = Utils::calcDist(e->stats.pos, enemym->enemies[i]->stats.pos); - if (ally_dist < target_dist) { - pursue_pos.x = enemym->enemies[i]->stats.pos.x; - pursue_pos.y = enemym->enemies[i]->stats.pos.y; - target_dist = ally_dist; - } - } - } - } - - // if we just started wandering, set the first waypoint - if (e->stats.wander && e->stats.waypoints.empty()) { - FPoint waypoint = getWanderPoint(); - e->stats.waypoints.push(waypoint); - e->stats.waypoint_timer.reset(Timer::BEGIN); - } - - // if we're not in combat, pursue the next waypoint - if (!(e->stats.in_combat || e->stats.waypoints.empty())) { - FPoint waypoint = e->stats.waypoints.front(); - pursue_pos.x = waypoint.x; - pursue_pos.y = waypoint.y; - } - - // check line-of-sight - if (target_dist < e->stats.threat_range && pc->stats.alive) - los = mapr->collider.lineOfSight(e->stats.pos.x, e->stats.pos.y, pc->stats.pos.x, pc->stats.pos.y); - else - los = false; - - if(e->stats.effects.fear) fleeing = true; - - // If we have a successful chance_flee roll, try to move to a safe distance - if ( - e->stats.in_combat && - e->stats.cur_state == StatBlock::ENEMY_STANCE && - !move_to_safe_dist && hero_dist < e->stats.flee_range && - hero_dist >= e->stats.melee_range && - Math::percentChance(e->stats.chance_flee) && - e->stats.flee_cooldown_timer.isEnd() - ) - { - move_to_safe_dist = true; - } - - if (move_to_safe_dist) fleeing = true; - - if (fleeing) { - FPoint target_pos = pursue_pos; - - std::vector flee_dirs; - - int middle_dir = Utils::calcDirection(target_pos.x, target_pos.y, e->stats.pos.x, e->stats.pos.y); - for (int i = -2; i <= 2; ++i) { - int test_dir = Utils::rotateDirection(middle_dir, i); - - FPoint test_pos = Utils::calcVector(e->stats.pos, test_dir, 1); - if (mapr->collider.isValidPosition(test_pos.x, test_pos.y, e->stats.movement_type, MapCollision::COLLIDE_NORMAL)) { - if (test_dir == e->stats.direction) { - // if we're already moving in a good direction, favor it over other directions - flee_dirs.clear(); - flee_dirs.push_back(test_dir); - break; - } - else { - flee_dirs.push_back(test_dir); - } - } - } - - if (flee_dirs.empty()) { - // trapped and can't move - move_to_safe_dist = false; - fleeing = false; - } - else { - int index = Math::randBetween(0, static_cast(flee_dirs.size())-1); - pursue_pos = Utils::calcVector(e->stats.pos, flee_dirs[index], 1); - - if (e->stats.flee_timer.isEnd()) { - e->stats.flee_timer.reset(Timer::BEGIN); - } - } - } -} - -/** - * Begin using a power if idle, based on behavior % chances. - * Activate a ready power, if the attack animation has followed through - */ -void BehaviorStandard::checkPower() { - - // stunned enemies can't act - if (e->stats.effects.stun || e->stats.effects.fear || fleeing) return; - - // currently all enemy power use happens during combat - if (!e->stats.in_combat) return; - - // if the enemy is on global cooldown it cannot act - if (!e->stats.cooldown.isEnd()) return; - - // Note there are two stages to activating a power. - // First is the enemy choosing to use a power based on behavioral chance - // Second is the power actually firing off once the related animation reaches the active frame. - // The second stage occurs in updateState() - - // pick a power from the available powers for this creature - if (e->stats.cur_state == StatBlock::ENEMY_STANCE || e->stats.cur_state == StatBlock::ENEMY_MOVE) { - StatBlock::AIPower* ai_power = NULL; - - // check half dead power use - if (e->stats.half_dead_power && e->stats.hp <= e->stats.get(Stats::HP_MAX)/2) { - ai_power = e->stats.getAIPower(StatBlock::AI_POWER_HALF_DEAD); - } - // check ranged power use - else if (target_dist > e->stats.melee_range) { - ai_power = e->stats.getAIPower(StatBlock::AI_POWER_RANGED); - } - // check melee power use - else { - ai_power = e->stats.getAIPower(StatBlock::AI_POWER_MELEE); - } - - if (ai_power != NULL) { - const Power& pwr = powers->powers[ai_power->id]; - if (!los && (pwr.requires_los || pwr.requires_los_default)) { - ai_power = NULL; - } - if (ai_power != NULL) { - e->stats.cur_state = StatBlock::ENEMY_POWER; - e->stats.activated_power = ai_power; - } - } - } - - if (e->stats.cur_state != StatBlock::ENEMY_POWER && e->stats.activated_power) { - e->stats.activated_power = NULL; - } -} - -/** - * Check state changes related to movement - */ -void BehaviorStandard::checkMove() { - - // dying enemies can't move - if (e->stats.cur_state == StatBlock::ENEMY_DEAD || e->stats.cur_state == StatBlock::ENEMY_CRITDEAD) return; - - // stunned enemies can't act - if (e->stats.effects.stun) return; - - // handle not being in combat and (not patrolling waypoints or waiting at waypoint) - if (!e->stats.hero_ally && !e->stats.in_combat && (e->stats.waypoints.empty() || !e->stats.waypoint_timer.isEnd())) { - - if (e->stats.cur_state == StatBlock::ENEMY_MOVE) { - e->stats.cur_state = StatBlock::ENEMY_STANCE; - } - - // currently enemies only move while in combat or patrolling - return; - } - - float real_speed = e->stats.speed * speedMultiplyer[e->stats.direction] * e->stats.effects.speed / 100; - - unsigned turn_ticks = turn_timer.getCurrent(); - turn_timer.setDuration(e->stats.turn_delay); - - // If an enemy's turn_delay is too long compared to their speed, they will be unable to follow a path properly. - // So here, we get how many frames it takes to traverse a single tile and then compare it to the turn delay time. - // We then cap the turn delay the time at the number of frames we calculated for tile traversal. - // There may be other solutions to this problem, such as having the enemy pause when they reach a path point, - // but I was unable to get anything else working as cleanly/bug-free as this. - int max_turn_ticks = static_cast(1.f / real_speed); - if (e->stats.turn_delay > max_turn_ticks) { - turn_timer.setDuration(max_turn_ticks); - } - turn_timer.setCurrent(turn_ticks); - - // clear current space to allow correct movement - mapr->collider.unblock(e->stats.pos.x, e->stats.pos.y); - - // update direction - if (e->stats.facing) { - turn_timer.tick(); - if (turn_timer.isEnd()) { - - // if blocked, face in pathfinder direction instead - if (!mapr->collider.lineOfMovement(e->stats.pos.x, e->stats.pos.y, pursue_pos.x, pursue_pos.y, e->stats.movement_type)) { - - // if a path is returned, target first waypoint - - bool recalculate_path = false; - - //if theres no path, it needs to be calculated - if(path.empty()) - recalculate_path = true; - - //if the target moved more than 1 tile away, recalculate - if(Utils::calcDist(FPoint(Point(prev_target)), FPoint(Point(pursue_pos))) > 1.f) - recalculate_path = true; - - //if a collision ocurred then recalculate - if(collided) - recalculate_path = true; - - //add a 5% chance to recalculate on every frame. This prevents reclaulating lots of entities in the same frame - chance_calc_path += 5; - - if(Math::percentChance(chance_calc_path)) - recalculate_path = true; - - //dont recalculate if we were blocked and no path was found last time - //this makes sure that pathfinding calculation is not spammed when the target is unreachable and the entity is as close as its going to get - if(!path_found && collided && !Math::percentChance(chance_calc_path)) - recalculate_path = false; - else//reset the collision flag only if we dont want the cooldown in place - collided = false; - - prev_target = pursue_pos; - - // target first waypoint - if(recalculate_path) { - chance_calc_path = -100; - path.clear(); - path_found = mapr->collider.computePath(e->stats.pos, pursue_pos, path, e->stats.movement_type, MapCollision::DEFAULT_PATH_LIMIT); - } - - if(!path.empty()) { - pursue_pos = path.back(); - - //if distance to node is lower than a tile size, the node is going to be passed and can be removed - if(Utils::calcDist(e->stats.pos, pursue_pos) <= 1.f) - path.pop_back(); - } - } - else { - path.clear(); - } - - if (e->stats.charge_speed == 0.0f) { - e->stats.direction = Utils::calcDirection(e->stats.pos.x, e->stats.pos.y, pursue_pos.x, pursue_pos.y); - } - turn_timer.reset(Timer::BEGIN); - } - } - - e->stats.flee_timer.tick(); - e->stats.flee_cooldown_timer.tick(); - - // try to start moving - if (e->stats.cur_state == StatBlock::ENEMY_STANCE) { - checkMoveStateStance(); - } - - // already moving - else if (e->stats.cur_state == StatBlock::ENEMY_MOVE) { - checkMoveStateMove(); - } - - // if patrolling waypoints and has reached a waypoint, cycle to the next one - if (!e->stats.waypoints.empty()) { - // if the patroller is close to the waypoint - FPoint waypoint = e->stats.waypoints.front(); - float waypoint_dist = Utils::calcDist(waypoint, e->stats.pos); - - FPoint saved_pos = e->stats.pos; - e->move(); - float new_dist = Utils::calcDist(waypoint, e->stats.pos); - e->stats.pos = saved_pos; - - if (waypoint_dist <= real_speed || (waypoint_dist <= 0.5f && new_dist > waypoint_dist)) { - e->stats.pos = waypoint; - turn_timer.reset(Timer::END); - e->stats.waypoints.pop(); - // pick a new random point if we're wandering - if (e->stats.wander) { - waypoint = getWanderPoint(); - } - e->stats.waypoints.push(waypoint); - e->stats.waypoint_timer.reset(Timer::BEGIN); - } - } - - // re-block current space to allow correct movement - mapr->collider.block(e->stats.pos.x, e->stats.pos.y, e->stats.hero_ally); - -} - -void BehaviorStandard::checkMoveStateStance() { - - // If the enemy is capable of fleeing and is at a safe distance, have it hold its position instead of moving - if (hero_dist >= e->stats.flee_range && e->stats.chance_flee > 0 && e->stats.waypoints.empty()) return; - - // try to move to the target if we're either: - // 1. too far away and chance_pursue roll succeeds - // 2. within range, but lack line-of-sight (required to attack) - bool should_move_to_target = (target_dist > e->stats.melee_range && Math::percentChance(e->stats.chance_pursue)) || (target_dist <= e->stats.melee_range && !los); - - if (should_move_to_target || fleeing) { - - if (e->move()) { - e->stats.cur_state = StatBlock::ENEMY_MOVE; - } - else { - collided = true; - unsigned char prev_direction = e->stats.direction; - - // hit an obstacle, try the next best angle - e->stats.direction = e->faceNextBest(pursue_pos.x, pursue_pos.y); - if (e->move()) { - e->stats.cur_state = StatBlock::ENEMY_MOVE; - } - else - e->stats.direction = prev_direction; - } - } -} - -void BehaviorStandard::checkMoveStateMove() { - bool can_attack = true; - - if (!e->stats.cooldown.isEnd()) { - can_attack = false; - } - else { - can_attack = false; - for (size_t i = 0; i < e->stats.powers_ai.size(); ++i) { - if (e->stats.powers_ai[i].cooldown.isEnd()) { - can_attack = true; - break; - } - } - } - // in order to prevent infinite fleeing, we re-roll our chance to flee after a certain duration - bool stop_fleeing = can_attack && fleeing && e->stats.flee_timer.isEnd() && !Math::percentChance(e->stats.chance_flee); - - if (!stop_fleeing && e->stats.flee_timer.isEnd()) { - // if the roll to continue fleeing succeeds, but the flee duration has expired, we don't want to reset the duration to the full amount - // instead, we scehdule the next re-roll to happen on the next frame - // this will continue until a roll fails, returning to the stance state - e->stats.flee_timer.setCurrent(1); - } - - // close enough to the hero or is at a safe distance - if (pc->stats.alive && ((target_dist < e->stats.melee_range && !fleeing) || (move_to_safe_dist && target_dist >= e->stats.flee_range) || stop_fleeing)) { - if (stop_fleeing) { - e->stats.flee_cooldown_timer.reset(Timer::BEGIN); - } - e->stats.cur_state = StatBlock::ENEMY_STANCE; - move_to_safe_dist = false; - fleeing = false; - } - - // try to continue moving - else if (!e->move()) { - collided = true; - unsigned char prev_direction = e->stats.direction; - // hit an obstacle. Try the next best angle - e->stats.direction = e->faceNextBest(pursue_pos.x, pursue_pos.y); - if (!e->move()) { - e->stats.cur_state = StatBlock::ENEMY_STANCE; - e->stats.direction = prev_direction; - } - } -} - - -/** - * Perform miscellaneous state-based actions. - * 1) Set animations and sound effects - * 2) Return to the default state (Stance) when actions are complete - */ -void BehaviorStandard::updateState() { - - // stunned enemies can't act - if (e->stats.effects.stun) return; - - int power_id; - int power_state; - - // continue current animations - e->activeAnimation->advanceFrame(); - - switch (e->stats.cur_state) { - - case StatBlock::ENEMY_STANCE: - - e->setAnimation("stance"); - break; - - case StatBlock::ENEMY_MOVE: - - e->setAnimation("run"); - break; - - case StatBlock::ENEMY_POWER: - - if (e->stats.activated_power == NULL) { - e->stats.cur_state = StatBlock::ENEMY_STANCE; - break; - } - - power_id = e->stats.activated_power->id; - power_state = powers->powers[power_id].new_state; - e->stats.prevent_interrupt = powers->powers[power_id].prevent_interrupt; - - // animation based on power type - if (power_state == Power::STATE_INSTANT) - e->instant_power = true; - else if (power_state == Power::STATE_ATTACK) - e->setAnimation(powers->powers[power_id].attack_anim); - - // sound effect based on power type - if (e->activeAnimation->isFirstFrame()) { - if (powers->powers[power_id].pre_power > 0 && Math::percentChance(powers->powers[power_id].pre_power_chance)) { - powers->activate(powers->powers[power_id].pre_power, &e->stats, pursue_pos); - } - - float attack_speed = (e->stats.effects.getAttackSpeed(powers->powers[power_id].attack_anim) * powers->powers[power_id].attack_speed) / 100.0f; - e->activeAnimation->setSpeed(attack_speed); - e->playAttackSound(powers->powers[power_id].attack_anim); - - if (powers->powers[power_id].state_duration > 0) - e->stats.state_timer.setDuration(powers->powers[power_id].state_duration); - - if (powers->powers[power_id].charge_speed != 0.0f) - e->stats.charge_speed = powers->powers[power_id].charge_speed; - } - - // Activate Power: - // if we're at the active frame of a power animation, - // activate the power and set the local and global cooldowns - if ((e->activeAnimation->isActiveFrame() || e->instant_power) && !e->stats.hold_state) { - powers->activate(power_id, &e->stats, pursue_pos); - - // set cooldown for all ai powers with the same power id - for (size_t i = 0; i < e->stats.powers_ai.size(); ++i) { - if (e->stats.activated_power->id == e->stats.powers_ai[i].id) { - e->stats.powers_ai[i].cooldown.setDuration(powers->powers[power_id].cooldown); - } - } - - if (e->stats.activated_power->type == StatBlock::AI_POWER_HALF_DEAD) { - e->stats.half_dead_power = false; - } - - if (!e->stats.state_timer.isEnd()) - e->stats.hold_state = true; - } - - // animation is finished - if ((e->activeAnimation->isLastFrame() && e->stats.state_timer.isEnd()) || - (power_state == Power::STATE_ATTACK && e->activeAnimation->getName() != powers->powers[power_id].attack_anim) || - e->instant_power) - { - if (!e->instant_power) - e->stats.cooldown.reset(Timer::BEGIN); - else - e->instant_power = false; - - e->stats.activated_power = NULL; - e->stats.cur_state = StatBlock::ENEMY_STANCE; - e->stats.prevent_interrupt = false; - } - break; - - case StatBlock::ENEMY_SPAWN: - - e->setAnimation("spawn"); - //the second check is needed in case the entity does not have a spawn animation - if (e->activeAnimation->isLastFrame() || e->activeAnimation->getName() != "spawn") { - e->stats.cur_state = StatBlock::ENEMY_STANCE; - } - break; - - case StatBlock::ENEMY_BLOCK: - - e->setAnimation("block"); - break; - - case StatBlock::ENEMY_HIT: - - e->setAnimation("hit"); - if (e->activeAnimation->isFirstFrame()) { - e->stats.effects.triggered_hit = true; - } - if (e->activeAnimation->isLastFrame() || e->activeAnimation->getName() != "hit") - e->stats.cur_state = StatBlock::ENEMY_STANCE; - break; - - case StatBlock::ENEMY_DEAD: - if (e->stats.effects.triggered_death) break; - - e->setAnimation("die"); - if (e->activeAnimation->isFirstFrame()) { - e->playSound(Entity::SOUND_DIE); - e->stats.corpse_timer.setDuration(eset->misc.corpse_timeout); - } - if (e->activeAnimation->isSecondLastFrame()) { - StatBlock::AIPower* ai_power = e->stats.getAIPower(StatBlock::AI_POWER_DEATH); - if (ai_power != NULL) - powers->activate(ai_power->id, &e->stats, e->stats.pos); - - e->stats.effects.clearEffects(); - } - if (e->activeAnimation->isLastFrame() || e->activeAnimation->getName() != "die") { - // puts renderable under object layer - e->stats.corpse = true; - - //allow free movement over the corpse - mapr->collider.unblock(e->stats.pos.x, e->stats.pos.y); - - // remove corpses that land on blocked tiles, such as water or pits - if (!mapr->collider.isValidPosition(e->stats.pos.x, e->stats.pos.y, MapCollision::MOVE_NORMAL, MapCollision::COLLIDE_NORMAL)) { - e->stats.corpse_timer.reset(Timer::END); - } - - // prevent "jumping" when rendering - e->stats.pos.align(); - } - - break; - - case StatBlock::ENEMY_CRITDEAD: - - e->setAnimation("critdie"); - if (e->activeAnimation->isFirstFrame()) { - e->playSound(Entity::SOUND_CRITDIE); - e->stats.corpse_timer.setDuration(eset->misc.corpse_timeout); - } - if (e->activeAnimation->isSecondLastFrame()) { - StatBlock::AIPower* ai_power = e->stats.getAIPower(StatBlock::AI_POWER_DEATH); - if (ai_power != NULL) - powers->activate(ai_power->id, &e->stats, e->stats.pos); - - e->stats.effects.clearEffects(); - } - if (e->activeAnimation->isLastFrame() || e->activeAnimation->getName() != "critdie") { - // puts renderable under object layer - e->stats.corpse = true; - - //allow free movement over the corpse - mapr->collider.unblock(e->stats.pos.x, e->stats.pos.y); - - // prevent "jumping" when rendering - e->stats.pos.align(); - } - - break; - - default: - break; - } - - if (e->stats.state_timer.isEnd() && e->stats.hold_state) - e->stats.hold_state = false; - - if (e->stats.cur_state != StatBlock::ENEMY_POWER && e->stats.charge_speed != 0.0f) - e->stats.charge_speed = 0.0f; -} - -FPoint BehaviorStandard::getWanderPoint() { - FPoint waypoint; - waypoint.x = static_cast(e->stats.wander_area.x) + static_cast(rand() % (e->stats.wander_area.w)) + 0.5f; - waypoint.y = static_cast(e->stats.wander_area.y) + static_cast(rand() % (e->stats.wander_area.h)) + 0.5f; - - if (mapr->collider.isValidPosition(waypoint.x, waypoint.y, e->stats.movement_type, mapr->collider.getCollideType(e->stats.hero)) && - mapr->collider.lineOfMovement(e->stats.pos.x, e->stats.pos.y, waypoint.x, waypoint.y, e->stats.movement_type)) - { - return waypoint; - } - else { - // didn't get a valid waypoint, so keep our current position - return e->stats.pos; - } -} diff --git a/src/BehaviorStandard.h b/src/BehaviorStandard.h deleted file mode 100644 index b5ecf7d..0000000 --- a/src/BehaviorStandard.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -Copyright © 2012 Clint Bellanger -Copyright © 2013-2014 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -#ifndef BEHAVIOR_STANDARD_H -#define BEHAVIOR_STANDARD_H - -#include "EnemyBehavior.h" -#include "Utils.h" - -class Enemy; -class Point; - -class BehaviorStandard : public EnemyBehavior { -private: - - // logic steps - void doUpkeep(); - virtual void findTarget(); - void checkPower(); - void checkMove(); - virtual void checkMoveStateStance(); - virtual void checkMoveStateMove(); - void updateState(); - FPoint getWanderPoint(); - -protected: - //variables for patfinding - std::vector path; - FPoint prev_target; - bool collided; - bool path_found; - int chance_calc_path; - - float hero_dist; - float target_dist; - FPoint pursue_pos; - // targeting vars - bool los; - //when fleeing, the enemy moves away from the pursue_pos - bool fleeing; - bool move_to_safe_dist; - Timer turn_timer; - -public: - explicit BehaviorStandard(Enemy *_e); - void logic(); - -}; - -#endif diff --git a/src/Camera.cpp b/src/Camera.cpp new file mode 100644 index 0000000..e14c7ad --- /dev/null +++ b/src/Camera.cpp @@ -0,0 +1,134 @@ +/* +Copyright © 2012-2021 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + + +/** + * class Camera + * + * Controls the viewport that moves around the map, usually focused on the player + * + */ + +#include "Camera.h" +#include "CommonIncludes.h" +#include "EngineSettings.h" +#include "SharedResources.h" +#include "Utils.h" +#include "UtilsMath.h" + +Camera::Camera() + : pos() + , shake() + , target() + , prev_cam_target() + , prev_cam_dx(0) + , prev_cam_dy(0) + , cam_threshold(eset->misc.camera_speed / 50.f) + , shake_strength(8) +{ +} + +Camera::~Camera() { +} + +void Camera::logic() { + // gradulally move camera towards target + + float cam_delta = Utils::calcDist(pos, target); + float cam_dx = (Utils::calcDist(FPoint(pos.x, target.y), target)) / eset->misc.camera_speed; + float cam_dy = (Utils::calcDist(FPoint(target.x, pos.y), target)) / eset->misc.camera_speed; + + if (prev_cam_target.x == target.x && prev_cam_target.y == target.y) { + // target hasn't changed + + if (cam_delta == 0 || cam_delta >= cam_threshold) { + // camera is stationary or moving fast enough, so store the deltas + prev_cam_dx = cam_dx; + prev_cam_dy = cam_dy; + } + else if (cam_delta < cam_threshold) { + if (cam_dx < prev_cam_dx || cam_dy < prev_cam_dy) { + // maintain camera speed + cam_dx = prev_cam_dx; + cam_dy = prev_cam_dy; + } + else { + // camera didn't get a chance to speed up, so set the minimum speed + float b = fabsf(pos.x - target.x); + float alpha = acosf(b / cam_delta); + + float fast_dx = cam_threshold * cosf(alpha); + float fast_dy = cam_threshold * sinf(alpha); + + prev_cam_dx = fast_dx / eset->misc.camera_speed; + prev_cam_dy = fast_dy / eset->misc.camera_speed; + } + } + } + else { + // target changed, reset + prev_cam_target = target; + prev_cam_dx = 0; + prev_cam_dy = 0; + } + + // camera movement might overshoot its target, so compensate for that here + if (pos.x < target.x) { + pos.x += cam_dx; + if (pos.x > target.x) + pos.x = target.x; + } + else if (pos.x > target.x) { + pos.x -= cam_dx; + if (pos.x < target.x) + pos.x = target.x; + } + if (pos.y < target.y) { + pos.y += cam_dy; + if (pos.y > target.y) + pos.y = target.y; + } + else if (pos.y > target.y) { + pos.y -= cam_dy; + if (pos.y < target.y) + pos.y = target.y; + } + + // handle camera shaking timer + shake_timer.tick(); + + if (shake_timer.isEnd()) { + shake.x = pos.x; + shake.y = pos.y; + } + else { + shake.x = pos.x + static_cast((rand() % (shake_strength * 2)) - shake_strength) * 0.0078125f; + shake.y = pos.y + static_cast((rand() % (shake_strength * 2)) - shake_strength) * 0.0078125f; + } +} + +void Camera::setTarget(const FPoint& _target) { + target = _target; +} + +void Camera::warpTo(const FPoint& _target) { + pos = shake = target = prev_cam_target = _target; + shake_timer.reset(Timer::END); + prev_cam_dx = 0; + prev_cam_dy = 0; +} + diff --git a/src/Camera.h b/src/Camera.h new file mode 100644 index 0000000..71bde9d --- /dev/null +++ b/src/Camera.h @@ -0,0 +1,56 @@ +/* +Copyright © 2012-2021 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + + +/** + * class Camera + * + * Controls the viewport that moves around the map, usually focused on the player + * + */ + +#ifndef CAMERA_H +#define CAMERA_H + +#include "CommonIncludes.h" +#include "Utils.h" + +class Camera { +public: + Camera(); + ~Camera(); + + void logic(); + void setTarget(const FPoint& _target); + void warpTo(const FPoint& _target); + + FPoint pos; + FPoint shake; + Timer shake_timer; + +private: + FPoint target; + FPoint prev_cam_target; + + float prev_cam_dx; + float prev_cam_dy; + + float cam_threshold; + int shake_strength; +}; + +#endif diff --git a/src/CampaignManager.cpp b/src/CampaignManager.cpp index 307e9b1..2bfd5cc 100644 --- a/src/CampaignManager.cpp +++ b/src/CampaignManager.cpp @@ -77,21 +77,20 @@ * Convert status array to savefile campaign= (status csv) */ std::string CampaignManager::getAll() { - std::stringstream ss; - ss.str(""); + std::string output(""); StatusMap::iterator it; for (it = status.begin(); it != status.end(); ++it) { if (it->second.first) - ss << it->second.second; + output += it->second.second; StatusMap::iterator temp = it; temp++; if (temp != status.end() && temp->second.first) { - ss << ','; + output += ','; } } - return ss.str(); + return output; } bool CampaignManager::checkStatus(const StatusID s) { @@ -138,11 +137,11 @@ return menu->inv->inventory[MenuInventory::CARRIED].contain(eset->misc.currency_id, quantity); } -bool CampaignManager::checkItem(int item_id) { - if (menu->inv->inventory[MenuInventory::CARRIED].contain(item_id, 1)) +bool CampaignManager::checkItem(ItemStack istack) { + if (menu->inv->inventory[MenuInventory::CARRIED].contain(istack.item, istack.quantity)) return true; else - return menu->inv->inventory[MenuInventory::EQUIPMENT].contain(item_id, 1); + return menu->inv->inventory[MenuInventory::EQUIPMENT].contain(istack.item, istack.quantity); } void CampaignManager::removeCurrency(int quantity) { @@ -155,12 +154,26 @@ } } -void CampaignManager::removeItem(int item_id) { - if (item_id < 0 || static_cast(item_id) >= items->items.size()) return; - - if (menu->inv->remove(item_id)) { - pc->logMsg(msg->get("%s removed.", items->getItemName(item_id)), Avatar::MSG_UNIQUE); - items->playSound(item_id); +void CampaignManager::removeItem(ItemStack istack) { + if (istack.empty()) + return; + + if (istack.item == eset->misc.currency_id) { + removeCurrency(istack.quantity); + return; + } + + int item_count = menu->inv->inventory[MenuInventory::CARRIED].count(istack.item) + menu->inv->inventory[MenuInventory::EQUIPMENT].count(istack.item); + int max_amount = std::min(item_count, istack.quantity); + + if (menu->inv->remove(istack.item, max_amount)) { + if (max_amount > 1) + pc->logMsg(msg->get("%s x%d removed.", items->getItemName(istack.item), max_amount), Avatar::MSG_UNIQUE); + else if (max_amount == 1) + pc->logMsg(msg->get("%s removed.", items->getItemName(istack.item)), Avatar::MSG_UNIQUE); + + if (max_amount > 0) + items->playSound(istack.item); } } @@ -170,11 +183,14 @@ menu->inv->add(istack, MenuInventory::CARRIED, ItemStorage::NO_SLOT, MenuInventory::ADD_PLAY_SOUND, MenuInventory::ADD_AUTO_EQUIP); - if (istack.item != eset->misc.currency_id) { - if (istack.quantity <= 1) - pc->logMsg(msg->get("You receive %s.", items->getItemName(istack.item)), Avatar::MSG_UNIQUE); + if (istack.item == eset->misc.currency_id) { + pc->logMsg(msg->get("You receive %d %s.", istack.quantity, eset->loot.currency), Avatar::MSG_UNIQUE); + } + else { if (istack.quantity > 1) pc->logMsg(msg->get("You receive %s x%d.", items->getItemName(istack.item), istack.quantity), Avatar::MSG_UNIQUE); + else if (istack.quantity == 1) + pc->logMsg(msg->get("You receive %s.", items->getItemName(istack.item)), Avatar::MSG_UNIQUE); } } @@ -183,7 +199,6 @@ stack.item = eset->misc.currency_id; stack.quantity = amount; - pc->logMsg(msg->get("You receive %d %s.", amount, eset->loot.currency), Avatar::MSG_UNIQUE); rewardItem(stack); } @@ -239,11 +254,11 @@ return true; } else if (ec.type == EventComponent::REQUIRES_ITEM) { - if (checkItem(ec.x)) + if (checkItem(ItemStack(ec.id, ec.x))) return true; } else if (ec.type == EventComponent::REQUIRES_NOT_ITEM) { - if (!checkItem(ec.x)) + if (!checkItem(ItemStack(ec.id, ec.x))) return true; } else if (ec.type == EventComponent::REQUIRES_LEVEL) { diff --git a/src/CampaignManager.h b/src/CampaignManager.h index 8623dad..e90ee78 100644 --- a/src/CampaignManager.h +++ b/src/CampaignManager.h @@ -49,9 +49,9 @@ void resetAllStatuses(); void getSetStatusStrings(std::vector& status_strings); bool checkCurrency(int quantity); - bool checkItem(int item_id); + bool checkItem(ItemStack istack); void removeCurrency(int quantity); - void removeItem(int item_id); + void removeItem(ItemStack istack); void rewardItem(ItemStack istack); void rewardCurrency(int amount); void rewardXP(int amount, bool show_message); diff --git a/src/CombatText.cpp b/src/CombatText.cpp index dff3693..b2f7da1 100644 --- a/src/CombatText.cpp +++ b/src/CombatText.cpp @@ -42,9 +42,12 @@ , floating_offset(0) , text("") , displaytype(0) + , is_int(false) + , int_value(0) {} Combat_Text_Item::~Combat_Text_Item() { + // label deletion is handled by CombatText class } CombatText::CombatText() { @@ -55,6 +58,7 @@ msg_color[MSG_MISS] = font->getColor(FontEngine::COLOR_COMBAT_MISS); duration = settings->max_frames_per_sec; // 1 second + fade_duration = 0; speed = 60.f / settings->max_frames_per_sec; offset = 48; // average height of flare-game enemies, so a sensible default @@ -75,12 +79,19 @@ // @ATTR offset|int|The vertical offset for the combat text's starting position. offset = Parse::toInt(infile.val); } + else if (infile.key == "fade_duration") { + // @ATTR fade_duration|duration|How long the combat text will spend fading out in 'ms' or 's'. + fade_duration = Parse::toDuration(infile.val); + } else { infile.error("CombatText: '%s' is not a valid key.",infile.key.c_str()); } } infile.close(); } + + if (fade_duration > duration) + fade_duration = duration; } CombatText::~CombatText() { @@ -92,39 +103,56 @@ } void CombatText::addString(const std::string& message, const FPoint& location, int displaytype) { - if (settings->combat_text) { - Combat_Text_Item *c = new Combat_Text_Item(); - WidgetLabel *label = new WidgetLabel(); - c->pos.x = location.x; - c->pos.y = location.y; - c->floating_offset = static_cast(offset); - c->label = label; - c->text = message; - c->lifespan = duration; - c->displaytype = displaytype; - - c->label->setPos(static_cast(c->pos.x), static_cast(c->pos.y)); - c->label->setJustify(FontEngine::JUSTIFY_CENTER); - c->label->setVAlign(LabelInfo::VALIGN_BOTTOM); - c->label->setText(c->text); - c->label->setColor(msg_color[c->displaytype]); - combat_text.push_back(*c); - delete c; - } + if (!settings->combat_text) + return; + + Combat_Text_Item c; + c.pos.x = location.x; + c.pos.y = location.y; + c.floating_offset = static_cast(offset); + c.text = message; + c.lifespan = duration; + c.displaytype = displaytype; + + c.label = new WidgetLabel(); + c.label->setPos(static_cast(c.pos.x), static_cast(c.pos.y)); + c.label->setJustify(FontEngine::JUSTIFY_CENTER); + c.label->setVAlign(LabelInfo::VALIGN_BOTTOM); + c.label->setText(c.text); + c.label->setColor(msg_color[c.displaytype]); + combat_text.push_back(c); } void CombatText::addInt(int num, const FPoint& location, int displaytype) { - if (settings->combat_text) { - std::stringstream ss; - ss << num; - addString(ss.str(), location, displaytype); - } + if (!settings->combat_text) + return; + + std::stringstream ss; + + // when adding multiple combat text of the same type and position on the same frame, add the num to the existing text + for (std::vector::iterator it = combat_text.begin(); it != combat_text.end(); ++it) { + if (it->is_int && it->displaytype == displaytype && it->lifespan == duration && it->pos.x == location.x && it->pos.y == location.y) { + it->int_value += num; + ss << it->int_value; + it->text = ss.str(); + it->label->setText(ss.str()); + return; + } + } + + ss << num; + addString(ss.str(), location, displaytype); + + combat_text.back().is_int = true; + combat_text.back().int_value = num; } void CombatText::logic(const FPoint& _cam) { cam = _cam; - for(std::vector::iterator it = combat_text.begin(); it != combat_text.end(); ++it) { + for(std::vector::iterator it = combat_text.end(); it != combat_text.begin();) { + it--; + it->lifespan--; it->floating_offset += speed; @@ -133,6 +161,21 @@ scr_pos.y -= static_cast(it->floating_offset); it->label->setPos(scr_pos.x, scr_pos.y); + + // try to prevent messages from overlapping + for (std::vector::iterator overlap_it = it; overlap_it != combat_text.begin();) { + overlap_it--; + Rect bounds = *(it->label->getBounds()); + Rect overlap_bounds = *(overlap_it->label->getBounds()); + if (Utils::rectsOverlap(bounds, overlap_bounds)) { + overlap_it->floating_offset += static_cast(overlap_bounds.h + (overlap_bounds.y - bounds.y)); + + scr_pos = Utils::mapToScreen(overlap_it->pos.x, overlap_it->pos.y, cam.x, cam.y); + scr_pos.y -= static_cast(overlap_it->floating_offset); + + overlap_it->label->setPos(scr_pos.x, scr_pos.y); + } + } } // delete expired messages @@ -146,11 +189,19 @@ if (!settings->show_hud) return; for(std::vector::iterator it = combat_text.begin(); it != combat_text.end(); ++it) { - if (it->lifespan > 0) + if (it->lifespan > 0) { + // fade out + if (it->lifespan < fade_duration) + it->label->setAlpha(static_cast((static_cast(it->lifespan) / static_cast(fade_duration)) * 255.f)); + it->label->render(); + } } } void CombatText::clear() { - combat_text.clear(); -} + while (combat_text.size()) { + delete combat_text.begin()->label; + combat_text.erase(combat_text.begin()); + } +} diff --git a/src/CombatText.h b/src/CombatText.h index 1a02821..4377672 100644 --- a/src/CombatText.h +++ b/src/CombatText.h @@ -44,6 +44,8 @@ float floating_offset; std::string text; int displaytype; + bool is_int; + int int_value; }; class CombatText { @@ -70,6 +72,7 @@ Color msg_color[5]; int duration; + int fade_duration; float speed; int offset; }; diff --git a/src/CursorManager.cpp b/src/CursorManager.cpp index dc254dc..578b652 100644 --- a/src/CursorManager.cpp +++ b/src/CursorManager.cpp @@ -30,8 +30,13 @@ , cursor_interact(NULL) , cursor_talk(NULL) , cursor_attack(NULL) + , cursor_lhp_normal(NULL) + , cursor_lhp_interact(NULL) + , cursor_lhp_talk(NULL) + , cursor_lhp_attack(NULL) , cursor_current(NULL) - , offset_current(NULL) { + , offset_current(NULL) + , low_hp(false) { Image *graphics; FileParser infile; // @CLASS CursorManager|Description of engine/mouse_cursor.txt @@ -73,6 +78,44 @@ } offset_attack = Parse::toPoint(infile.val); } + else if (infile.key == "lowhp_normal") { + // @ATTR lowhp_normal|filename|Filename of an image for the normal cursor when health is low. + graphics = render_device->loadImage(Parse::popFirstString(infile.val), RenderDevice::ERROR_NORMAL); + if (graphics) { + cursor_lhp_normal = graphics->createSprite(); + graphics->unref(); + } + offset_lhp_normal = Parse::toPoint(infile.val); + } + else if (infile.key == "lowhp_interact") { + // @ATTR lowhp_interact|filename|Filename of an image for the object interaction cursor when health is low. + graphics = render_device->loadImage(Parse::popFirstString(infile.val), RenderDevice::ERROR_NORMAL); + if (graphics) { + cursor_lhp_interact = graphics->createSprite(); + graphics->unref(); + } + offset_lhp_interact = Parse::toPoint(infile.val); + } + else if (infile.key == "lowhp_talk") { + // @ATTR lowhp_talk|filename|Filename of an image for the NPC interaction cursor when health is low. + graphics = render_device->loadImage(Parse::popFirstString(infile.val), RenderDevice::ERROR_NORMAL); + if (graphics) { + cursor_lhp_talk = graphics->createSprite(); + graphics->unref(); + } + offset_lhp_talk = Parse::toPoint(infile.val); + } + else if (infile.key == "lowhp_attack") { + // @ATTR lowhp_attack|filename|Filename of an image for the cursor when attacking enemies and health is low. + graphics = render_device->loadImage(Parse::popFirstString(infile.val), RenderDevice::ERROR_NORMAL); + if (graphics) { + cursor_lhp_attack = graphics->createSprite(); + graphics->unref(); + } + offset_lhp_attack = Parse::toPoint(infile.val); + } + + else { infile.error("CursorManager: '%s' is not a valid key.", infile.key.c_str()); } @@ -86,6 +129,10 @@ if (cursor_interact) delete cursor_interact; if (cursor_talk) delete cursor_talk; if (cursor_attack) delete cursor_attack; + if (cursor_lhp_normal) delete cursor_lhp_normal; + if (cursor_lhp_interact) delete cursor_lhp_interact; + if (cursor_lhp_talk) delete cursor_lhp_talk; + if (cursor_lhp_attack) delete cursor_lhp_attack; } void CursorManager::logic() { @@ -100,15 +147,7 @@ cursor_current = NULL; offset_current = NULL; - if (cursor_normal) { - inpt->hideCursor(); - cursor_current = cursor_normal; - offset_current = &offset_normal; - } - else { - // system cursor - inpt->showCursor(); - } + setCursor(CURSOR_NORMAL); } void CursorManager::render() { @@ -126,28 +165,56 @@ } } +void CursorManager::setLowHP(bool val) { + low_hp = val; +} + void CursorManager::setCursor(int type) { if (settings->hardware_cursor) return; - if (type == CURSOR_INTERACT && cursor_interact) { - inpt->hideCursor(); - cursor_current = cursor_interact; - offset_current = &offset_interact; - } - else if (type == CURSOR_TALK && cursor_talk) { - inpt->hideCursor(); - cursor_current = cursor_talk; - offset_current = &offset_talk; - } - else if (type == CURSOR_ATTACK && cursor_attack) { - inpt->hideCursor(); - cursor_current = cursor_attack; - offset_current = &offset_attack; - } - else if (cursor_normal) { - inpt->hideCursor(); - cursor_current = cursor_normal; - offset_current = &offset_normal; + if (type == CURSOR_INTERACT && (cursor_interact || (cursor_lhp_interact && low_hp))) { + inpt->hideCursor(); + if (low_hp && cursor_lhp_interact) { + cursor_current = cursor_lhp_interact; + offset_current = &offset_lhp_interact; + } + else if (cursor_interact) { + cursor_current = cursor_interact; + offset_current = &offset_interact; + } + } + else if (type == CURSOR_TALK && (cursor_talk || (cursor_lhp_talk && low_hp))) { + inpt->hideCursor(); + if (low_hp && cursor_lhp_talk) { + cursor_current = cursor_lhp_talk; + offset_current = &offset_lhp_talk; + } + else if (cursor_talk) { + cursor_current = cursor_talk; + offset_current = &offset_talk; + } + } + else if (type == CURSOR_ATTACK && (cursor_attack || (cursor_lhp_attack && low_hp))) { + inpt->hideCursor(); + if (low_hp && cursor_lhp_attack) { + cursor_current = cursor_lhp_attack; + offset_current = &offset_lhp_attack; + } + else if (cursor_attack) { + cursor_current = cursor_attack; + offset_current = &offset_attack; + } + } + else if (cursor_normal || (cursor_lhp_normal && low_hp)) { + inpt->hideCursor(); + if (low_hp && cursor_lhp_normal) { + cursor_current = cursor_lhp_normal; + offset_current = &offset_lhp_normal; + } + else if (cursor_normal) { + cursor_current = cursor_normal; + offset_current = &offset_normal; + } } else { // system cursor diff --git a/src/CursorManager.h b/src/CursorManager.h index 4499515..13d6df9 100644 --- a/src/CursorManager.h +++ b/src/CursorManager.h @@ -28,6 +28,7 @@ ~CursorManager (); void logic(); void render(); + void setLowHP(bool val); void setCursor(int type); bool show_cursor; @@ -36,7 +37,7 @@ CURSOR_NORMAL, CURSOR_INTERACT, CURSOR_TALK, - CURSOR_ATTACK + CURSOR_ATTACK, }; private: @@ -44,14 +45,25 @@ Sprite *cursor_interact; Sprite *cursor_talk; Sprite *cursor_attack; + Sprite *cursor_lhp_normal; + Sprite *cursor_lhp_interact; + Sprite *cursor_lhp_talk; + Sprite *cursor_lhp_attack; Point offset_normal; Point offset_interact; Point offset_talk; Point offset_attack; + Point offset_lhp_normal; + Point offset_lhp_interact; + Point offset_lhp_talk; + Point offset_lhp_attack; + Sprite *cursor_current; Point* offset_current; + + bool low_hp; }; #endif diff --git a/src/EffectManager.cpp b/src/EffectManager.cpp index ba2edc2..19412ec 100644 --- a/src/EffectManager.cpp +++ b/src/EffectManager.cpp @@ -33,7 +33,7 @@ EffectDef::EffectDef() : id("") - , type("") + , type(Effect::NONE) , name("") , icon(-1) , animation("") @@ -50,9 +50,8 @@ : id("") , name("") , icon(-1) - , ticks(0) - , duration(-1) - , type(NONE) + , timer() + , type(Effect::NONE) , magnitude(0) , magnitude_max(0) , animation_name("") @@ -63,7 +62,7 @@ , passive_id(0) , source_type(Power::SOURCE_TYPE_HERO) , group_stack(false) - , color_mod(255, 255, 255) + , color_mod(Color(255,255,255).encodeRGBA()) , alpha_mod(255) , attack_speed_anim("") { } @@ -78,17 +77,18 @@ return *this; unloadAnimation(); + animation_name = other.animation_name; + loadAnimation(animation_name); + if (animation && other.animation) + animation->syncTo(other.animation); id = other.id; name = other.name; icon = other.icon; - ticks = other.ticks; - duration = other.duration; + timer = other.timer; type = other.type; magnitude = other.magnitude; magnitude_max = other.magnitude_max; - animation_name = other.animation_name; - loadAnimation(animation_name); item = other.item; trigger = other.trigger; render_above = other.render_above; @@ -122,6 +122,103 @@ delete animation; animation = NULL; } +} + +int Effect::getTypeFromString(const std::string& type_str) { + if (type_str.empty()) return Effect::NONE; + + if (type_str == "damage") return Effect::DAMAGE; + else if (type_str == "damage_percent") return Effect::DAMAGE_PERCENT; + else if (type_str == "hpot") return Effect::HPOT; + else if (type_str == "hpot_percent") return Effect::HPOT_PERCENT; + else if (type_str == "mpot") return Effect::MPOT; + else if (type_str == "mpot_percent") return Effect::MPOT_PERCENT; + else if (type_str == "speed") return Effect::SPEED; + else if (type_str == "attack_speed") return Effect::ATTACK_SPEED; + else if (type_str == "immunity") return Effect::IMMUNITY; + else if (type_str == "immunity_damage") return Effect::IMMUNITY_DAMAGE; + else if (type_str == "immunity_slow") return Effect::IMMUNITY_SLOW; + else if (type_str == "immunity_stun") return Effect::IMMUNITY_STUN; + else if (type_str == "immunity_hp_steal") return Effect::IMMUNITY_HP_STEAL; + else if (type_str == "immunity_mp_steal") return Effect::IMMUNITY_MP_STEAL; + else if (type_str == "immunity_knockback") return Effect::IMMUNITY_KNOCKBACK; + else if (type_str == "immunity_damage_reflect") return Effect::IMMUNITY_DAMAGE_REFLECT; + else if (type_str == "immunity_stat_debuff") return Effect::IMMUNITY_STAT_DEBUFF; + else if (type_str == "stun") return Effect::STUN; + else if (type_str == "revive") return Effect::REVIVE; + else if (type_str == "convert") return Effect::CONVERT; + else if (type_str == "fear") return Effect::FEAR; + else if (type_str == "death_sentence") return Effect::DEATH_SENTENCE; + else if (type_str == "shield") return Effect::SHIELD; + else if (type_str == "heal") return Effect::HEAL; + else if (type_str == "knockback") return Effect::KNOCKBACK; + else { + for (int i=0; idamage_types.list.size(); ++i) { + if (type_str == eset->damage_types.list[i].min) { + return Effect::TYPE_COUNT + Stats::COUNT + static_cast(i*2); + } + else if (type_str == eset->damage_types.list[i].max) { + return Effect::TYPE_COUNT + Stats::COUNT + static_cast(i*2) + 1; + } + } + + for (size_t i=0; ielements.list.size(); ++i) { + if (type_str == eset->elements.list[i].id + "_resist") { + return Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count + i); + } + } + + for (size_t i=0; iprimary_stats.list.size(); ++i) { + if (type_str == eset->primary_stats.list[i].id) { + return Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) + static_cast(eset->elements.list.size() + i); + } + } + } + + Utils::logError("EffectManager: '%s' is not a valid effect type.", type_str.c_str()); + return Effect::NONE; +} + +bool Effect::typeIsStat(int t) { + return t >= Effect::TYPE_COUNT && t < Effect::TYPE_COUNT + Stats::COUNT; +} + +bool Effect::typeIsDmgMin(int t) { + return t >= Effect::TYPE_COUNT + Stats::COUNT && t < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) && (t - Stats::COUNT - Effect::TYPE_COUNT) % 2 == 0; +} + +bool Effect::typeIsDmgMax(int t) { + return t >= Effect::TYPE_COUNT + Stats::COUNT && t < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) && (t - Stats::COUNT - Effect::TYPE_COUNT) % 2 == 1; +} + +bool Effect::typeIsResist(int t) { + return t >= Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) && t < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) + static_cast(eset->elements.list.size()); +} + +bool Effect::typeIsPrimary(int t) { + return t >= Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) + static_cast(eset->elements.list.size()) && t < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) + static_cast(eset->elements.list.size()) + static_cast(eset->primary_stats.list.size()); +} + +int Effect::getStatFromType(int t) { + return t - Effect::TYPE_COUNT; +} + +size_t Effect::getDmgFromType(int t) { + return static_cast(t - Effect::TYPE_COUNT - Stats::COUNT); +} + +size_t Effect::getResistFromType(int t) { + return static_cast(t - Effect::TYPE_COUNT - Stats::COUNT) - eset->damage_types.count; +} + +size_t Effect::getPrimaryFromType(int t) { + return static_cast(t - Effect::TYPE_COUNT - Stats::COUNT) - eset->damage_types.count - eset->elements.list.size(); } EffectManager::EffectManager() @@ -180,123 +277,122 @@ void EffectManager::logic() { clearStatus(); - for (unsigned i=0; i= 0) { - if (effect_list[i].duration > 0) { - if (effect_list[i].ticks > 0) effect_list[i].ticks--; - if (effect_list[i].ticks == 0) { - //death sentence is only applied at the end of the timer - // @TYPE death_sentence|Causes sudden death at the end of the effect duration. - if (effect_list[i].type == Effect::DEATH_SENTENCE) death_sentence = true; - removeEffect(i); - i--; - continue; - } - } - - // @TYPE damage|Damage per second - if (effect_list[i].type == Effect::DAMAGE && effect_list[i].ticks % settings->max_frames_per_sec == 1) damage += effect_list[i].magnitude; - // @TYPE damage_percent|Damage per second (percentage of max HP) - else if (effect_list[i].type == Effect::DAMAGE_PERCENT && effect_list[i].ticks % settings->max_frames_per_sec == 1) damage_percent += effect_list[i].magnitude; - // @TYPE hpot|HP restored per second - else if (effect_list[i].type == Effect::HPOT && effect_list[i].ticks % settings->max_frames_per_sec == 1) hpot += effect_list[i].magnitude; - // @TYPE hpot_percent|HP restored per second (percentage of max HP) - else if (effect_list[i].type == Effect::HPOT_PERCENT && effect_list[i].ticks % settings->max_frames_per_sec == 1) hpot_percent += effect_list[i].magnitude; - // @TYPE mpot|MP restored per second - else if (effect_list[i].type == Effect::MPOT && effect_list[i].ticks % settings->max_frames_per_sec == 1) mpot += effect_list[i].magnitude; - // @TYPE mpot_percent|MP restored per second (percentage of max MP) - else if (effect_list[i].type == Effect::MPOT_PERCENT && effect_list[i].ticks % settings->max_frames_per_sec == 1) mpot_percent += effect_list[i].magnitude; - // @TYPE speed|Changes movement speed. A magnitude of 100 is 100% speed (aka normal speed). - else if (effect_list[i].type == Effect::SPEED) speed = (static_cast(effect_list[i].magnitude) * speed) / 100.f; - // @TYPE attack_speed|Changes attack speed. A magnitude of 100 is 100% speed (aka normal speed). - // attack speed is calculated when getAttackSpeed() is called - - // @TYPE immunity|Applies all immunity effects. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY) { - immunity_damage = true; - immunity_slow = true; - immunity_stun = true; - immunity_hp_steal = true; - immunity_mp_steal = true; - immunity_knockback = true; - immunity_damage_reflect = true; - immunity_stat_debuff = true; - } - // @TYPE immunity_damage|Removes and prevents damage over time. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY_DAMAGE) immunity_damage = true; - // @TYPE immunity_slow|Removes and prevents slow effects. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY_SLOW) immunity_slow = true; - // @TYPE immunity_stun|Removes and prevents stun effects. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY_STUN) immunity_stun = true; - // @TYPE immunity_hp_steal|Prevents HP stealing. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY_HP_STEAL) immunity_hp_steal = true; - // @TYPE immunity_mp_steal|Prevents MP stealing. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY_MP_STEAL) immunity_mp_steal = true; - // @TYPE immunity_knockback|Removes and prevents knockback effects. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY_KNOCKBACK) immunity_knockback = true; - // @TYPE immunity_damage_reflect|Prevents damage reflection. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY_DAMAGE_REFLECT) immunity_damage_reflect = true; - // @TYPE immunity_stat_debuff|Prevents stat value altering effects that have a magnitude less than 0. Magnitude is ignored. - else if (effect_list[i].type == Effect::IMMUNITY_STAT_DEBUFF) immunity_stat_debuff = true; - - // @TYPE stun|Can't move or attack. Being attacked breaks stun. - else if (effect_list[i].type == Effect::STUN) stun = true; - // @TYPE revive|Revives the player. Typically attached to a power that triggers when the player dies. - else if (effect_list[i].type == Effect::REVIVE) revive = true; - // @TYPE convert|Causes an enemy or an ally to switch allegiance - else if (effect_list[i].type == Effect::CONVERT) convert = true; - // @TYPE fear|Causes enemies to run away - else if (effect_list[i].type == Effect::FEAR) fear = true; - // @TYPE knockback|Pushes the target away from the source caster. Speed is the given value divided by the framerate cap. - else if (effect_list[i].type == Effect::KNOCKBACK) knockback_speed = static_cast(effect_list[i].magnitude)/static_cast(settings->max_frames_per_sec); - - // @TYPE ${STATNAME}|Increases ${STATNAME}, where ${STATNAME} is any of the base stats. Examples: hp, avoidance, xp_gain - // @TYPE ${DAMAGE_TYPE}|Increases a damage min or max, where ${DAMAGE_TYPE} is any 'min' or 'max' value found in engine/damage_types.txt. Example: dmg_melee_min - else if (effect_list[i].type >= Effect::TYPE_COUNT && effect_list[i].type < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count)) { - bonus[effect_list[i].type - Effect::TYPE_COUNT] += effect_list[i].magnitude; - } - // else if (effect_list[i].type >= Effect::TYPE_COUNT + Stats::COUNT && effect_list[i].type < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count)) { - // bonus[effect_list[i].type - Effect::TYPE_COUNT] += effect_list[i].magnitude; - // } - // @TYPE ${ELEMENT}_resist|Increase Resistance % to ${ELEMENT}, where ${ELEMENT} is any found in engine/elements.txt. Example: fire_resist - else if (effect_list[i].type >= Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) && effect_list[i].type < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) + static_cast(eset->elements.list.size())) { - bonus_resist[effect_list[i].type - Effect::TYPE_COUNT - Stats::COUNT - eset->damage_types.count] += effect_list[i].magnitude; - } - // @TYPE ${PRIMARYSTAT}|Increases ${PRIMARYSTAT}, where ${PRIMARYSTAT} is any of the primary stats defined in engine/primary_stats.txt. Example: physical - else if (effect_list[i].type >= Effect::TYPE_COUNT) { - bonus_primary[effect_list[i].type - Effect::TYPE_COUNT - Stats::COUNT - eset->damage_types.count - eset->elements.list.size()] += effect_list[i].magnitude; - } - } - // expire shield effects - if (effect_list[i].magnitude_max > 0 && effect_list[i].magnitude == 0) { - // @TYPE shield|Create a damage absorbing barrier based on Mental damage stat. Duration is ignored. - if (effect_list[i].type == Effect::SHIELD) { + if (ei.timer.getDuration() > 0) { + if (ei.timer.isEnd()) { + //death sentence is only applied at the end of the timer + // @TYPE death_sentence|Causes sudden death at the end of the effect duration. + if (ei.type == Effect::DEATH_SENTENCE) death_sentence = true; removeEffect(i); i--; continue; } } - // expire effects based on animations - if ((effect_list[i].animation && effect_list[i].animation->isLastFrame()) || !effect_list[i].animation) { - // @TYPE heal|Restore HP based on Mental damage stat. - if (effect_list[i].type == Effect::HEAL) { + + // @TYPE damage|Damage per second + if (ei.type == Effect::DAMAGE && ei.timer.isWholeSecond()) damage += ei.magnitude; + // @TYPE damage_percent|Damage per second (percentage of max HP) + else if (ei.type == Effect::DAMAGE_PERCENT && ei.timer.isWholeSecond()) damage_percent += ei.magnitude; + // @TYPE hpot|HP restored per second + else if (ei.type == Effect::HPOT && ei.timer.isWholeSecond()) hpot += ei.magnitude; + // @TYPE hpot_percent|HP restored per second (percentage of max HP) + else if (ei.type == Effect::HPOT_PERCENT && ei.timer.isWholeSecond()) hpot_percent += ei.magnitude; + // @TYPE mpot|MP restored per second + else if (ei.type == Effect::MPOT && ei.timer.isWholeSecond()) mpot += ei.magnitude; + // @TYPE mpot_percent|MP restored per second (percentage of max MP) + else if (ei.type == Effect::MPOT_PERCENT && ei.timer.isWholeSecond()) mpot_percent += ei.magnitude; + // @TYPE speed|Changes movement speed. A magnitude of 100 is 100% speed (aka normal speed). + else if (ei.type == Effect::SPEED) speed = (static_cast(ei.magnitude) * speed) / 100.f; + // @TYPE attack_speed|Changes attack speed. A magnitude of 100 is 100% speed (aka normal speed). + // attack speed is calculated when getAttackSpeed() is called + + // @TYPE immunity|Applies all immunity effects. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY) { + immunity_damage = true; + immunity_slow = true; + immunity_stun = true; + immunity_hp_steal = true; + immunity_mp_steal = true; + immunity_knockback = true; + immunity_damage_reflect = true; + immunity_stat_debuff = true; + } + // @TYPE immunity_damage|Removes and prevents damage over time. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY_DAMAGE) immunity_damage = true; + // @TYPE immunity_slow|Removes and prevents slow effects. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY_SLOW) immunity_slow = true; + // @TYPE immunity_stun|Removes and prevents stun effects. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY_STUN) immunity_stun = true; + // @TYPE immunity_hp_steal|Prevents HP stealing. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY_HP_STEAL) immunity_hp_steal = true; + // @TYPE immunity_mp_steal|Prevents MP stealing. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY_MP_STEAL) immunity_mp_steal = true; + // @TYPE immunity_knockback|Removes and prevents knockback effects. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY_KNOCKBACK) immunity_knockback = true; + // @TYPE immunity_damage_reflect|Prevents damage reflection. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY_DAMAGE_REFLECT) immunity_damage_reflect = true; + // @TYPE immunity_stat_debuff|Prevents stat value altering effects that have a magnitude less than 0. Magnitude is ignored. + else if (ei.type == Effect::IMMUNITY_STAT_DEBUFF) immunity_stat_debuff = true; + + // @TYPE stun|Can't move or attack. Being attacked breaks stun. + else if (ei.type == Effect::STUN) stun = true; + // @TYPE revive|Revives the player. Typically attached to a power that triggers when the player dies. + else if (ei.type == Effect::REVIVE) revive = true; + // @TYPE convert|Causes an enemy or an ally to switch allegiance + else if (ei.type == Effect::CONVERT) convert = true; + // @TYPE fear|Causes enemies to run away + else if (ei.type == Effect::FEAR) fear = true; + // @TYPE knockback|Pushes the target away from the source caster. Speed is the given value divided by the framerate cap. + else if (ei.type == Effect::KNOCKBACK) knockback_speed = static_cast(ei.magnitude)/static_cast(settings->max_frames_per_sec); + + // @TYPE ${STATNAME}|Increases ${STATNAME}, where ${STATNAME} is any of the base stats. Examples: hp, avoidance, xp_gain + // @TYPE ${DAMAGE_TYPE}|Increases a damage min or max, where ${DAMAGE_TYPE} is any 'min' or 'max' value found in engine/damage_types.txt. Example: dmg_melee_min + else if (ei.type >= Effect::TYPE_COUNT && ei.type < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count)) { + bonus[ei.type - Effect::TYPE_COUNT] += ei.magnitude; + } + // @TYPE ${ELEMENT}_resist|Increase Resistance % to ${ELEMENT}, where ${ELEMENT} is any found in engine/elements.txt. Example: fire_resist + else if (ei.type >= Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) && ei.type < Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) + static_cast(eset->elements.list.size())) { + bonus_resist[ei.type - Effect::TYPE_COUNT - Stats::COUNT - eset->damage_types.count] += ei.magnitude; + } + // @TYPE ${PRIMARYSTAT}|Increases ${PRIMARYSTAT}, where ${PRIMARYSTAT} is any of the primary stats defined in engine/primary_stats.txt. Example: physical + else if (ei.type >= Effect::TYPE_COUNT) { + bonus_primary[ei.type - Effect::TYPE_COUNT - Stats::COUNT - eset->damage_types.count - eset->elements.list.size()] += ei.magnitude; + } + + ei.timer.tick(); + + // expire shield effects + if (ei.magnitude_max > 0 && ei.magnitude == 0) { + // @TYPE shield|Create a damage absorbing barrier based on Mental damage stat. Duration is ignored. + if (ei.type == Effect::SHIELD) { removeEffect(i); i--; continue; } } + // expire effects based on animations + if ((ei.animation && ei.animation->isLastFrame()) || !ei.animation) { + // @TYPE heal|Restore HP based on Mental damage stat. + if (ei.type == Effect::HEAL) { + removeEffect(i); + i--; + continue; + } + } // animate - if (effect_list[i].animation) { - if (!effect_list[i].animation->isCompleted()) - effect_list[i].animation->advanceFrame(); - } - } -} - -void EffectManager::addEffect(EffectDef &effect, int duration, int magnitude, int source_type, size_t power_id) { + if (ei.animation) { + if (!ei.animation->isCompleted()) + ei.animation->advanceFrame(); + } + } +} + +void EffectManager::addEffect(EffectDef &effect, int duration, int magnitude, int source_type, PowerID power_id) { addEffectInternal(effect, duration, magnitude, source_type, false, power_id); } @@ -305,63 +401,61 @@ addEffectInternal(effect, duration, magnitude, Power::SOURCE_TYPE_HERO, true, NO_POWER); } -void EffectManager::addEffectInternal(EffectDef &effect, int duration, int magnitude, int source_type, bool item, size_t power_id) { - int effect_type = getType(effect.type); +void EffectManager::addEffectInternal(EffectDef &effect, int duration, int magnitude, int source_type, bool item, PowerID power_id) { refresh_stats = true; // if we're already immune, don't add negative effects - if (immunity_damage && (effect_type == Effect::DAMAGE || effect_type == Effect::DAMAGE_PERCENT)) + if (immunity_damage && (effect.type == Effect::DAMAGE || effect.type == Effect::DAMAGE_PERCENT)) return; - else if (immunity_slow && effect_type == Effect::SPEED && magnitude < 100) + else if (immunity_slow && effect.type == Effect::SPEED && magnitude < 100) return; - else if (immunity_stun && effect_type == Effect::STUN) + else if (immunity_stun && effect.type == Effect::STUN) return; - else if (immunity_knockback && effect_type == Effect::KNOCKBACK) + else if (immunity_knockback && effect.type == Effect::KNOCKBACK) return; - else if (immunity_stat_debuff && effect_type > Effect::TYPE_COUNT && magnitude < 0) + else if (immunity_stat_debuff && effect.type > Effect::TYPE_COUNT && magnitude < 0) return; // only allow one knockback effect at a time - if (effect_type == Effect::KNOCKBACK && knockback_speed != 0) + if (effect.type == Effect::KNOCKBACK && knockback_speed != 0) return; - if (effect_type == Effect::ATTACK_SPEED && magnitude < 100) { - Utils::logInfo("EffectManager: Attack speeds less than 100 are unsupported."); - return; - } - bool insert_effect = false; + size_t insert_pos; int stacks_applied = 0; - size_t insert_pos; int trigger = power_id > 0 ? powers->powers[power_id].passive_trigger : -1; size_t passive_id = (power_id > 0 && powers->powers[power_id].passive) ? power_id : 0; for (size_t i=effect_list.size(); i>0; i--) { - if (effect_list[i-1].id == effect.id) { - if (trigger > -1 && effect_list[i-1].trigger == trigger) + Effect& ei = effect_list[i-1]; + + // while checking only id would be sufficient, it is a slow string compare + // so we check the type first, which is an int compare, before taking the slow path + if (ei.type == effect.type && ei.id == effect.id) { + if (trigger > -1 && ei.trigger == trigger) return; // trigger effects can only be cast once per trigger if (!effect.can_stack) { removeEffect(i-1); } else{ - if(effect_type == Effect::SHIELD && effect.group_stack){ - effect_list[i-1].magnitude += magnitude; - - if(effect.max_stacks == -1 - || (magnitude != 0 && effect_list[i-1].magnitude_max/magnitude < effect.max_stacks)){ - effect_list[i-1].magnitude_max += magnitude; + if (effect.type == Effect::SHIELD && effect.group_stack){ + ei.magnitude += magnitude; + + if (effect.max_stacks == -1 + || (magnitude != 0 && ei.magnitude_max/magnitude < effect.max_stacks)){ + ei.magnitude_max += magnitude; } - if(effect_list[i-1].magnitude > effect_list[i-1].magnitude_max){ - effect_list[i-1].magnitude = effect_list[i-1].magnitude_max; + if (ei.magnitude > ei.magnitude_max){ + ei.magnitude = ei.magnitude_max; } return; } - if (insert_effect == false) { - // to keep matching effects together, they are inserted after the most recent matching effect + if (insert_effect == false && effect.max_stacks != -1) { + // to keep stackable effects together, they are inserted after the most recent matching effect // otherwise, they are added to the end of the effect list insert_effect = true; insert_pos = i; @@ -371,15 +465,15 @@ } } // if we're adding an immunity effect, remove all negative effects - if (effect_type == Effect::IMMUNITY) + if (effect.type == Effect::IMMUNITY) clearNegativeEffects(); - else if (effect_type == Effect::IMMUNITY_DAMAGE) + else if (effect.type == Effect::IMMUNITY_DAMAGE) clearNegativeEffects(Effect::IMMUNITY_DAMAGE); - else if (effect_type == Effect::IMMUNITY_SLOW) + else if (effect.type == Effect::IMMUNITY_SLOW) clearNegativeEffects(Effect::IMMUNITY_SLOW); - else if (effect_type == Effect::IMMUNITY_STUN) + else if (effect.type == Effect::IMMUNITY_STUN) clearNegativeEffects(Effect::IMMUNITY_STUN); - else if (effect_type == Effect::IMMUNITY_KNOCKBACK) + else if (effect.type == Effect::IMMUNITY_KNOCKBACK) clearNegativeEffects(Effect::IMMUNITY_KNOCKBACK); } @@ -388,36 +482,38 @@ e.id = effect.id; e.name = effect.name; e.icon = effect.icon; - e.type = effect_type; + e.type = effect.type; e.render_above = effect.render_above; e.group_stack = effect.group_stack; - e.color_mod = effect.color_mod; + e.color_mod = effect.color_mod.encodeRGBA(); e.alpha_mod = effect.alpha_mod; e.attack_speed_anim = effect.attack_speed_anim; - if (effect.animation != "") { + if (!effect.animation.empty()) { e.loadAnimation(effect.animation); } - e.ticks = e.duration = duration; + e.timer.setDuration(duration); e.magnitude = e.magnitude_max = magnitude; e.item = item; e.trigger = trigger; e.passive_id = passive_id; e.source_type = source_type; - if(insert_effect && effect.max_stacks != -1 && stacks_applied >= effect.max_stacks){ - //Remove the oldest effect of the type - removeEffect(insert_pos-stacks_applied); - - //All elemnts have shiftef to left - insert_pos--; - } - - if (insert_effect) + if (insert_effect) { + if (effect.max_stacks != -1 && stacks_applied >= effect.max_stacks){ + //Remove the oldest effect of the type + removeEffect(insert_pos-stacks_applied); + + //All elements have shifted to left + insert_pos--; + } + effect_list.insert(effect_list.begin() + insert_pos, e); - else + } + else { effect_list.push_back(e); + } } void EffectManager::removeEffect(size_t id) { @@ -513,67 +609,6 @@ return over_dmg; } -int EffectManager::getType(const std::string& type) { - if (type.empty()) return Effect::NONE; - - if (type == "damage") return Effect::DAMAGE; - else if (type == "damage_percent") return Effect::DAMAGE_PERCENT; - else if (type == "hpot") return Effect::HPOT; - else if (type == "hpot_percent") return Effect::HPOT_PERCENT; - else if (type == "mpot") return Effect::MPOT; - else if (type == "mpot_percent") return Effect::MPOT_PERCENT; - else if (type == "speed") return Effect::SPEED; - else if (type == "attack_speed") return Effect::ATTACK_SPEED; - else if (type == "immunity") return Effect::IMMUNITY; - else if (type == "immunity_damage") return Effect::IMMUNITY_DAMAGE; - else if (type == "immunity_slow") return Effect::IMMUNITY_SLOW; - else if (type == "immunity_stun") return Effect::IMMUNITY_STUN; - else if (type == "immunity_hp_steal") return Effect::IMMUNITY_HP_STEAL; - else if (type == "immunity_mp_steal") return Effect::IMMUNITY_MP_STEAL; - else if (type == "immunity_knockback") return Effect::IMMUNITY_KNOCKBACK; - else if (type == "immunity_damage_reflect") return Effect::IMMUNITY_DAMAGE_REFLECT; - else if (type == "immunity_stat_debuff") return Effect::IMMUNITY_STAT_DEBUFF; - else if (type == "stun") return Effect::STUN; - else if (type == "revive") return Effect::REVIVE; - else if (type == "convert") return Effect::CONVERT; - else if (type == "fear") return Effect::FEAR; - else if (type == "death_sentence") return Effect::DEATH_SENTENCE; - else if (type == "shield") return Effect::SHIELD; - else if (type == "heal") return Effect::HEAL; - else if (type == "knockback") return Effect::KNOCKBACK; - else { - for (int i=0; idamage_types.list.size(); i++) { - if (type == eset->damage_types.list[i].min) { - return Effect::TYPE_COUNT + Stats::COUNT + (i*2); - } - else if (type == eset->damage_types.list[i].max) { - return Effect::TYPE_COUNT + Stats::COUNT + (i*2) + 1; - } - } - - for (unsigned i=0; ielements.list[i].id + "_resist") { - return Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) + i; - } - } - - for (unsigned i=0; iprimary_stats.list[i].id) { - return Effect::TYPE_COUNT + Stats::COUNT + static_cast(eset->damage_types.count) + static_cast(eset->elements.list.size()) + i; - } - } - } - - Utils::logError("EffectManager: '%s' is not a valid effect type.", type.c_str()); - return Effect::NONE; -} - bool EffectManager::isDebuffed() { for (size_t i=effect_list.size(); i > 0; i--) { if (effect_list[i-1].type == Effect::DAMAGE) return true; @@ -587,15 +622,16 @@ } void EffectManager::getCurrentColor(Color& color_mod) { - Color default_color = color_mod; - Color no_color = Color(255, 255, 255); - - for (size_t i=effect_list.size(); i > 0; i--) { - if (effect_list[i-1].color_mod == no_color) + uint32_t default_color = color_mod.encodeRGBA(); + uint32_t no_color = Color(255, 255, 255).encodeRGBA(); + + for (size_t i=effect_list.size(); i > 0; i--) { + Effect& ei = effect_list[i-1]; + if (ei.color_mod == no_color) continue; - if (effect_list[i-1].color_mod != default_color) { - color_mod = effect_list[i-1].color_mod; + if (ei.color_mod != default_color) { + color_mod.decodeRGBA(ei.color_mod); return; } } @@ -606,11 +642,12 @@ uint8_t no_alpha = 255; for (size_t i=effect_list.size(); i > 0; i--) { - if (effect_list[i-1].alpha_mod == no_alpha) + Effect& ei = effect_list[i-1]; + if (ei.alpha_mod == no_alpha) continue; - if (effect_list[i-1].alpha_mod != default_alpha) { - alpha_mod = effect_list[i-1].alpha_mod; + if (ei.alpha_mod != default_alpha) { + alpha_mod = ei.alpha_mod; return; } } @@ -644,3 +681,23 @@ return attack_speed; } + +int EffectManager::getDamageSourceType(int dmg_mode) { + if (dmg_mode != Effect::DAMAGE || dmg_mode != Effect::DAMAGE_PERCENT) + return -1; + + int source_type = Power::SOURCE_TYPE_NEUTRAL; + + for (size_t i = 0; i < effect_list.size(); ++i) { + Effect& ei = effect_list[i]; + if (ei.type == dmg_mode) { + // anything other than ally source type take precedence, so we can return early + if (ei.source_type != Power::SOURCE_TYPE_ALLY) + return ei.source_type; + + source_type = ei.source_type; + } + } + + return source_type; +} diff --git a/src/EffectManager.h b/src/EffectManager.h index 6057c57..9fcb4dc 100644 --- a/src/EffectManager.h +++ b/src/EffectManager.h @@ -70,11 +70,21 @@ void loadAnimation(const std::string &s); void unloadAnimation(); + static int getTypeFromString(const std::string& _type); + static bool typeIsStat(int t); + static bool typeIsDmgMin(int t); + static bool typeIsDmgMax(int t); + static bool typeIsResist(int t); + static bool typeIsPrimary(int t); + static int getStatFromType(int t); + static size_t getDmgFromType(int t); + static size_t getResistFromType(int t); + static size_t getPrimaryFromType(int t); + std::string id; std::string name; int icon; - int ticks; - int duration; + Timer timer; int type; int magnitude; int magnitude_max; @@ -86,7 +96,7 @@ size_t passive_id; int source_type; bool group_stack; - Color color_mod; + uint32_t color_mod; uint8_t alpha_mod; std::string attack_speed_anim; }; @@ -96,7 +106,7 @@ EffectDef(); std::string id; - std::string type; + int type; std::string name; int icon; std::string animation; @@ -113,14 +123,13 @@ private: void removeEffect(size_t id); void clearStatus(); - int getType(const std::string& type); - void addEffectInternal(EffectDef &effect, int duration, int magnitude, int source_type, bool item, size_t power_id); + void addEffectInternal(EffectDef &effect, int duration, int magnitude, int source_type, bool item, PowerID power_id); public: EffectManager(); ~EffectManager(); void logic(); - void addEffect(EffectDef &effect, int duration, int magnitude, int source_type, size_t power_id); + void addEffect(EffectDef &effect, int duration, int magnitude, int source_type, PowerID power_id); void addItemEffect(EffectDef &effect, int duration, int magnitude); void removeEffectType(const int type); void removeEffectPassive(size_t id); @@ -135,6 +144,7 @@ void getCurrentAlpha(uint8_t& alpha_mod); bool hasEffect(const std::string& id, int req_count); float getAttackSpeed(const std::string& anim_name); + int getDamageSourceType(int dmg_mode); std::vector effect_list; diff --git a/src/Enemy.cpp b/src/Enemy.cpp deleted file mode 100644 index 38849c9..0000000 --- a/src/Enemy.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* -Copyright © 2011-2012 Clint Bellanger -Copyright © 2012 Stefan Beller -Copyright © 2012-2015 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -#include "Animation.h" -#include "Avatar.h" -#include "BehaviorAlly.h" -#include "BehaviorStandard.h" -#include "CampaignManager.h" -#include "CommonIncludes.h" -#include "Enemy.h" -#include "EnemyBehavior.h" -#include "LootManager.h" -#include "PowerManager.h" -#include "RenderDevice.h" -#include "Settings.h" -#include "SharedGameResources.h" -#include "SharedResources.h" -#include "UtilsMath.h" - -#include -#include - -Enemy::Enemy() : Entity() { - - stats.cur_state = StatBlock::ENEMY_STANCE; - stats.cooldown.reset(Timer::END); - stats.in_combat = false; - stats.join_combat = false; - - reward_xp = false; - instant_power = false; - kill_source_type = Power::SOURCE_TYPE_NEUTRAL; - eb = NULL; -} - -Enemy::Enemy(const Enemy& e) - : Entity(e) - , type(e.type) - , reward_xp(e.reward_xp) - , instant_power(e.instant_power) - , kill_source_type(e.kill_source_type) { - eb = new BehaviorStandard(this); // Putting a 'this' into the init list will make MSVS complain, hence it's in the body of the ctor -} - -Enemy& Enemy::operator=(const Enemy& e) { - if (this == &e) - return *this; - - Entity::operator=(e); - type = e.type; - reward_xp = e.reward_xp; - instant_power = e.instant_power; - kill_source_type = e.kill_source_type; - eb = new BehaviorStandard(this); - - return *this; -} - -/** - * The current direction leads to a wall. Try the next best direction, if one is available. - */ -unsigned char Enemy::faceNextBest(float mapx, float mapy) { - float dx = static_cast(fabs(mapx - stats.pos.x)); - float dy = static_cast(fabs(mapy - stats.pos.y)); - switch (stats.direction) { - case 0: - if (dy > dx) return 7; - else return 1; - case 1: - if (mapy > stats.pos.y) return 0; - else return 2; - case 2: - if (dx > dy) return 1; - else return 3; - case 3: - if (mapx < stats.pos.x) return 2; - else return 4; - case 4: - if (dy > dx) return 3; - else return 5; - case 5: - if (mapy < stats.pos.y) return 4; - else return 6; - case 6: - if (dx > dy) return 5; - else return 7; - case 7: - if (mapx > stats.pos.x) return 6; - else return 0; - } - return 0; -} - -/** - * logic() - * Handle a single frame. This includes: - * - move the enemy based on AI % chances - * - calculate the next frame of animation - */ -void Enemy::logic() { - - eb->logic(); - - //need to check whether the enemy was converted here - //cant do it in behaviour because the behaviour object would be replaced by this - if(stats.effects.convert != stats.converted) { - delete eb; - eb = stats.hero_ally ? new BehaviorStandard(this) : new BehaviorAlly(this); - stats.converted = !stats.converted; - stats.hero_ally = !stats.hero_ally; - if (stats.convert_status != 0) { - camp->setStatus(stats.convert_status); - } - } - - return; -} - -/** - * Upon enemy death, handle rewards (currency, xp, loot) - */ -void Enemy::doRewards(int source_type) { - - if(stats.hero_ally && !stats.converted) - return; - - reward_xp = true; - kill_source_type = source_type; - - // some creatures create special loot if we're on a quest - if (stats.quest_loot_requires_status != 0) { - // the loot manager will check quest_loot_id - // if set (not zero), the loot manager will 100% generate that loot. - if (!(camp->checkStatus(stats.quest_loot_requires_status) && !camp->checkStatus(stats.quest_loot_requires_not_status))) { - stats.quest_loot_id = 0; - } - } - - // some creatures drop special loot the first time they are defeated - // this must be done in conjunction with defeat status - if (stats.first_defeat_loot > 0) { - if (!camp->checkStatus(stats.defeat_status)) { - stats.quest_loot_id = stats.first_defeat_loot; - } - } - - // defeating some creatures (e.g. bosses) affects the story - if (stats.defeat_status != 0) { - camp->setStatus(stats.defeat_status); - } - - loot->addEnemyLoot(this); -} - -/** - * getRender() - * Map objects need to be drawn in Z order, so we allow a parent object (GameEngine) - * to collect all mobile sprites each frame. - */ -Renderable Enemy::getRender() { - Renderable r = activeAnimation->getCurrentFrame(stats.direction); - r.map_pos.x = stats.pos.x; - r.map_pos.y = stats.pos.y; - if (stats.hp > 0) { - if (stats.hero_ally) - r.type = Renderable::TYPE_ALLY; - else if (stats.in_combat) - r.type = Renderable::TYPE_ENEMY; - } - return r; -} - -Enemy::~Enemy() { - delete eb; -} - diff --git a/src/Enemy.h b/src/Enemy.h deleted file mode 100644 index dfcce85..0000000 --- a/src/Enemy.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright © 2011-2012 Clint Bellanger -Copyright © 2012 Stefan Beller -Copyright © 2012-2015 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -/* - * class Enemy - */ - - -#ifndef ENEMY_H -#define ENEMY_H - -#include "CommonIncludes.h" -#include "Entity.h" -#include "Utils.h" - -class EnemyBehavior; - -class Enemy : public Entity { - -public: - Enemy(); - Enemy(const Enemy& e); - Enemy& operator=(const Enemy& e); - ~Enemy(); - void logic(); - unsigned char faceNextBest(float mapx, float mapy); - virtual void doRewards(int source_type); - - std::string type; - - Renderable getRender(); - - EnemyBehavior *eb; - - // other flags - bool reward_xp; - bool instant_power; - int kill_source_type; - -}; - - -#endif - diff --git a/src/EnemyBehavior.cpp b/src/EnemyBehavior.cpp deleted file mode 100644 index 085caa0..0000000 --- a/src/EnemyBehavior.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright © 2012 Clint Bellanger - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -/** - * class EnemyBehavior - * - * Interface for enemy behaviors. - * The behavior object is a component of Enemy. - * Make AI decisions (movement, actions) for enemies. - */ - -#include "EnemyBehavior.h" - -EnemyBehavior::EnemyBehavior(Enemy *_e) { - e = _e; -} - -void EnemyBehavior::logic() { - -} - -EnemyBehavior::~EnemyBehavior() { - -} diff --git a/src/EnemyBehavior.h b/src/EnemyBehavior.h deleted file mode 100644 index 71975f4..0000000 --- a/src/EnemyBehavior.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright © 2012 Clint Bellanger - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -/** - * class EnemyBehavior - * - * Interface for enemy behaviors. - * The behavior object is a component of Enemy. - * Make AI decisions (movement, actions) for enemies. - */ - - -#ifndef ENEMY_BEHAVIOR_H -#define ENEMY_BEHAVIOR_H - -class Enemy; - -class EnemyBehavior { -protected: - Enemy *e; -public: - explicit EnemyBehavior(Enemy *_e); - virtual ~EnemyBehavior(); - virtual void logic(); -}; - -#endif diff --git a/src/EnemyManager.cpp b/src/EnemyManager.cpp deleted file mode 100644 index 9404fc6..0000000 --- a/src/EnemyManager.cpp +++ /dev/null @@ -1,552 +0,0 @@ -/* -Copyright © 2011-2012 Clint Bellanger -Copyright © 2012 Stefan Beller -Copyright © 2013 Henrik Andersson -Copyright © 2012-2016 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -#include "Animation.h" -#include "AnimationManager.h" -#include "AnimationSet.h" -#include "Avatar.h" -#include "BehaviorAlly.h" -#include "BehaviorStandard.h" -#include "CampaignManager.h" -#include "Enemy.h" -#include "EnemyBehavior.h" -#include "EnemyGroupManager.h" -#include "EnemyManager.h" -#include "EngineSettings.h" -#include "EventManager.h" -#include "Hazard.h" -#include "MapRenderer.h" -#include "MenuActionBar.h" -#include "PowerManager.h" -#include "RenderDevice.h" -#include "Settings.h" -#include "SharedGameResources.h" -#include "SharedResources.h" - -#include - -EnemyManager::EnemyManager() - : enemies() - , hero_stealth(0) - , player_blocked(false) - , player_blocked_timer(settings->max_frames_per_sec / 6) { - handleNewMap(); -} - -void EnemyManager::loadAnimations(Enemy *e) { - anim->increaseCount(e->stats.animations); - e->animationSet = anim->getAnimationSet(e->stats.animations); - e->activeAnimation = e->animationSet->getAnimation(""); -} - -Enemy *EnemyManager::getEnemyPrototype(const std::string& type_id) { - Enemy* e = new Enemy(prototypes.at(loadEnemyPrototype(type_id))); - anim->increaseCount(e->stats.animations); - return e; -} - -size_t EnemyManager::loadEnemyPrototype(const std::string& type_id) { - for (size_t i = 0; i < prototypes.size(); i++) { - if (prototypes[i].type == type_id) { - return i; - } - } - - Enemy e = Enemy(); - - e.eb = new BehaviorStandard(&e); - e.stats.load(type_id); - e.type = type_id; - - if (e.stats.animations == "") - Utils::logError("EnemyManager: No animation file specified for entity: %s", type_id.c_str()); - - loadAnimations(&e); - e.loadSounds(); - - // set cooldown_hit to duration of hit animation if undefined - if (!e.stats.cooldown_hit_enabled) { - Animation *hit_anim = e.animationSet->getAnimation("hit"); - if (hit_anim) { - e.stats.cooldown_hit.setDuration(hit_anim->getDuration()); - delete hit_anim; - } - else { - e.stats.cooldown_hit.setDuration(0); - } - } - - prototypes.push_back(e); - size_t prototype = prototypes.size() - 1; - - for (size_t i = 0; i < e.stats.powers_ai.size(); i++) { - int power_index = e.stats.powers_ai[i].id; - const std::string& spawn_type = powers->powers[power_index].spawn_type; - if (power_index != 0 && spawn_type != "" && spawn_type != "untransform") { - std::vector spawn_enemies = enemyg->getEnemiesInCategory(spawn_type); - for (size_t j = 0; j < spawn_enemies.size(); j++) { - loadEnemyPrototype(spawn_enemies[j].type); - } - } - } - - return prototype; -} - -/** - * When loading a new map, we eliminate existing enemies and load the new ones. - * The map will have loaded Entity blocks into an array; retrieve the Enemies and init them - */ -void EnemyManager::handleNewMap () { - - Map_Enemy me; - std::queue allies; - - // delete existing enemies - for (unsigned int i=0; i < enemies.size(); i++) { - anim->decreaseCount(enemies[i]->animationSet->getName()); - if(enemies[i]->stats.hero_ally && !enemies[i]->stats.corpse && enemies[i]->stats.cur_state != StatBlock::ENEMY_DEAD && enemies[i]->stats.cur_state != StatBlock::ENEMY_CRITDEAD && enemies[i]->stats.speed > 0.0f) - allies.push(enemies[i]); - else { - enemies[i]->unloadSounds(); - delete enemies[i]; - } - } - enemies.clear(); - - - for (unsigned int i=0; i < prototypes.size(); i++) { - anim->decreaseCount(prototypes[i].animationSet->getName()); - prototypes[i].unloadSounds(); - } - prototypes.clear(); - - // load new enemies - while (!mapr->enemies.empty()) { - me = mapr->enemies.front(); - mapr->enemies.pop(); - - if (me.type.empty()) { - Utils::logError("EnemyManager: Enemy(%f, %f) doesn't have type attribute set, skipping", me.pos.x, me.pos.y); - continue; - } - - - bool status_reqs_met = true; - //if the status requirements arent met, dont load the enemy - for(unsigned int i = 0; i < me.requires_status.size(); i++) { - if (!camp->checkStatus(me.requires_status[i])) - status_reqs_met = false; - } - for(unsigned int i = 0; i < me.requires_not_status.size(); i++) { - if (camp->checkStatus(me.requires_not_status[i])) - status_reqs_met = false; - } - if(!status_reqs_met) - continue; - - - Enemy *e = getEnemyPrototype(me.type); - - e->stats.waypoints = me.waypoints; - e->stats.pos.x = me.pos.x; - e->stats.pos.y = me.pos.y; - e->stats.direction = static_cast(me.direction); - e->stats.wander = me.wander_radius > 0; - e->stats.setWanderArea(me.wander_radius); - e->stats.invincible_requires_status = me.invincible_requires_status; - e->stats.invincible_requires_not_status = me.invincible_requires_not_status; - - enemies.push_back(e); - - mapr->collider.block(me.pos.x, me.pos.y, !MapCollision::IS_ALLY); - } - - FPoint spawn_pos = mapr->collider.getRandomNeighbor(Point(pc->stats.pos), 1, !MapCollision::IGNORE_BLOCKED); - while (!allies.empty()) { - - Enemy *e = allies.front(); - allies.pop(); - - //dont need the result of this. its only called to handle animation and sound - Enemy* temp = getEnemyPrototype(e->type); - delete temp; - - e->stats.pos = spawn_pos; - e->stats.direction = pc->stats.direction; - - enemies.push_back(e); - - mapr->collider.block(e->stats.pos.x, e->stats.pos.y, MapCollision::IS_ALLY); - } - - // load enemies that can be spawn by avatar's powers - for (size_t i = 0; i < pc->stats.powers_list.size(); i++) { - int power_index = pc->stats.powers_list[i]; - const std::string& spawn_type = powers->powers[power_index].spawn_type; - if (spawn_type != "" && spawn_type != "untransform") { - std::vector spawn_enemies = enemyg->getEnemiesInCategory(spawn_type); - for (size_t j = 0; j < spawn_enemies.size(); j++) { - loadEnemyPrototype(spawn_enemies[j].type); - } - } - } - - // load enemies that can be spawn by powers in the action bar - if (menu_act != NULL) { - for (size_t i = 0; i < menu_act->hotkeys.size(); i++) { - int power_index = menu_act->hotkeys[i]; - const std::string& spawn_type = powers->powers[power_index].spawn_type; - if (power_index != 0 && spawn_type != "" && spawn_type != "untransform") { - std::vector spawn_enemies = enemyg->getEnemiesInCategory(spawn_type); - for (size_t j = 0; j < spawn_enemies.size(); j++) { - loadEnemyPrototype(spawn_enemies[j].type); - } - } - } - } - - // load enemies that can be spawn by map events - for (size_t i = 0; i < mapr->events.size(); i++) { - for (size_t j = 0; j < mapr->events[i].components.size(); j++) { - if (mapr->events[i].components[j].type == EventComponent::SPAWN) { - std::vector spawn_enemies = enemyg->getEnemiesInCategory(mapr->events[i].components[j].s); - for (size_t k = 0; k < spawn_enemies.size(); k++) { - loadEnemyPrototype(spawn_enemies[k].type); - } - } - } - } - - anim->cleanUp(); -} - -/** - * Powers can cause new enemies to spawn - * Check PowerManager for any new queued enemies - */ -void EnemyManager::handleSpawn() { - - Map_Enemy espawn; - - while (!powers->map_enemies.empty()) { - espawn = powers->map_enemies.front(); - powers->map_enemies.pop(); - - mapr->collider.unblock(espawn.pos.x, espawn.pos.y); - - Enemy *e = new Enemy(); - // factory - if(espawn.hero_ally) - e->eb = new BehaviorAlly(e); - else - e->eb = new BehaviorStandard(e); - - e->stats.hero_ally = espawn.hero_ally; - e->stats.enemy_ally = espawn.enemy_ally; - e->stats.summoned = true; - e->stats.summoned_power_index = espawn.summon_power_index; - - if(espawn.summoner != NULL) { - e->stats.summoner = espawn.summoner; - espawn.summoner->summons.push_back(&(e->stats)); - } - - e->stats.direction = static_cast(espawn.direction); - - Enemy_Level el = enemyg->getRandomEnemy(espawn.type, 0, 0); - e->type = el.type; - - if (el.type != "") { - e->stats.load(el.type); - } - else { - Utils::logError("EnemyManager: Could not spawn creature type '%s'", espawn.type.c_str()); - delete e; - return; - } - - if (e->stats.animations != "") { - // load the animation file if specified - anim->increaseCount(e->stats.animations); - e->animationSet = anim->getAnimationSet(e->stats.animations); - if (e->animationSet) - e->activeAnimation = e->animationSet->getAnimation(""); - else - Utils::logError("EnemyManager: Animations file could not be loaded for %s", espawn.type.c_str()); - } - else { - Utils::logError("EnemyManager: No animation file specified for entity: %s", espawn.type.c_str()); - } - e->loadSounds(); - - //Set level - if(e->stats.summoned_power_index != 0) { - if(powers->powers[e->stats.summoned_power_index].spawn_level_mode == Power::SPAWN_LEVEL_MODE_FIXED) - e->stats.level = powers->powers[e->stats.summoned_power_index].spawn_level_qty; - - if(powers->powers[e->stats.summoned_power_index].spawn_level_mode == Power::SPAWN_LEVEL_MODE_LEVEL) { - if(e->stats.summoner != NULL && powers->powers[e->stats.summoned_power_index].spawn_level_every != 0) { - e->stats.level = powers->powers[e->stats.summoned_power_index].spawn_level_qty - * (e->stats.summoner->level / powers->powers[e->stats.summoned_power_index].spawn_level_every); - } - } - - if(powers->powers[e->stats.summoned_power_index].spawn_level_mode == Power::SPAWN_LEVEL_MODE_STAT) { - if(e->stats.summoner != NULL && powers->powers[e->stats.summoned_power_index].spawn_level_every != 0) { - int stat_val = 0; - for (size_t i = 0; i < eset->primary_stats.list.size(); ++i) { - if (powers->powers[e->stats.summoned_power_index].spawn_level_stat == i) { - stat_val = e->stats.summoner->get_primary(i); - break; - } - } - - e->stats.level = powers->powers[e->stats.summoned_power_index].spawn_level_qty - * (stat_val / powers->powers[e->stats.summoned_power_index].spawn_level_every); - } - } - - // apply Effects and set HP to max HP - e->stats.recalc(); - } - - if (mapr->collider.isValidPosition(espawn.pos.x, espawn.pos.y, e->stats.movement_type, MapCollision::COLLIDE_NORMAL) || !e->stats.hero_ally) { - e->stats.pos.x = espawn.pos.x; - e->stats.pos.y = espawn.pos.y; - } - else { - e->stats.pos.x = pc->stats.pos.x; - e->stats.pos.y = pc->stats.pos.y; - } - - // special animation state for spawning enemies - e->stats.cur_state = StatBlock::ENEMY_SPAWN; - - //now apply post effects to the spawned enemy - if(e->stats.summoned_power_index > 0) - powers->effect(&e->stats, (espawn.summoner != NULL ? espawn.summoner : &e->stats), e->stats.summoned_power_index, e->stats.hero_ally ? Power::SOURCE_TYPE_HERO : Power::SOURCE_TYPE_ENEMY); - - //apply party passives - //synchronise tha party passives in the pc stat block with the passives in the allies stat blocks - //at the time the summon is spawned, it takes the passives available at that time. if the passives change later, the changes wont affect summons retrospectively. could be exploited with equipment switching - for (unsigned i=0; i< pc->stats.powers_passive.size(); i++) { - int pwr = pc->stats.powers_passive[i]; - if (powers->powers[pwr].passive && powers->powers[pwr].buff_party && (e->stats.hero_ally || e->stats.enemy_ally) - && (powers->powers[pwr].buff_party_power_id == 0 || powers->powers[pwr].buff_party_power_id == e->stats.summoned_power_index)) { - - e->stats.powers_passive.push_back(pwr); - } - } - - for (unsigned i=0; istats.powers_list_items.size(); i++) { - int pwr = pc->stats.powers_list_items[i]; - if (powers->powers[pwr].passive && powers->powers[pwr].buff_party && (e->stats.hero_ally || e->stats.enemy_ally) - && (powers->powers[pwr].buff_party_power_id == 0 || powers->powers[pwr].buff_party_power_id == e->stats.summoned_power_index)) { - - e->stats.powers_passive.push_back(pwr); - } - } - - enemies.push_back(e); - - mapr->collider.block(e->stats.pos.x, e->stats.pos.y, e->stats.hero_ally); - } -} - -bool EnemyManager::checkPartyMembers() { - for (unsigned int i=0; i < enemies.size(); i++) { - if(enemies[i]->stats.hero_ally && enemies[i]->stats.hp > 0) { - return true; - } - } - return false; -} - -/** - * perform logic() for all enemies - */ -void EnemyManager::logic() { - - if (player_blocked) { - player_blocked_timer.tick(); - if (player_blocked_timer.isEnd()) - player_blocked = false; - } - - handleSpawn(); - - std::vector::iterator it; - for (it = enemies.begin(); it != enemies.end(); ++it) { - // new actions this round - (*it)->stats.hero_stealth = hero_stealth; - (*it)->logic(); - } -} - -Enemy* EnemyManager::enemyFocus(const Point& mouse, const FPoint& cam, bool alive_only) { - Point p; - Rect r; - for(unsigned int i = 0; i < enemies.size(); i++) { - if(alive_only && (enemies[i]->stats.cur_state == StatBlock::ENEMY_DEAD || enemies[i]->stats.cur_state == StatBlock::ENEMY_CRITDEAD)) { - continue; - } - p = Utils::mapToScreen(enemies[i]->stats.pos.x, enemies[i]->stats.pos.y, cam.x, cam.y); - - Renderable ren = enemies[i]->getRender(); - r.w = ren.src.w; - r.h = ren.src.h; - r.x = p.x - ren.offset.x; - r.y = p.y - ren.offset.y; - - if (Utils::isWithinRect(r, mouse)) { - Enemy *enemy = enemies[i]; - return enemy; - } - } - return NULL; -} - -Enemy* EnemyManager::getNearestEnemy(const FPoint& pos, bool get_corpse, float *saved_distance, float max_range) { - Enemy* nearest = NULL; - float best_distance = std::numeric_limits::max(); - - for (unsigned i=0; istats.cur_state == StatBlock::ENEMY_DEAD || enemies[i]->stats.cur_state == StatBlock::ENEMY_CRITDEAD)) { - continue; - } - if (get_corpse && !enemies[i]->stats.corpse) { - continue; - } - - float distance = Utils::calcDist(pos, enemies[i]->stats.pos); - if (distance < best_distance) { - best_distance = distance; - nearest = enemies[i]; - } - } - - if (nearest && saved_distance) - *saved_distance = best_distance; - - if (!saved_distance && best_distance > max_range) - nearest = NULL; - - return nearest; -} - -/** - * If an enemy has died, reward the hero with experience points - */ -void EnemyManager::checkEnemiesforXP() { - for (unsigned int i=0; i < enemies.size(); i++) { - if (enemies[i]->reward_xp) { - //adjust for party exp if necessary - float xp_multiplier = 1; - if(enemies[i]->kill_source_type == Power::SOURCE_TYPE_ALLY) - xp_multiplier = static_cast(eset->misc.party_exp_percentage) / 100.0f; - - camp->rewardXP(static_cast((static_cast(enemies[i]->stats.xp) * xp_multiplier)), !CampaignManager::XP_SHOW_MSG); - enemies[i]->reward_xp = false; // clear flag - } - } -} - -bool EnemyManager::isCleared() { - if (enemies.empty()) return true; - - for (unsigned int i=0; i < enemies.size(); i++) { - if (enemies[i]->stats.alive && !enemies[i]->stats.hero_ally) - return false; - } - - return true; -} - -void EnemyManager::spawn(const std::string& enemy_type, const Point& target) { - Map_Enemy espawn; - - espawn.type = enemy_type; - espawn.pos = FPoint(target); - espawn.pos.x += 0.5f; - espawn.pos.y += 0.5f; - - // quick spawns start facing a random direction - espawn.direction = rand() % 8; - - if (!mapr->collider.isEmpty(espawn.pos.x, espawn.pos.y)) { - return; - } - else { - mapr->collider.block(espawn.pos.x, espawn.pos.y, !MapCollision::IS_ALLY); - } - - powers->map_enemies.push(espawn); -} - -/** - * addRenders() - * Map objects need to be drawn in Z order, so we allow a parent object (GameEngine) - * to collect all mobile sprites each frame. - */ -void EnemyManager::addRenders(std::vector &r, std::vector &r_dead) { - std::vector::iterator it; - for (it = enemies.begin(); it != enemies.end(); ++it) { - bool dead = (*it)->stats.corpse; - if (!dead || !(*it)->stats.corpse_timer.isEnd()) { - Renderable re = (*it)->getRender(); - re.prio = 1; - (*it)->stats.effects.getCurrentColor(re.color_mod); - (*it)->stats.effects.getCurrentAlpha(re.alpha_mod); - - // fade out corpses - unsigned fade_time = (eset->misc.corpse_timeout > settings->max_frames_per_sec) ? settings->max_frames_per_sec : eset->misc.corpse_timeout; - if (dead && fade_time != 0 && (*it)->stats.corpse_timer.getCurrent() <= fade_time) { - re.alpha_mod = static_cast(static_cast((*it)->stats.corpse_timer.getCurrent()) * (re.alpha_mod / static_cast(fade_time))); - } - - // draw corpses below objects so that floor loot is more visible - (dead ? r_dead : r).push_back(re); - - // add effects - for (unsigned i = 0; i < (*it)->stats.effects.effect_list.size(); ++i) { - if ((*it)->stats.effects.effect_list[i].animation) { - Renderable ren = (*it)->stats.effects.effect_list[i].animation->getCurrentFrame(0); - ren.map_pos = (*it)->stats.pos; - if ((*it)->stats.effects.effect_list[i].render_above) ren.prio = 2; - else ren.prio = 0; - r.push_back(ren); - } - } - } - } -} - -EnemyManager::~EnemyManager() { - for (unsigned int i=0; i < enemies.size(); i++) { - anim->decreaseCount(enemies[i]->animationSet->getName()); - enemies[i]->unloadSounds(); - delete enemies[i]; - } - for (unsigned int i=0; i < prototypes.size(); i++) { - anim->decreaseCount(prototypes[i].animationSet->getName()); - prototypes[i].unloadSounds(); - } -} diff --git a/src/EnemyManager.h b/src/EnemyManager.h deleted file mode 100644 index 68f9b75..0000000 --- a/src/EnemyManager.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright © 2011-2012 Clint Bellanger -Copyright © 2012 Stefan Beller -Copyright © 2013 Henrik Andersson -Copyright © 2012-2016 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -/* - * class EnemyManager - */ - - -#ifndef ENEMY_MANAGER_H -#define ENEMY_MANAGER_H - -#include "CommonIncludes.h" -#include "Utils.h" - -class Animation; -class Enemy; - -class EnemyManager { -private: - - void loadAnimations(Enemy *e); - - std::vector anim_prefixes; - std::vector > anim_entities; - - /** - * callee is responsible for deleting returned enemy object - */ - Enemy *getEnemyPrototype(const std::string& type_id); - size_t loadEnemyPrototype(const std::string& type_id); - - std::vector prototypes; - -public: - EnemyManager(); - ~EnemyManager(); - void handleNewMap(); - void handleSpawn(); - bool checkPartyMembers(); - void logic(); - void addRenders(std::vector &r, std::vector &r_dead); - void checkEnemiesforXP(); - bool isCleared(); - void spawn(const std::string& enemy_type, const Point& target); - Enemy *enemyFocus(const Point& mouse, const FPoint& cam, bool alive_only); - Enemy* getNearestEnemy(const FPoint& pos, bool get_corpse, float *saved_distance, float max_range); - - // vars - std::vector enemies; - int hero_stealth; - - bool player_blocked; - Timer player_blocked_timer; - - static const bool GET_CORPSE = true; - static const bool IS_ALIVE = true; -}; - - -#endif diff --git a/src/EngineSettings.cpp b/src/EngineSettings.cpp index efaff49..5a51455 100644 --- a/src/EngineSettings.cpp +++ b/src/EngineSettings.cpp @@ -21,6 +21,7 @@ #include "EngineSettings.h" #include "FileParser.h" +#include "FontEngine.h" #include "MenuActionBar.h" #include "MessageEngine.h" #include "ModManager.h" @@ -65,10 +66,14 @@ save_onload = true; save_onexit = true; save_pos_onexit = false; + save_oncutscene = true; + save_onstash = SAVE_ONSTASH_ALL; + save_anywhere = false; camera_speed = 10.f; save_buyback = true; keep_buyback_on_map_change = true; sfx_unable_to_cast = ""; + combat_aborts_npc_interact = true; FileParser infile; // @CLASS EngineSettings: Misc|Description of engine/misc.txt @@ -79,7 +84,7 @@ save_hpmp = Parse::toBool(infile.val); // @ATTR corpse_timeout|duration|Duration that a corpse can exist on the map in 'ms' or 's'. else if (infile.key == "corpse_timeout") - corpse_timeout = Parse::toDirection(infile.val); + corpse_timeout = Parse::toDuration(infile.val); // @ATTR sell_without_vendor|bool|Allows selling items when not at a vendor via CTRL-Click. else if (infile.key == "sell_without_vendor") sell_without_vendor = Parse::toBool(infile.val); @@ -106,7 +111,7 @@ enable_ally_collision_ai = Parse::toBool(infile.val); else if (infile.key == "currency_id") { // @ATTR currency_id|item_id|An item id that will be used as currency. - currency_id = Parse::toInt(infile.val); + currency_id = Parse::toItemID(infile.val); if (currency_id < 1) { currency_id = 1; Utils::logError("EngineSettings: Currency ID below the minimum allowed value. Resetting it to %d", currency_id); @@ -127,6 +132,25 @@ // @ATTR save_pos_onexit|bool|If the game gets saved on exiting, store the player's current position instead of the map spawn position. else if (infile.key == "save_pos_onexit") save_pos_onexit = Parse::toBool(infile.val); + // @ATTR save_oncutscene|bool|Saves the game when triggering any cutscene via an Event. + else if (infile.key == "save_oncutscene") + save_oncutscene = Parse::toBool(infile.val); + // @ATTR save_onstash|[bool, "private", "shared"]|Saves the game when changing the contents of a stash. The default is true (i.e. save when using both stash types). Use caution with the values "private" and false, since not saving shared stashes exposes an item duplication exploit. + else if (infile.key == "save_onstash") { + if (infile.val == "private") + save_onstash = SAVE_ONSTASH_PRIVATE; + else if (infile.val == "shared") + save_onstash = SAVE_ONSTASH_SHARED; + else { + if (Parse::toBool(infile.val)) + save_onstash = SAVE_ONSTASH_ALL; + else + save_onstash = SAVE_ONSTASH_NONE; + } + } + // @ATTR save_anywhere|bool|Saves the game when using a button. + else if (infile.key == "save_anywhere") + save_anywhere = Parse::toBool(infile.val); // @ATTR camera_speed|float|Modifies how fast the camera moves to recenter on the player. Larger values mean a slower camera. Default value is 10. else if (infile.key == "camera_speed") { camera_speed = Parse::toFloat(infile.val); @@ -142,6 +166,9 @@ // @ATTR sfx_unable_to_cast|filename|Sound to play when the player lacks the MP to cast a power. else if (infile.key == "sfx_unable_to_cast") sfx_unable_to_cast = infile.val; + // @ATTR combat_aborts_npc_interact|bool|If true, the NPC dialog and vendor menus will be closed if the player is attacked. + else if (infile.key == "combat_aborts_npc_interact") + combat_aborts_npc_interact = Parse::toBool(infile.val); else infile.error("EngineSettings: '%s' is not a valid key.", infile.key.c_str()); } @@ -196,7 +223,13 @@ virtual_heights.clear(); std::string v_height = Parse::popFirstString(infile.val); while (!v_height.empty()) { - virtual_heights.push_back(static_cast(Parse::toInt(v_height))); + unsigned short test_v_height = static_cast(Parse::toInt(v_height)); + if (test_v_height <= 0) { + Utils::logError("EngineSettings: virtual_height must be greater than zero."); + } + else { + virtual_heights.push_back(static_cast(Parse::toInt(v_height))); + } v_height = Parse::popFirstString(infile.val); } @@ -224,14 +257,6 @@ // prevent the window from being too small if (settings->screen_w < min_screen_w) settings->screen_w = min_screen_w; if (settings->screen_h < min_screen_h) settings->screen_h = min_screen_h; - - // set the default virtual height if it's not defined - if (settings->view_h == 0) { - Utils::logError("EngineSettings: virtual_height is undefined. Setting it to %d.", min_screen_h); - virtual_heights.push_back(min_screen_h); - settings->view_h = min_screen_h; - settings->view_h_half = settings->view_h / 2; - } // icon size can not be zero, so we set a default of 32x32, which is fantasycore's icon size if (icon_size == 0) { @@ -280,19 +305,19 @@ if (infile.open("engine/combat.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { while (infile.next()) { if (infile.key == "absorb_percent") { - // @ATTR absorb_percent|int, int : Minimum, Maximum|Limits the percentage of damage that can be absorbed. + // @ATTR absorb_percent|int, int : Minimum, Maximum|Limits the percentage of damage that can be absorbed. A max value less than 100 will ensure that the target always takes at least 1 damage from non-elemental attacks. min_absorb = Parse::popFirstInt(infile.val); max_absorb = Parse::popFirstInt(infile.val); max_absorb = std::max(max_absorb, min_absorb); } else if (infile.key == "resist_percent") { - // @ATTR resist_percent|int, int : Minimum, Maximum|Limits the percentage of damage that can be resisted. + // @ATTR resist_percent|int, int : Minimum, Maximum|Limits the percentage of damage that can be resisted. A max value less than 100 will ensure that the target always takes at least 1 damage from elemental attacks. min_resist = Parse::popFirstInt(infile.val); max_resist = Parse::popFirstInt(infile.val); max_resist = std::max(max_resist, min_resist); } else if (infile.key == "block_percent") { - // @ATTR block_percent|int, int : Minimum, Maximum|Limits the percentage of damage that can be blocked. + // @ATTR block_percent|int, int : Minimum, Maximum|Limits the percentage of damage that can be absorbed when the target is in the 'block' animation state. A max value less than 100 will ensure that the target always takes at least 1 damage from non-elemental attacks. min_block = Parse::popFirstInt(infile.val); max_block = Parse::popFirstInt(infile.val); max_block = std::max(max_block, min_block); @@ -455,7 +480,7 @@ , equipment("") , carried("") , primary((eset ? eset->primary_stats.list.size() : 0), 0) - , hotkeys(std::vector(MenuActionBar::SLOT_MAX, 0)) + , hotkeys(std::vector(MenuActionBar::SLOT_MAX, 0)) , power_tree("") , default_power_tab(-1) { @@ -509,14 +534,14 @@ else if (infile.key == "actionbar") { // @ATTR actionbar|list(power_id)|A list of powers to place in the action bar for the class. for (int i=0; i<12; i++) { - list.back().hotkeys[i] = Parse::popFirstInt(infile.val); + list.back().hotkeys[i] = Parse::toPowerID(Parse::popFirstString(infile.val)); } } else if (infile.key == "powers") { // @ATTR powers|list(power_id)|A list of powers that are unlocked when starting this class. std::string power; while ( (power = Parse::popFirstString(infile.val)) != "") { - list.back().powers.push_back(Parse::toInt(power)); + list.back().powers.push_back(Parse::toPowerID(power)); } } else if (infile.key == "campaign") { @@ -827,10 +852,20 @@ // reset to defaults selection_rect_color = Color(255, 248, 220, 255); colorblind_highlight_offset = Point(2, 2); + tab_padding = Point(8, 0); + slot_quantity_label = LabelInfo(); + slot_quantity_color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); slot_quantity_bg_color = Color(0, 0, 0, 0); + slot_hotkey_label = LabelInfo(); + slot_hotkey_color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); + slot_hotkey_label.hidden = true; + slot_hotkey_bg_color = Color(0, 0, 0, 0); + listbox_text_margin = Point(8, 8); + + horizontal_list_text_width = 150; FileParser infile; // @CLASS EngineSettings: Widgets|Description of engine/widget_settings.txt @@ -857,15 +892,37 @@ // @ATTR slot.quantity_label|label|Setting for the slot quantity text. slot_quantity_label = Parse::popLabelInfo(infile.val); } + else if (infile.key == "quantity_color") { + // @ATTR slot.quantity_color|color|Text color for the slot quantity text. + slot_quantity_color = Parse::toRGB(infile.val); + } else if (infile.key == "quantity_bg_color") { // @ATTR slot.quantity_bg_color|color, int : Color, Alpha|If a slot has a quantity, a rectangle filled with this color will be placed beneath the text. slot_quantity_bg_color = Parse::toRGBA(infile.val); + } + else if (infile.key == "hotkey_label") { + // @ATTR slot.hotkey_label|label|Setting for the slot hotkey text. + slot_hotkey_label = Parse::popLabelInfo(infile.val); + } + else if (infile.key == "hotkey_color") { + // @ATTR slot.hotkey_color|color|Text color for the slot hotkey text. + slot_hotkey_color = Parse::toRGB(infile.val); + } + else if (infile.key == "hotkey_bg_color") { + // @ATTR slot.hotkey_bg_color|color, int : Color, Alpha|If a slot has a hotkey, a rectangle filled with this color will be placed beneath the text. + slot_hotkey_bg_color = Parse::toRGBA(infile.val); } } else if (infile.section == "listbox") { if (infile.key == "text_margin") { // @ATTR listbox.text_margin|int, int : Left margin, Right margin|The pixel margin to leave on the left and right sides of listbox element text. listbox_text_margin = Parse::toPoint(infile.val); + } + } + else if (infile.section == "horizontal_list") { + if (infile.key == "text_width") { + // @ATTR horizontal_list.text_width|int|The pixel width of the text area that displays the currently selected item. Default is 150 pixels; + horizontal_list_text_width = Parse::toInt(infile.val); } } } @@ -900,7 +957,7 @@ } unsigned long EngineSettings::XPTable::getLevelXP(int level) { - if (level <= 1) + if (level <= 1 || xp_table.empty()) return 0; else if (level > static_cast(xp_table.size())) return xp_table.back(); diff --git a/src/EngineSettings.h b/src/EngineSettings.h index 77d9009..244f709 100644 --- a/src/EngineSettings.h +++ b/src/EngineSettings.h @@ -33,6 +33,13 @@ class Misc { public: void load(); + + enum { + SAVE_ONSTASH_NONE = 0, + SAVE_ONSTASH_PRIVATE = 1, + SAVE_ONSTASH_SHARED = 2, + SAVE_ONSTASH_ALL = 3, + }; bool save_hpmp; int corpse_timeout; @@ -44,16 +51,20 @@ int party_exp_percentage; bool enable_ally_collision; bool enable_ally_collision_ai; - int currency_id; + ItemID currency_id; float interact_range; bool menus_pause; bool save_onload; bool save_onexit; bool save_pos_onexit; + bool save_oncutscene; + int save_onstash; + bool save_anywhere; float camera_speed; bool save_buyback; bool keep_buyback_on_map_change; std::string sfx_unable_to_cast; + bool combat_aborts_npc_interact; }; class Resolutions { @@ -149,8 +160,8 @@ std::string equipment; std::string carried; std::vector primary; - std::vector hotkeys; - std::vector powers; + std::vector hotkeys; + std::vector powers; std::vector statuses; std::string power_tree; int default_power_tab; @@ -247,8 +258,13 @@ Point colorblind_highlight_offset; Point tab_padding; LabelInfo slot_quantity_label; + Color slot_quantity_color; Color slot_quantity_bg_color; + LabelInfo slot_hotkey_label; + Color slot_hotkey_color; + Color slot_hotkey_bg_color; Point listbox_text_margin; + int horizontal_list_text_width; }; class XPTable { diff --git a/src/Entity.cpp b/src/Entity.cpp index 7292e23..df176e2 100644 --- a/src/Entity.cpp +++ b/src/Entity.cpp @@ -32,25 +32,17 @@ #include "CommonIncludes.h" #include "EngineSettings.h" #include "Entity.h" +#include "EntityBehavior.h" #include "Hazard.h" #include "MapRenderer.h" #include "MessageEngine.h" #include "PowerManager.h" +#include "RenderDevice.h" #include "Settings.h" #include "SharedGameResources.h" #include "SharedResources.h" #include "SoundManager.h" #include "UtilsMath.h" - -#include - -#ifndef M_SQRT2 -#define M_SQRT2 sqrt(2.0) -#endif - -const int directionDeltaX[8] = {-1, -1, -1, 0, 1, 1, 1, 0}; -const int directionDeltaY[8] = { 1, 0, -1, -1, -1, 0, 1, 1}; -const float speedMultiplyer[8] = { static_cast(1.0/M_SQRT2), 1.0f, static_cast(1.0/M_SQRT2), 1.0f, static_cast(1.0/M_SQRT2), 1.0f, static_cast(1.0/M_SQRT2), 1.0f}; Entity::Entity() : sprites(NULL) @@ -60,8 +52,14 @@ , sound_critdie() , sound_block() , sound_levelup(0) + , sound_lowhp(0) , activeAnimation(NULL) - , animationSet(NULL) { + , animationSet(NULL) + , stats() + , type_filename("") +{ + // MSVC complains if you use 'this' in the init list + behavior = new EntityBehavior(this); } Entity::Entity(const Entity& e) { @@ -79,11 +77,23 @@ sound_critdie = e.sound_critdie; sound_block = e.sound_block; sound_levelup = e.sound_levelup; - activeAnimation = new Animation(*e.activeAnimation); + sound_lowhp = e.sound_lowhp; + + if (e.activeAnimation) + activeAnimation = new Animation(*e.activeAnimation); animationSet = e.animationSet; + stats = StatBlock(e.stats); + type_filename = e.type_filename; + + behavior = new EntityBehavior(this); + return *this; +} + +void Entity::logic() { + behavior->logic(); } void Entity::loadSounds() { @@ -120,6 +130,9 @@ if (src_stats->sfx_levelup != "") sound_levelup = snd->load(src_stats->sfx_levelup, "Entity leveled up"); + + if (src_stats->sfx_lowhp != "") + sound_lowhp = snd->load(src_stats->sfx_lowhp, "Entity has low hp"); } void Entity::unloadSounds() { @@ -143,6 +156,7 @@ } snd->unload(sound_levelup); + snd->unload(sound_lowhp); } void Entity::playAttackSound(const std::string& attack_name) { @@ -278,9 +292,9 @@ if (stats.charge_speed != 0.0f) return false; - float speed = stats.speed * speedMultiplyer[stats.direction] * stats.effects.speed / 100; - float dx = speed * static_cast(directionDeltaX[stats.direction]); - float dy = speed * static_cast(directionDeltaY[stats.direction]); + float speed = stats.speed * StatBlock::SPEED_MULTIPLIER[stats.direction] * stats.effects.speed / 100; + float dx = speed * StatBlock::DIRECTION_DELTA_X[stats.direction]; + float dy = speed * StatBlock::DIRECTION_DELTA_Y[stats.direction]; bool full_move = mapr->collider.move(stats.pos.x, stats.pos.y, dx, dy, stats.movement_type, mapr->collider.getCollideType(stats.hero)); @@ -296,7 +310,7 @@ bool Entity::takeHit(Hazard &h) { //check if this enemy should be affected by this hazard based on the category - if(!powers->powers[h.power_index].target_categories.empty() && !stats.hero) { + if(!powers->powers[h.power_index].target_categories.empty()) { //the power has a target category requirement, so if it doesnt match, dont continue bool match_found = false; for (unsigned int i=0; itrait_elemental >= 0 && static_cast(h.power->trait_elemental) < stats.vulnerable.size()) { size_t i = h.power->trait_elemental; - int vulnerable = std::max(stats.vulnerable[i], eset->combat.min_resist); - if (stats.vulnerable[i] < 100) - vulnerable = std::min(vulnerable, eset->combat.max_resist); + int vulnerable = stats.vulnerable[i]; + // vulnerable values >100 are weakness, and are unaffected by min/max resist setting + if (vulnerable <= 100) { + if (100 - vulnerable < eset->combat.min_resist) + vulnerable = 100 - eset->combat.min_resist; + if (100 - vulnerable > eset->combat.max_resist) + vulnerable = 100 - eset->combat.max_resist; + } dmg = (dmg * vulnerable) / 100; } @@ -494,7 +510,7 @@ // default is dmg * 2 dmg = (dmg * Math::randBetween(eset->combat.min_crit_damage, eset->combat.max_crit_damage)) / 100; if(!stats.hero) - mapr->shaky_cam_timer.setDuration(settings->max_frames_per_sec/2); + mapr->cam.shake_timer.setDuration(settings->max_frames_per_sec/2); } else if (is_overhit) { dmg = (dmg * Math::randBetween(eset->combat.min_overhit_damage, eset->combat.max_overhit_damage)) / 100; @@ -530,7 +546,7 @@ bool was_debuffed = stats.effects.isDebuffed(); // apply damage - stats.takeDamage(dmg); + stats.takeDamage(dmg, crit, h.source_type); // after effects if (dmg > 0 || powers->powers[h.power_index].ignore_zero_damage) { @@ -541,19 +557,21 @@ powers->effect(&stats, h.src_stats, static_cast(h.power_index), h.source_type); // HP/MP steal is cumulative between stat bonus and power bonus - int hp_steal = h.power->hp_steal + h.src_stats->get(Stats::HP_STEAL); - if (!stats.effects.immunity_hp_steal && hp_steal != 0) { - int steal_amt = (std::min(dmg, prev_hp) * hp_steal) / 100; - if (steal_amt == 0) steal_amt = 1; - combat_text->addString(msg->get("+%d HP",steal_amt), h.src_stats->pos, CombatText::MSG_BUFF); - h.src_stats->hp = std::min(h.src_stats->hp + steal_amt, h.src_stats->get(Stats::HP_MAX)); - } - int mp_steal = h.power->mp_steal + h.src_stats->get(Stats::MP_STEAL); - if (!stats.effects.immunity_mp_steal && mp_steal != 0) { - int steal_amt = (std::min(dmg, prev_hp) * mp_steal) / 100; - if (steal_amt == 0) steal_amt = 1; - combat_text->addString(msg->get("+%d MP",steal_amt), h.src_stats->pos, CombatText::MSG_BUFF); - h.src_stats->mp = std::min(h.src_stats->mp + steal_amt, h.src_stats->get(Stats::MP_MAX)); + if (h.src_stats->hp > 0) { + int hp_steal = h.power->hp_steal + h.src_stats->get(Stats::HP_STEAL); + if (!stats.effects.immunity_hp_steal && hp_steal != 0) { + int steal_amt = (std::min(dmg, prev_hp) * hp_steal) / 100; + if (steal_amt == 0) steal_amt = 1; + combat_text->addString(msg->get("+%d HP",steal_amt), h.src_stats->pos, CombatText::MSG_BUFF); + h.src_stats->hp = std::min(h.src_stats->hp + steal_amt, h.src_stats->get(Stats::HP_MAX)); + } + int mp_steal = h.power->mp_steal + h.src_stats->get(Stats::MP_STEAL); + if (!stats.effects.immunity_mp_steal && mp_steal != 0) { + int steal_amt = (std::min(dmg, prev_hp) * mp_steal) / 100; + if (steal_amt == 0) steal_amt = 1; + combat_text->addString(msg->get("+%d MP",steal_amt), h.src_stats->pos, CombatText::MSG_BUFF); + h.src_stats->mp = std::min(h.src_stats->mp + steal_amt, h.src_stats->get(Stats::MP_MAX)); + } } // deal return damage @@ -563,7 +581,14 @@ if (dmg_return == 0) dmg_return = 1; - h.src_stats->takeDamage(dmg_return); + // swap the source type when dealing return damage + int return_source_type = Power::SOURCE_TYPE_NEUTRAL; + if (h.source_type == Power::SOURCE_TYPE_HERO || h.source_type == Power::SOURCE_TYPE_ALLY) + return_source_type = Power::SOURCE_TYPE_ENEMY; + else if (h.source_type == Power::SOURCE_TYPE_ENEMY) + return_source_type = stats.hero ? Power::SOURCE_TYPE_HERO : Power::SOURCE_TYPE_ALLY; + + h.src_stats->takeDamage(dmg_return, !StatBlock::TAKE_DMG_CRIT, return_source_type); comb->addInt(dmg_return, h.src_stats->pos, CombatText::MSG_GIVEDMG); } } @@ -580,23 +605,13 @@ // interrupted to new state if (dmg > 0) { - bool chance_poise = Math::percentChance(stats.get(Stats::POISE)); - - if(stats.hp <= 0) { - stats.effects.triggered_death = true; - if(stats.hero) - stats.cur_state = StatBlock::AVATAR_DEAD; - else { - doRewards(h.source_type); - if (crit) - stats.cur_state = StatBlock::ENEMY_CRITDEAD; - else - stats.cur_state = StatBlock::ENEMY_DEAD; - mapr->collider.unblock(stats.pos.x,stats.pos.y); - } - + if (stats.hero) { + stats.abort_npc_interact = true; + } + + // entity is dead, no need to contine + if (stats.hp <= 0) return true; - } // play hit sound effect, but only if the hit cooldown is done if (stats.cooldown_hit.isEnd()) @@ -606,7 +621,7 @@ if (!was_debuffed && stats.effects.isDebuffed()) { StatBlock::AIPower* ai_power = stats.getAIPower(StatBlock::AI_POWER_DEBUFF); if (ai_power != NULL) { - stats.cur_state = StatBlock::ENEMY_POWER; + stats.cur_state = StatBlock::ENTITY_POWER; stats.activated_power = ai_power; stats.cooldown.reset(Timer::END); // ignore global cooldown return true; @@ -616,7 +631,7 @@ // roll to see if the enemy's ON_HIT power is casted StatBlock::AIPower* ai_power = stats.getAIPower(StatBlock::AI_POWER_HIT); if (ai_power != NULL) { - stats.cur_state = StatBlock::ENEMY_POWER; + stats.cur_state = StatBlock::ENTITY_POWER; stats.activated_power = ai_power; stats.cooldown.reset(Timer::END); // ignore global cooldown return true; @@ -624,23 +639,37 @@ // don't go through a hit animation if stunned or successfully poised // however, critical hits ignore poise + bool chance_poise = Math::percentChance(stats.get(Stats::POISE)); + if(stats.cooldown_hit.isEnd()) { stats.cooldown_hit.reset(Timer::BEGIN); if (!stats.effects.stun && (!chance_poise || crit) && !stats.prevent_interrupt) { if(stats.hero) { - stats.cur_state = StatBlock::AVATAR_HIT; + stats.cur_state = StatBlock::ENTITY_HIT; } else { - if (stats.cur_state == StatBlock::ENEMY_POWER) { + if (stats.cur_state == StatBlock::ENTITY_POWER) { stats.cooldown.reset(Timer::BEGIN); stats.activated_power = NULL; } - stats.cur_state = StatBlock::ENEMY_HIT; + stats.cur_state = StatBlock::ENTITY_HIT; } if (stats.untransform_on_hit) stats.transform_duration = 0; + } + } + + // handle block post-power + if (stats.block_power != 0) { + PowerID block_post_power = powers->powers[stats.block_power].post_power; + + if (block_post_power != 0 && stats.getPowerCooldown(block_post_power) == 0) { + if (Math::percentChance(powers->powers[stats.block_power].post_power_chance)) { + powers->activate(powers->powers[stats.block_power].post_power, &stats, stats.pos); + stats.setPowerCooldown(block_post_power, powers->powers[block_post_power].cooldown); + } } } } @@ -670,7 +699,61 @@ return activeAnimation == NULL; } +/** + * The current direction leads to a wall. Try the next best direction, if one is available. + */ +unsigned char Entity::faceNextBest(float mapx, float mapy) { + float dx = static_cast(fabs(mapx - stats.pos.x)); + float dy = static_cast(fabs(mapy - stats.pos.y)); + switch (stats.direction) { + case 0: + if (dy > dx) return 7; + else return 1; + case 1: + if (mapy > stats.pos.y) return 0; + else return 2; + case 2: + if (dx > dy) return 1; + else return 3; + case 3: + if (mapx < stats.pos.x) return 2; + else return 4; + case 4: + if (dy > dx) return 3; + else return 5; + case 5: + if (mapy < stats.pos.y) return 4; + else return 6; + case 6: + if (dx > dy) return 5; + else return 7; + case 7: + if (mapx > stats.pos.x) return 6; + else return 0; + } + return 0; +} + +/** + * getRender() + * Map objects need to be drawn in Z order, so we allow a parent object (GameEngine) + * to collect all mobile sprites each frame. + */ +Renderable Entity::getRender() { + Renderable r = activeAnimation->getCurrentFrame(stats.direction); + r.map_pos.x = stats.pos.x; + r.map_pos.y = stats.pos.y; + if (stats.hp > 0) { + if (stats.hero_ally) + r.type = Renderable::TYPE_ALLY; + else if (stats.in_combat) + r.type = Renderable::TYPE_ENEMY; + } + return r; +} + Entity::~Entity () { delete activeAnimation; -} - + delete behavior; +} + diff --git a/src/Entity.h b/src/Entity.h index c2a7165..ab75ebf 100644 --- a/src/Entity.h +++ b/src/Entity.h @@ -33,6 +33,7 @@ class Animation; class AnimationSet; +class EntityBehavior; class Entity { protected: @@ -54,6 +55,7 @@ Entity& operator=(const Entity& e); virtual ~Entity(); + void logic(); void loadSounds(); void loadSoundsFromStatBlock(StatBlock *src_stats); void unloadSounds(); @@ -61,7 +63,6 @@ void playSound(int sound_type); bool move(); bool takeHit(Hazard &h); - virtual void doRewards(int) {} // sound effects std::vector > > sound_attack; @@ -70,12 +71,20 @@ std::vector sound_critdie; std::vector sound_block; SoundID sound_levelup; + SoundID sound_lowhp; bool setAnimation(const std::string& animation); Animation *activeAnimation; AnimationSet *animationSet; StatBlock stats; + + unsigned char faceNextBest(float mapx, float mapy); + Renderable getRender(); + + std::string type_filename; + + EntityBehavior *behavior; }; extern const int directionDeltaX[]; diff --git a/src/EntityBehavior.cpp b/src/EntityBehavior.cpp new file mode 100644 index 0000000..c761876 --- /dev/null +++ b/src/EntityBehavior.cpp @@ -0,0 +1,856 @@ +/* +Copyright © 2012 Clint Bellanger +Copyright © 2012 Stefan Beller +Copyright © 2013 Ryan Dansie +Copyright © 2012-2021 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/** + * class EntityBehavior + * + * Interface for entity behaviors. + * The behavior object is a component of Entity. + * Make AI decisions (movement, actions) for entities. + */ + +#include "Animation.h" +#include "Avatar.h" +#include "CommonIncludes.h" +#include "Entity.h" +#include "EntityManager.h" +#include "EngineSettings.h" +#include "Entity.h" +#include "EntityBehavior.h" +#include "MapRenderer.h" +#include "PowerManager.h" +#include "Settings.h" +#include "SharedGameResources.h" +#include "SharedResources.h" +#include "StatBlock.h" +#include "UtilsMath.h" + +const float EntityBehavior::ALLY_FLEE_DISTANCE = 2; +const float EntityBehavior::ALLY_FOLLOW_DISTANCE_WALK = 5.5; +const float EntityBehavior::ALLY_FOLLOW_DISTANCE_STOP = 5; +const float EntityBehavior::ALLY_TELEPORT_DISTANCE = 40; + +EntityBehavior::EntityBehavior(Entity *_e) + : e(_e) + , path() + , prev_target() + , collided(false) + , path_found(false) + , chance_calc_path(0) + , path_found_fails(0) + , path_found_fail_timer() + , target_dist(0) + , hero_dist(0) + , pursue_pos(-1, -1) + , los(false) + , fleeing(false) + , move_to_safe_dist(false) + , turn_timer() + , instant_power(false) +{ + // wait when PATH_FOUND_FAIL_THRESHOLD is exceeded + path_found_fail_timer.setDuration(settings->max_frames_per_sec * PATH_FOUND_FAIL_WAIT_SECONDS); + path_found_fail_timer.reset(Timer::END); +} + +/** + * One frame of logic for this behavior + */ +void EntityBehavior::logic() { + // skip all logic if the enemy is dead and no longer animating + if (e->stats.corpse) { + e->stats.corpse_timer.tick(); + return; + } + + if (!e->stats.hero_ally) { + if (Utils::calcDist(e->stats.pos, pc->stats.pos) <= settings->encounter_dist) + e->stats.encountered = true; + + if (!e->stats.encountered) + return; + } + + doUpkeep(); + findTarget(); + checkPower(); + checkMove(); + updateState(); + + fleeing = false; + +} + +/** + * Various upkeep on stats + */ +void EntityBehavior::doUpkeep() { + // activate all passive powers + if (e->stats.hp > 0 || e->stats.effects.triggered_death) + powers->activatePassives(&e->stats); + + e->stats.logic(); + + // check for teleport powers + if (e->stats.teleportation) { + + mapr->collider.unblock(e->stats.pos.x,e->stats.pos.y); + + e->stats.pos.x = e->stats.teleport_destination.x; + e->stats.pos.y = e->stats.teleport_destination.y; + + mapr->collider.block(e->stats.pos.x,e->stats.pos.y, e->stats.hero_ally); + + e->stats.teleportation = false; + } +} + +/** + * Locate the player and set various targeting info + */ +void EntityBehavior::findTarget() { + // dying enemies can't target anything + if (e->stats.cur_state == StatBlock::ENTITY_DEAD || e->stats.cur_state == StatBlock::ENTITY_CRITDEAD) return; + + // stunned enemies can't act + if (e->stats.effects.stun) return; + + StatBlock *target_stats = NULL; + float stealth_threat_range = (e->stats.threat_range * (100 - static_cast(e->stats.hero_stealth))) / 100; + bool is_ally = e->stats.hero_ally; + + // check distance and line of sight between enemy and hero + // by default, the enemy pursues the hero directly + if (pc->stats.alive) { + target_dist = Utils::calcDist(e->stats.pos, pc->stats.pos); + target_stats = &pc->stats; + } + else { + target_dist = 0; + } + hero_dist = target_dist; + + // if the minion gets too far, transport it to the player pos + if (is_ally && hero_dist > ALLY_TELEPORT_DISTANCE && !e->stats.in_combat) { + mapr->collider.unblock(e->stats.pos.x, e->stats.pos.y); + e->stats.pos.x = pc->stats.pos.x; + e->stats.pos.y = pc->stats.pos.y; + mapr->collider.block(e->stats.pos.x, e->stats.pos.y, MapCollision::IS_ALLY); + hero_dist = 0; + } + + bool enemies_in_combat = false; + for (size_t i = 0; i < entitym->entities.size(); ++i) { + Entity* entity = entitym->entities[i]; + if (!entity->stats.alive) + continue; + + if ((!is_ally && entity->stats.hero_ally) || (is_ally && !entity->stats.hero_ally && entity->stats.in_combat)) { + float entity_dist = Utils::calcDist(e->stats.pos, entity->stats.pos); + if (!target_stats || (is_ally && target_stats && target_stats->hero)) { + // pick the first available target if none is already selected + target_stats = &entitym->entities[i]->stats; + target_dist = entity_dist; + e->stats.in_combat = true; + enemies_in_combat = true; + } + else if (entity_dist < target_dist) { + // pick a new target if it's closer + target_stats = &entitym->entities[i]->stats; + target_dist = entity_dist; + } + } + } + + //break combat if the player gets too far or all enemies die + if(!enemies_in_combat) + e->stats.in_combat = false; + + // check line-of-sight + if (target_stats && target_dist < e->stats.threat_range && pc->stats.alive) + los = mapr->collider.lineOfSight(e->stats.pos.x, e->stats.pos.y, target_stats->pos.x, target_stats->pos.y); + else + los = false; + + // aggressive enemies are always in combat + if (!e->stats.in_combat && e->stats.combat_style == StatBlock::COMBAT_AGGRESSIVE) { + e->stats.join_combat = true; + } + + // check entering combat (because the player got too close) + bool close_to_target = false; + if (!is_ally && &pc->stats == target_stats) + close_to_target = target_dist < stealth_threat_range; + else if (target_stats && &pc->stats != target_stats) + close_to_target = target_dist < e->stats.threat_range; + + if (e->stats.alive && !e->stats.in_combat && los && close_to_target && e->stats.combat_style != StatBlock::COMBAT_PASSIVE) { + e->stats.join_combat = true; + } + + // if the join_combat flag wasn't set above, it could have been set if the enemy was hit by a hazard + // we put the entity in a combat state and activate powers that trigger when entering combat + if (e->stats.join_combat) { + e->stats.in_combat = true; + + StatBlock::AIPower* ai_power; + if (!is_ally) { + ai_power = e->stats.getAIPower(StatBlock::AI_POWER_BEACON); + if (ai_power != NULL) { + powers->activate(ai_power->id, &e->stats, e->stats.pos); //emit beacon + } + } + + ai_power = e->stats.getAIPower(StatBlock::AI_POWER_JOIN_COMBAT); + if (ai_power != NULL) { + e->stats.cur_state = StatBlock::ENTITY_POWER; + e->stats.activated_power = ai_power; + } + + e->stats.join_combat = false; + } + + // check exiting combat + if (e->stats.combat_style != StatBlock::COMBAT_AGGRESSIVE) { + // target got too far away + if (target_dist > e->stats.threat_range_far && !e->stats.join_combat) + e->stats.in_combat = false; + + // either party is dead + if (!e->stats.alive || !pc->stats.alive) + e->stats.in_combat = false; + } + + if (target_stats) + pursue_pos = target_stats->pos; + + // if we just started wandering, set the first waypoint + if (e->stats.wander && e->stats.waypoints.empty()) { + FPoint waypoint = getWanderPoint(); + e->stats.waypoints.push(waypoint); + e->stats.waypoint_timer.reset(Timer::BEGIN); + } + + // if we're not in combat, pursue the next waypoint + if (!(e->stats.in_combat || e->stats.waypoints.empty())) { + FPoint waypoint = e->stats.waypoints.front(); + pursue_pos.x = waypoint.x; + pursue_pos.y = waypoint.y; + } + + // if the player is blocked, all summons which the player is facing to move away for the specified frames + // need to set the flag player_blocked so that other allies know to get out of the way as well + // if hero is facing the summon + if (is_ally && eset->misc.enable_ally_collision_ai) { + if (!entitym->player_blocked && hero_dist < ALLY_FLEE_DISTANCE + && mapr->collider.isFacing(pc->stats.pos.x,pc->stats.pos.y,pc->stats.direction,e->stats.pos.x,e->stats.pos.y)) { + entitym->player_blocked = true; + entitym->player_blocked_timer.reset(Timer::BEGIN); + } + + bool player_closer_than_target = Utils::calcDist(e->stats.pos, pursue_pos) > Utils::calcDist(e->stats.pos, pc->stats.pos); + + if (entitym->player_blocked && (!e->stats.in_combat || player_closer_than_target) + && mapr->collider.isFacing(pc->stats.pos.x,pc->stats.pos.y,pc->stats.direction,e->stats.pos.x,e->stats.pos.y)) { + fleeing = true; + pursue_pos = pc->stats.pos; + } + } + + if (e->stats.effects.fear) fleeing = true; + + // If we have a successful chance_flee roll, try to move to a safe distance + if ( + e->stats.in_combat && + e->stats.cur_state == StatBlock::ENTITY_STANCE && + !move_to_safe_dist && target_dist < e->stats.flee_range && + target_dist >= e->stats.melee_range && + Math::percentChance(e->stats.chance_flee) && + e->stats.flee_cooldown_timer.isEnd() + ) + { + move_to_safe_dist = true; + } + + if (move_to_safe_dist) fleeing = true; + + if (fleeing) { + FPoint target_pos = pursue_pos; + + std::vector flee_dirs; + + int middle_dir = Utils::calcDirection(target_pos.x, target_pos.y, e->stats.pos.x, e->stats.pos.y); + for (int i = -2; i <= 2; ++i) { + int test_dir = Utils::rotateDirection(middle_dir, i); + + FPoint test_pos = Utils::calcVector(e->stats.pos, test_dir, 1); + if (mapr->collider.isValidPosition(test_pos.x, test_pos.y, e->stats.movement_type, MapCollision::COLLIDE_NORMAL)) { + if (test_dir == e->stats.direction) { + // if we're already moving in a good direction, favor it over other directions + flee_dirs.clear(); + flee_dirs.push_back(test_dir); + break; + } + else { + flee_dirs.push_back(test_dir); + } + } + } + + if (flee_dirs.empty()) { + // trapped and can't move + move_to_safe_dist = false; + fleeing = false; + } + else { + int index = Math::randBetween(0, static_cast(flee_dirs.size())-1); + pursue_pos = Utils::calcVector(e->stats.pos, flee_dirs[index], 1); + + if (e->stats.flee_timer.isEnd()) { + e->stats.flee_timer.reset(Timer::BEGIN); + } + } + } +} + +/** + * Begin using a power if idle, based on behavior % chances. + * Activate a ready power, if the attack animation has followed through + */ +void EntityBehavior::checkPower() { + + // stunned enemies can't act + if (e->stats.effects.stun || e->stats.effects.fear || fleeing) return; + + // currently all enemy power use happens during combat + if (!e->stats.in_combat) return; + + // if the enemy is on global cooldown it cannot act + if (!e->stats.cooldown.isEnd()) return; + + // Note there are two stages to activating a power. + // First is the enemy choosing to use a power based on behavioral chance + // Second is the power actually firing off once the related animation reaches the active frame. + // The second stage occurs in updateState() + + // pick a power from the available powers for this creature + if (e->stats.cur_state == StatBlock::ENTITY_STANCE || e->stats.cur_state == StatBlock::ENTITY_MOVE) { + StatBlock::AIPower* ai_power = NULL; + + // check half dead power use + if (e->stats.half_dead_power && e->stats.hp <= e->stats.get(Stats::HP_MAX)/2) { + ai_power = e->stats.getAIPower(StatBlock::AI_POWER_HALF_DEAD); + } + // check ranged power use + else if (target_dist > e->stats.melee_range) { + ai_power = e->stats.getAIPower(StatBlock::AI_POWER_RANGED); + } + // check melee power use + else { + ai_power = e->stats.getAIPower(StatBlock::AI_POWER_MELEE); + } + + if (ai_power != NULL) { + const Power& pwr = powers->powers[ai_power->id]; + if (!los && (pwr.requires_los || pwr.requires_los_default)) { + ai_power = NULL; + } + if (ai_power != NULL) { + e->stats.cur_state = StatBlock::ENTITY_POWER; + e->stats.activated_power = ai_power; + } + } + } + + if (e->stats.cur_state != StatBlock::ENTITY_POWER && e->stats.activated_power) { + e->stats.activated_power = NULL; + } +} + +/** + * Check state changes related to movement + */ +void EntityBehavior::checkMove() { + + // dying enemies can't move + if (e->stats.cur_state == StatBlock::ENTITY_DEAD || e->stats.cur_state == StatBlock::ENTITY_CRITDEAD) return; + + // stunned enemies can't act + if (e->stats.effects.stun) return; + + // handle not being in combat and (not patrolling waypoints or waiting at waypoint) + if (!e->stats.hero_ally && !e->stats.in_combat && (e->stats.waypoints.empty() || !e->stats.waypoint_timer.isEnd())) { + + if (e->stats.cur_state == StatBlock::ENTITY_MOVE) { + e->stats.cur_state = StatBlock::ENTITY_STANCE; + } + + // currently enemies only move while in combat or patrolling + return; + } + + float real_speed = e->stats.speed * StatBlock::SPEED_MULTIPLIER[e->stats.direction] * e->stats.effects.speed / 100; + + unsigned turn_ticks = turn_timer.getCurrent(); + turn_timer.setDuration(e->stats.turn_delay); + + // If an enemy's turn_delay is too long compared to their speed, they will be unable to follow a path properly. + // So here, we get how many frames it takes to traverse a single tile and then compare it to the turn delay time. + // We then cap the turn delay the time at the number of frames we calculated for tile traversal. + // There may be other solutions to this problem, such as having the enemy pause when they reach a path point, + // but I was unable to get anything else working as cleanly/bug-free as this. + int max_turn_ticks = static_cast(1.f / real_speed); + if (e->stats.turn_delay > max_turn_ticks) { + turn_timer.setDuration(max_turn_ticks); + } + turn_timer.setCurrent(turn_ticks); + + // clear current space to allow correct movement + mapr->collider.unblock(e->stats.pos.x, e->stats.pos.y); + + path_found_fail_timer.tick(); + + // update direction + if (e->stats.facing) { + turn_timer.tick(); + if (turn_timer.isEnd()) { + + // if blocked, face in pathfinder direction instead + if (!mapr->collider.lineOfMovement(e->stats.pos.x, e->stats.pos.y, pursue_pos.x, pursue_pos.y, e->stats.movement_type)) { + + // if a path is returned, target first waypoint + + bool recalculate_path = false; + + // add a 5% chance to recalculate on every frame. This prevents reclaulating lots of entities in the same frame + chance_calc_path += 5; + + bool calc_path_success = Math::percentChance(chance_calc_path); + if (calc_path_success) + recalculate_path = true; + + // if a collision ocurred then recalculate + if (collided) + recalculate_path = true; + + // if theres no path, it needs to be calculated + if (!recalculate_path && path.empty()) + recalculate_path = true; + + // if the target moved more than 1 tile away, recalculate + if (!recalculate_path && Utils::calcDist(FPoint(Point(prev_target)), FPoint(Point(pursue_pos))) > 1.f) + recalculate_path = true; + + // dont recalculate if we were blocked and no path was found last time + // this makes sure that pathfinding calculation is not spammed when the target is unreachable and the entity is as close as its going to get + if (!path_found && collided && !calc_path_success) { + recalculate_path = false; + } + else { + // reset the collision flag only if we dont want the cooldown in place + collided = false; + } + + if (!path_found_fail_timer.isEnd()) { + recalculate_path = false; + chance_calc_path = -100; + } + + prev_target = pursue_pos; + + // target first waypoint + if (recalculate_path) { + chance_calc_path = -100; + path.clear(); + path_found = mapr->collider.computePath(e->stats.pos, pursue_pos, path, e->stats.movement_type, MapCollision::DEFAULT_PATH_LIMIT); + + if (!path_found) { + path_found_fails++; + if (path_found_fails >= PATH_FOUND_FAIL_THRESHOLD) { + // could not find a path after several tries, so wait a little before the next attempt + path_found_fail_timer.reset(Timer::BEGIN); + } + } + else { + path_found_fails = 0; + path_found_fail_timer.reset(Timer::END); + } + } + + if (!path.empty()) { + pursue_pos = path.back(); + + // if distance to node is lower than a tile size, the node is going to be passed and can be removed + if (Utils::calcDist(e->stats.pos, pursue_pos) <= 1.f) + path.pop_back(); + } + } + else { + path.clear(); + } + + if (e->stats.charge_speed == 0.0f) { + e->stats.direction = Utils::calcDirection(e->stats.pos.x, e->stats.pos.y, pursue_pos.x, pursue_pos.y); + } + turn_timer.reset(Timer::BEGIN); + } + } + + e->stats.flee_timer.tick(); + e->stats.flee_cooldown_timer.tick(); + + // try to start moving + if (e->stats.cur_state == StatBlock::ENTITY_STANCE) { + checkMoveStateStance(); + } + + // already moving + else if (e->stats.cur_state == StatBlock::ENTITY_MOVE) { + checkMoveStateMove(); + } + + // if patrolling waypoints and has reached a waypoint, cycle to the next one + if (!e->stats.waypoints.empty()) { + // if the patroller is close to the waypoint + FPoint waypoint = e->stats.waypoints.front(); + float waypoint_dist = Utils::calcDist(waypoint, e->stats.pos); + + FPoint saved_pos = e->stats.pos; + e->move(); + float new_dist = Utils::calcDist(waypoint, e->stats.pos); + e->stats.pos = saved_pos; + + if (waypoint_dist <= real_speed || (waypoint_dist <= 0.5f && new_dist > waypoint_dist)) { + e->stats.pos = waypoint; + turn_timer.reset(Timer::END); + e->stats.waypoints.pop(); + // pick a new random point if we're wandering + if (e->stats.wander) { + waypoint = getWanderPoint(); + } + e->stats.waypoints.push(waypoint); + e->stats.waypoint_timer.reset(Timer::BEGIN); + } + } + + // re-block current space to allow correct movement + mapr->collider.block(e->stats.pos.x, e->stats.pos.y, e->stats.hero_ally); + +} + +void EntityBehavior::checkMoveStateStance() { + + // If the enemy is capable of fleeing and is at a safe distance, have it hold its position instead of moving + if (target_dist >= e->stats.flee_range && e->stats.chance_flee > 0 && e->stats.waypoints.empty()) return; + + // try to move to the target if we're either: + // 1. too far away and chance_pursue roll succeeds + // 2. within range, but lack line-of-sight (required to attack) + bool ally_targeting_hero = e->stats.hero_ally && !e->stats.in_combat && hero_dist > ALLY_FOLLOW_DISTANCE_WALK; + bool should_move_to_target = (e->stats.in_combat || !e->stats.waypoints.empty()) && ((target_dist > e->stats.melee_range && Math::percentChance(e->stats.chance_pursue)) || (target_dist <= e->stats.melee_range && !los)); + + if (should_move_to_target || fleeing || ally_targeting_hero) { + + if (e->move()) { + e->stats.cur_state = StatBlock::ENTITY_MOVE; + } + else { + collided = true; + unsigned char prev_direction = e->stats.direction; + + // hit an obstacle, try the next best angle + e->stats.direction = e->faceNextBest(pursue_pos.x, pursue_pos.y); + if (e->move()) { + e->stats.cur_state = StatBlock::ENTITY_MOVE; + } + else + e->stats.direction = prev_direction; + } + } +} + +void EntityBehavior::checkMoveStateMove() { + bool can_attack = true; + + if (!e->stats.cooldown.isEnd()) { + can_attack = false; + } + else { + can_attack = false; + for (size_t i = 0; i < e->stats.powers_ai.size(); ++i) { + if (e->stats.powers_ai[i].cooldown.isEnd()) { + can_attack = true; + break; + } + } + } + // in order to prevent infinite fleeing, we re-roll our chance to flee after a certain duration + bool stop_fleeing = can_attack && fleeing && e->stats.flee_timer.isEnd() && !Math::percentChance(e->stats.chance_flee); + + if (!stop_fleeing && e->stats.flee_timer.isEnd()) { + // if the roll to continue fleeing succeeds, but the flee duration has expired, we don't want to reset the duration to the full amount + // instead, we scehdule the next re-roll to happen on the next frame + // this will continue until a roll fails, returning to the stance state + e->stats.flee_timer.setCurrent(1); + } + + // close enough to the hero or is at a safe distance + bool ally_targeting_hero = e->stats.hero_ally && !e->stats.in_combat && !fleeing && hero_dist < ALLY_FOLLOW_DISTANCE_STOP; + if (pc->stats.alive && ((target_dist < e->stats.melee_range && !fleeing) || (move_to_safe_dist && target_dist >= e->stats.flee_range) || stop_fleeing || ally_targeting_hero)) { + if (stop_fleeing) { + e->stats.flee_cooldown_timer.reset(Timer::BEGIN); + } + e->stats.cur_state = StatBlock::ENTITY_STANCE; + move_to_safe_dist = false; + fleeing = false; + } + + // try to continue moving + else if (!e->move()) { + collided = true; + unsigned char prev_direction = e->stats.direction; + // hit an obstacle. Try the next best angle + e->stats.direction = e->faceNextBest(pursue_pos.x, pursue_pos.y); + if (!e->move()) { + // this prevents an ally trying to move perpendicular to a 1-tile-wide path if the player gets close to it in a certain position and gets blocked + if (e->stats.hero_ally && entitym->player_blocked && !e->stats.in_combat) { + e->stats.direction = pc->stats.direction; + if (!e->move()) { + e->stats.cur_state = StatBlock::ENTITY_STANCE; + e->stats.direction = prev_direction; + } + } + else { + e->stats.cur_state = StatBlock::ENTITY_STANCE; + e->stats.direction = prev_direction; + } + } + } +} + + +/** + * Perform miscellaneous state-based actions. + * 1) Set animations and sound effects + * 2) Return to the default state (Stance) when actions are complete + */ +void EntityBehavior::updateState() { + + // stunned enemies can't act + if (e->stats.effects.stun) return; + + PowerID power_id; + int power_state; + + // continue current animations + e->activeAnimation->advanceFrame(); + + switch (e->stats.cur_state) { + + case StatBlock::ENTITY_STANCE: + + e->setAnimation("stance"); + break; + + case StatBlock::ENTITY_MOVE: + + e->setAnimation("run"); + break; + + case StatBlock::ENTITY_POWER: + + if (e->stats.activated_power == NULL) { + e->stats.cur_state = StatBlock::ENTITY_STANCE; + break; + } + + power_id = powers->checkReplaceByEffect(e->stats.activated_power->id, &e->stats); + power_state = powers->powers[power_id].new_state; + e->stats.prevent_interrupt = powers->powers[power_id].prevent_interrupt; + + // animation based on power type + if (power_state == Power::STATE_INSTANT) + instant_power = true; + else if (power_state == Power::STATE_ATTACK) + e->setAnimation(powers->powers[power_id].attack_anim); + + // sound effect based on power type + if (e->activeAnimation->isFirstFrame()) { + if (powers->powers[power_id].pre_power > 0 && Math::percentChance(powers->powers[power_id].pre_power_chance)) { + powers->activate(powers->powers[power_id].pre_power, &e->stats, pursue_pos); + } + + float attack_speed = (e->stats.effects.getAttackSpeed(powers->powers[power_id].attack_anim) * powers->powers[power_id].attack_speed) / 100.0f; + e->activeAnimation->setSpeed(attack_speed); + e->playAttackSound(powers->powers[power_id].attack_anim); + + if (powers->powers[power_id].state_duration > 0) + e->stats.state_timer.setDuration(powers->powers[power_id].state_duration); + + if (powers->powers[power_id].charge_speed != 0.0f) + e->stats.charge_speed = powers->powers[power_id].charge_speed; + } + + // Activate Power: + // if we're at the active frame of a power animation, + // activate the power and set the local and global cooldowns + if ((e->activeAnimation->isActiveFrame() || instant_power) && !e->stats.hold_state) { + powers->activate(power_id, &e->stats, pursue_pos); + + // set cooldown for all ai powers with the same power id + for (size_t i = 0; i < e->stats.powers_ai.size(); ++i) { + if (e->stats.activated_power->id == e->stats.powers_ai[i].id) { + e->stats.powers_ai[i].cooldown.setDuration(powers->powers[power_id].cooldown); + } + } + + if (e->stats.activated_power->type == StatBlock::AI_POWER_HALF_DEAD) { + e->stats.half_dead_power = false; + } + + if (!e->stats.state_timer.isEnd()) + e->stats.hold_state = true; + } + + // animation is finished + if ((e->activeAnimation->isLastFrame() && e->stats.state_timer.isEnd()) || (power_state == Power::STATE_ATTACK && e->activeAnimation->getName() != powers->powers[power_id].attack_anim) || instant_power) { + if (!instant_power) + e->stats.cooldown.reset(Timer::BEGIN); + else + instant_power = false; + + e->stats.activated_power = NULL; + e->stats.cur_state = StatBlock::ENTITY_STANCE; + e->stats.prevent_interrupt = false; + } + break; + + case StatBlock::ENTITY_SPAWN: + + e->setAnimation("spawn"); + //the second check is needed in case the entity does not have a spawn animation + if (e->activeAnimation->isLastFrame() || e->activeAnimation->getName() != "spawn") { + e->stats.cur_state = StatBlock::ENTITY_STANCE; + } + break; + + case StatBlock::ENTITY_BLOCK: + + e->setAnimation("block"); + break; + + case StatBlock::ENTITY_HIT: + + e->setAnimation("hit"); + if (e->activeAnimation->isFirstFrame()) { + e->stats.effects.triggered_hit = true; + } + if (e->activeAnimation->isLastFrame() || e->activeAnimation->getName() != "hit") + e->stats.cur_state = StatBlock::ENTITY_STANCE; + break; + + case StatBlock::ENTITY_DEAD: + if (e->stats.effects.triggered_death) break; + + e->setAnimation("die"); + if (e->activeAnimation->isFirstFrame()) { + e->playSound(Entity::SOUND_DIE); + e->stats.corpse_timer.setDuration(eset->misc.corpse_timeout); + } + if (e->activeAnimation->isSecondLastFrame()) { + StatBlock::AIPower* ai_power = e->stats.getAIPower(StatBlock::AI_POWER_DEATH); + if (ai_power != NULL) + powers->activate(ai_power->id, &e->stats, e->stats.pos); + + e->stats.effects.clearEffects(); + } + if (e->activeAnimation->isLastFrame() || e->activeAnimation->getName() != "die") { + // puts renderable under object layer + e->stats.corpse = true; + + //allow free movement over the corpse + mapr->collider.unblock(e->stats.pos.x, e->stats.pos.y); + + // remove corpses that land on blocked tiles, such as water or pits + if (!mapr->collider.isValidPosition(e->stats.pos.x, e->stats.pos.y, MapCollision::MOVE_NORMAL, MapCollision::COLLIDE_NORMAL)) { + e->stats.corpse_timer.reset(Timer::END); + } + + // prevent "jumping" when rendering + e->stats.pos.align(); + } + + break; + + case StatBlock::ENTITY_CRITDEAD: + + e->setAnimation("critdie"); + if (e->activeAnimation->isFirstFrame()) { + e->playSound(Entity::SOUND_CRITDIE); + e->stats.corpse_timer.setDuration(eset->misc.corpse_timeout); + } + if (e->activeAnimation->isSecondLastFrame()) { + StatBlock::AIPower* ai_power = e->stats.getAIPower(StatBlock::AI_POWER_DEATH); + if (ai_power != NULL) + powers->activate(ai_power->id, &e->stats, e->stats.pos); + + e->stats.effects.clearEffects(); + } + if (e->activeAnimation->isLastFrame() || e->activeAnimation->getName() != "critdie") { + // puts renderable under object layer + e->stats.corpse = true; + + //allow free movement over the corpse + mapr->collider.unblock(e->stats.pos.x, e->stats.pos.y); + + // prevent "jumping" when rendering + e->stats.pos.align(); + } + + break; + + default: + break; + } + + if (e->stats.state_timer.isEnd() && e->stats.hold_state) + e->stats.hold_state = false; + + if (e->stats.cur_state != StatBlock::ENTITY_POWER && e->stats.charge_speed != 0.0f) + e->stats.charge_speed = 0.0f; +} + +FPoint EntityBehavior::getWanderPoint() { + FPoint waypoint; + waypoint.x = static_cast(e->stats.wander_area.x) + static_cast(rand() % (e->stats.wander_area.w)) + 0.5f; + waypoint.y = static_cast(e->stats.wander_area.y) + static_cast(rand() % (e->stats.wander_area.h)) + 0.5f; + + if (mapr->collider.isValidPosition(waypoint.x, waypoint.y, e->stats.movement_type, mapr->collider.getCollideType(e->stats.hero)) && + mapr->collider.lineOfMovement(e->stats.pos.x, e->stats.pos.y, waypoint.x, waypoint.y, e->stats.movement_type)) + { + return waypoint; + } + else { + // didn't get a valid waypoint, so keep our current position + return e->stats.pos; + } +} +EntityBehavior::~EntityBehavior() { +} diff --git a/src/EntityBehavior.h b/src/EntityBehavior.h new file mode 100644 index 0000000..3aea7cd --- /dev/null +++ b/src/EntityBehavior.h @@ -0,0 +1,85 @@ +/* +Copyright © 2012 Clint Bellanger +Copyright © 2012 Stefan Beller +Copyright © 2013 Ryan Dansie +Copyright © 2012-2021 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/** + * class EntityBehavior + * + * Interface for entity behaviors. + * The behavior object is a component of Entity. + * Make AI decisions (movement, actions) for entities. + */ + + +#ifndef ENTITY_BEHAVIOR_H +#define ENTITY_BEHAVIOR_H + +class Entity; + +class EntityBehavior { +private: + static const float ALLY_FLEE_DISTANCE; + static const float ALLY_FOLLOW_DISTANCE_WALK; + static const float ALLY_FOLLOW_DISTANCE_STOP; + static const float ALLY_TELEPORT_DISTANCE; + + // logic steps + void doUpkeep(); + void findTarget(); + void checkPower(); + void checkMove(); + void checkMoveStateStance(); + void checkMoveStateMove(); + void updateState(); + FPoint getWanderPoint(); + +protected: + Entity *e; + + static const int PATH_FOUND_FAIL_THRESHOLD = 1; + static const int PATH_FOUND_FAIL_WAIT_SECONDS = 2; + + //variables for patfinding + std::vector path; + FPoint prev_target; + bool collided; + bool path_found; + int chance_calc_path; + int path_found_fails; + Timer path_found_fail_timer; + + float target_dist; + float hero_dist; + FPoint pursue_pos; + // targeting vars + bool los; + //when fleeing, the entity moves away from the pursue_pos + bool fleeing; + bool move_to_safe_dist; + Timer turn_timer; + + bool instant_power; + +public: + EntityBehavior(Entity *_e); + ~EntityBehavior(); + void logic(); +}; + +#endif diff --git a/src/EntityManager.cpp b/src/EntityManager.cpp new file mode 100644 index 0000000..d29489a --- /dev/null +++ b/src/EntityManager.cpp @@ -0,0 +1,532 @@ +/* +Copyright © 2011-2012 Clint Bellanger +Copyright © 2012 Stefan Beller +Copyright © 2013 Henrik Andersson +Copyright © 2012-2016 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +#include "Animation.h" +#include "AnimationManager.h" +#include "AnimationSet.h" +#include "Avatar.h" +#include "CampaignManager.h" +#include "EnemyGroupManager.h" +#include "Entity.h" +#include "EntityBehavior.h" +#include "EntityManager.h" +#include "EngineSettings.h" +#include "EntityBehavior.h" +#include "EventManager.h" +#include "Hazard.h" +#include "MapRenderer.h" +#include "MenuActionBar.h" +#include "PowerManager.h" +#include "RenderDevice.h" +#include "Settings.h" +#include "SharedGameResources.h" +#include "SharedResources.h" + +#include + +EntityManager::EntityManager() + : entities() + , hero_stealth(0) + , player_blocked(false) + , player_blocked_timer(settings->max_frames_per_sec / 6) { + handleNewMap(); +} + +void EntityManager::loadAnimations(Entity *e) { + anim->increaseCount(e->stats.animations); + e->animationSet = anim->getAnimationSet(e->stats.animations); + e->activeAnimation = e->animationSet->getAnimation(""); +} + +Entity *EntityManager::getEntityPrototype(const std::string& type_id) { + Entity* e = new Entity(prototypes.at(loadEntityPrototype(type_id))); + return e; +} + +size_t EntityManager::loadEntityPrototype(const std::string& type_id) { + for (size_t i = 0; i < prototypes.size(); i++) { + if (prototypes[i].type_filename == type_id) { + return i; + } + } + + Entity e = Entity(); + + e.stats.load(type_id); + e.type_filename = type_id; + + if (e.stats.animations == "") + Utils::logError("EntityManager: No animation file specified for entity: %s", type_id.c_str()); + + loadAnimations(&e); + e.loadSounds(); + + // set cooldown_hit to duration of hit animation if undefined + if (!e.stats.cooldown_hit_enabled) { + Animation *hit_anim = e.animationSet->getAnimation("hit"); + if (hit_anim) { + e.stats.cooldown_hit.setDuration(hit_anim->getDuration()); + delete hit_anim; + } + else { + e.stats.cooldown_hit.setDuration(0); + } + } + + prototypes.push_back(e); + size_t prototype = prototypes.size() - 1; + + for (size_t i = 0; i < e.stats.powers_ai.size(); i++) { + PowerID power_index = e.stats.powers_ai[i].id; + const std::string& spawn_type = powers->powers[power_index].spawn_type; + if (power_index != 0 && spawn_type != "" && spawn_type != "untransform") { + std::vector spawn_enemies = enemyg->getEnemiesInCategory(spawn_type); + for (size_t j = 0; j < spawn_enemies.size(); j++) { + loadEntityPrototype(spawn_enemies[j].type); + } + } + } + + return prototype; +} + +/** + * When loading a new map, we eliminate existing entities and load the new ones. + * The map will have loaded Entity blocks into an array; retrieve the entities and init them + */ +void EntityManager::handleNewMap () { + + Map_Enemy me; + std::queue allies; + + // delete existing entities + for (unsigned int i=0; i < entities.size(); i++) { + anim->decreaseCount(entities[i]->animationSet->getName()); + if(entities[i]->stats.hero_ally && !entities[i]->stats.corpse && entities[i]->stats.cur_state != StatBlock::ENTITY_DEAD && entities[i]->stats.cur_state != StatBlock::ENTITY_CRITDEAD && entities[i]->stats.speed > 0.0f) + allies.push(entities[i]); + else { + entities[i]->unloadSounds(); + delete entities[i]; + } + } + entities.clear(); + + + for (unsigned int i=0; i < prototypes.size(); i++) { + anim->decreaseCount(prototypes[i].animationSet->getName()); + prototypes[i].unloadSounds(); + } + prototypes.clear(); + + // load new entities + while (!mapr->enemies.empty()) { + me = mapr->enemies.front(); + mapr->enemies.pop(); + + if (me.type.empty()) { + Utils::logError("EntityManager: Entity(%f, %f) doesn't have type attribute set, skipping", me.pos.x, me.pos.y); + continue; + } + + + bool status_reqs_met = true; + //if the status requirements arent met, dont load the entity + for(unsigned int i = 0; i < me.requires_status.size(); i++) { + if (!camp->checkStatus(me.requires_status[i])) + status_reqs_met = false; + } + for(unsigned int i = 0; i < me.requires_not_status.size(); i++) { + if (camp->checkStatus(me.requires_not_status[i])) + status_reqs_met = false; + } + if(!status_reqs_met) + continue; + + + Entity *e = getEntityPrototype(me.type); + anim->increaseCount(e->stats.animations); + + e->stats.waypoints = me.waypoints; + e->stats.pos.x = me.pos.x; + e->stats.pos.y = me.pos.y; + e->stats.direction = static_cast(me.direction); + e->stats.wander = me.wander_radius > 0; + e->stats.setWanderArea(me.wander_radius); + e->stats.invincible_requires_status = me.invincible_requires_status; + e->stats.invincible_requires_not_status = me.invincible_requires_not_status; + + entities.push_back(e); + + mapr->collider.block(me.pos.x, me.pos.y, !MapCollision::IS_ALLY); + } + + FPoint spawn_pos = mapr->collider.getRandomNeighbor(Point(pc->stats.pos), 1, !MapCollision::IGNORE_BLOCKED); + while (!allies.empty()) { + + Entity *e = allies.front(); + allies.pop(); + + //dont need the result of this. its only called to handle animation and sound + Entity* temp = getEntityPrototype(e->type_filename); + anim->increaseCount(temp->stats.animations); + delete temp; + + e->stats.pos = spawn_pos; + e->stats.direction = pc->stats.direction; + + entities.push_back(e); + + mapr->collider.block(e->stats.pos.x, e->stats.pos.y, MapCollision::IS_ALLY); + } + + // load entities that can be spawn by avatar's powers + for (size_t i = 0; i < pc->stats.powers_list.size(); i++) { + PowerID power_index = pc->stats.powers_list[i]; + const std::string& spawn_type = powers->powers[power_index].spawn_type; + if (spawn_type != "" && spawn_type != "untransform") { + std::vector spawn_enemies = enemyg->getEnemiesInCategory(spawn_type); + for (size_t j = 0; j < spawn_enemies.size(); j++) { + loadEntityPrototype(spawn_enemies[j].type); + } + } + } + + // load entities that can be spawn by powers in the action bar + if (menu_act != NULL) { + for (size_t i = 0; i < menu_act->hotkeys.size(); i++) { + PowerID power_index = menu_act->hotkeys[i]; + const std::string& spawn_type = powers->powers[power_index].spawn_type; + if (power_index != 0 && spawn_type != "" && spawn_type != "untransform") { + std::vector spawn_enemies = enemyg->getEnemiesInCategory(spawn_type); + for (size_t j = 0; j < spawn_enemies.size(); j++) { + loadEntityPrototype(spawn_enemies[j].type); + } + } + } + } + + // load entities that can be spawn by map events + for (size_t i = 0; i < mapr->events.size(); i++) { + for (size_t j = 0; j < mapr->events[i].components.size(); j++) { + if (mapr->events[i].components[j].type == EventComponent::SPAWN) { + std::vector spawn_enemies = enemyg->getEnemiesInCategory(mapr->events[i].components[j].s); + for (size_t k = 0; k < spawn_enemies.size(); k++) { + loadEntityPrototype(spawn_enemies[k].type); + } + } + } + } + + anim->cleanUp(); +} + +/** + * Powers can cause new entities to spawn + * Check PowerManager for any new queued entities + */ +void EntityManager::handleSpawn() { + + Map_Enemy espawn; + + while (!powers->map_enemies.empty()) { + espawn = powers->map_enemies.front(); + powers->map_enemies.pop(); + + mapr->collider.unblock(espawn.pos.x, espawn.pos.y); + + Entity *e = new Entity(); + + e->stats.hero_ally = espawn.hero_ally; + e->stats.enemy_ally = espawn.enemy_ally; + e->stats.summoned = true; + e->stats.summoned_power_index = espawn.summon_power_index; + + if(espawn.summoner != NULL) { + e->stats.summoner = espawn.summoner; + espawn.summoner->summons.push_back(&(e->stats)); + } + + e->stats.direction = static_cast(espawn.direction); + + Enemy_Level el = enemyg->getRandomEnemy(espawn.type, 0, 0); + e->type_filename = el.type; + + if (el.type != "") { + e->stats.load(el.type); + } + else { + Utils::logError("EntityManager: Could not spawn creature type '%s'", espawn.type.c_str()); + delete e; + return; + } + + if (e->stats.animations != "") { + // load the animation file if specified + anim->increaseCount(e->stats.animations); + e->animationSet = anim->getAnimationSet(e->stats.animations); + if (e->animationSet) + e->activeAnimation = e->animationSet->getAnimation(""); + else + Utils::logError("EntityManager: Animations file could not be loaded for %s", espawn.type.c_str()); + } + else { + Utils::logError("EntityManager: No animation file specified for entity: %s", espawn.type.c_str()); + } + e->loadSounds(); + + //Set level + if(e->stats.summoned_power_index != 0) { + if(powers->powers[e->stats.summoned_power_index].spawn_level_mode == Power::SPAWN_LEVEL_MODE_FIXED) + e->stats.level = powers->powers[e->stats.summoned_power_index].spawn_level_qty; + + if(powers->powers[e->stats.summoned_power_index].spawn_level_mode == Power::SPAWN_LEVEL_MODE_LEVEL) { + if(e->stats.summoner != NULL && powers->powers[e->stats.summoned_power_index].spawn_level_every != 0) { + e->stats.level = powers->powers[e->stats.summoned_power_index].spawn_level_qty + * (e->stats.summoner->level / powers->powers[e->stats.summoned_power_index].spawn_level_every); + } + } + + if(powers->powers[e->stats.summoned_power_index].spawn_level_mode == Power::SPAWN_LEVEL_MODE_STAT) { + if(e->stats.summoner != NULL && powers->powers[e->stats.summoned_power_index].spawn_level_every != 0) { + int stat_val = 0; + for (size_t i = 0; i < eset->primary_stats.list.size(); ++i) { + if (powers->powers[e->stats.summoned_power_index].spawn_level_stat == i) { + stat_val = e->stats.summoner->get_primary(i); + break; + } + } + + e->stats.level = powers->powers[e->stats.summoned_power_index].spawn_level_qty + * (stat_val / powers->powers[e->stats.summoned_power_index].spawn_level_every); + } + } + + // apply Effects and set HP to max HP + e->stats.recalc(); + } + + if (mapr->collider.isValidPosition(espawn.pos.x, espawn.pos.y, e->stats.movement_type, MapCollision::COLLIDE_NORMAL) || !e->stats.hero_ally) { + e->stats.pos.x = espawn.pos.x; + e->stats.pos.y = espawn.pos.y; + } + else { + e->stats.pos.x = pc->stats.pos.x; + e->stats.pos.y = pc->stats.pos.y; + } + + // special animation state for spawning entities + e->stats.cur_state = StatBlock::ENTITY_SPAWN; + + //now apply post effects to the spawned entity + if(e->stats.summoned_power_index > 0) + powers->effect(&e->stats, (espawn.summoner != NULL ? espawn.summoner : &e->stats), e->stats.summoned_power_index, e->stats.hero_ally ? Power::SOURCE_TYPE_HERO : Power::SOURCE_TYPE_ENEMY); + + //apply party passives + //synchronise tha party passives in the pc stat block with the passives in the allies stat blocks + //at the time the summon is spawned, it takes the passives available at that time. if the passives change later, the changes wont affect summons retrospectively. could be exploited with equipment switching + for (unsigned i=0; i< pc->stats.powers_passive.size(); i++) { + PowerID pwr = pc->stats.powers_passive[i]; + if (powers->powers[pwr].passive && powers->powers[pwr].buff_party && (e->stats.hero_ally || e->stats.enemy_ally) + && (powers->powers[pwr].buff_party_power_id == 0 || powers->powers[pwr].buff_party_power_id == e->stats.summoned_power_index)) { + + e->stats.powers_passive.push_back(pwr); + } + } + + for (unsigned i=0; istats.powers_list_items.size(); i++) { + PowerID pwr = pc->stats.powers_list_items[i]; + if (powers->powers[pwr].passive && powers->powers[pwr].buff_party && (e->stats.hero_ally || e->stats.enemy_ally) + && (powers->powers[pwr].buff_party_power_id == 0 || powers->powers[pwr].buff_party_power_id == e->stats.summoned_power_index)) { + + e->stats.powers_passive.push_back(pwr); + } + } + + entities.push_back(e); + + mapr->collider.block(e->stats.pos.x, e->stats.pos.y, e->stats.hero_ally); + } +} + +bool EntityManager::checkPartyMembers() { + for (unsigned int i=0; i < entities.size(); i++) { + if(entities[i]->stats.hero_ally && entities[i]->stats.hp > 0) { + return true; + } + } + return false; +} + +/** + * perform logic() for all entities + */ +void EntityManager::logic() { + + if (player_blocked) { + player_blocked_timer.tick(); + if (player_blocked_timer.isEnd()) + player_blocked = false; + } + + handleSpawn(); + + std::vector::iterator it; + for (it = entities.begin(); it != entities.end(); ++it) { + // new actions this round + (*it)->stats.hero_stealth = hero_stealth; + (*it)->logic(); + } +} + +Entity* EntityManager::entityFocus(const Point& mouse, const FPoint& cam, bool alive_only) { + Point p; + Rect r; + for(unsigned int i = 0; i < entities.size(); i++) { + if(alive_only && (entities[i]->stats.cur_state == StatBlock::ENTITY_DEAD || entities[i]->stats.cur_state == StatBlock::ENTITY_CRITDEAD)) { + continue; + } + p = Utils::mapToScreen(entities[i]->stats.pos.x, entities[i]->stats.pos.y, cam.x, cam.y); + + Renderable ren = entities[i]->getRender(); + r.w = ren.src.w; + r.h = ren.src.h; + r.x = p.x - ren.offset.x; + r.y = p.y - ren.offset.y; + + if (Utils::isWithinRect(r, mouse)) { + Entity *entity = entities[i]; + return entity; + } + } + return NULL; +} + +Entity* EntityManager::getNearestEntity(const FPoint& pos, bool get_corpse, float *saved_distance, float max_range) { + Entity* nearest = NULL; + float best_distance = std::numeric_limits::max(); + + for (unsigned i=0; istats.cur_state == StatBlock::ENTITY_DEAD || entities[i]->stats.cur_state == StatBlock::ENTITY_CRITDEAD)) { + continue; + } + if (get_corpse && !entities[i]->stats.corpse) { + continue; + } + + float distance = Utils::calcDist(pos, entities[i]->stats.pos); + if (distance < best_distance) { + best_distance = distance; + nearest = entities[i]; + } + } + + if (nearest && saved_distance) + *saved_distance = best_distance; + + if (!saved_distance && best_distance > max_range) + nearest = NULL; + + return nearest; +} + +bool EntityManager::isCleared() { + if (entities.empty()) return true; + + for (unsigned int i=0; i < entities.size(); i++) { + if (entities[i]->stats.alive && !entities[i]->stats.hero_ally) + return false; + } + + return true; +} + +void EntityManager::spawn(const std::string& entity_type, const Point& target) { + Map_Enemy espawn; + + espawn.type = entity_type; + espawn.pos = FPoint(target); + espawn.pos.x += 0.5f; + espawn.pos.y += 0.5f; + + // quick spawns start facing a random direction + espawn.direction = rand() % 8; + + if (!mapr->collider.isEmpty(espawn.pos.x, espawn.pos.y)) { + return; + } + else { + mapr->collider.block(espawn.pos.x, espawn.pos.y, !MapCollision::IS_ALLY); + } + + powers->map_enemies.push(espawn); +} + +/** + * addRenders() + * Map objects need to be drawn in Z order, so we allow a parent object (GameEngine) + * to collect all mobile sprites each frame. + */ +void EntityManager::addRenders(std::vector &r, std::vector &r_dead) { + std::vector::iterator it; + for (it = entities.begin(); it != entities.end(); ++it) { + bool dead = (*it)->stats.corpse; + if (!dead || !(*it)->stats.corpse_timer.isEnd()) { + Renderable re = (*it)->getRender(); + re.prio = 1; + (*it)->stats.effects.getCurrentColor(re.color_mod); + (*it)->stats.effects.getCurrentAlpha(re.alpha_mod); + + // fade out corpses + unsigned fade_time = (eset->misc.corpse_timeout > settings->max_frames_per_sec) ? settings->max_frames_per_sec : eset->misc.corpse_timeout; + if (dead && fade_time != 0 && (*it)->stats.corpse_timer.getCurrent() <= fade_time) { + re.alpha_mod = static_cast(static_cast((*it)->stats.corpse_timer.getCurrent()) * (re.alpha_mod / static_cast(fade_time))); + } + + // draw corpses below objects so that floor loot is more visible + (dead ? r_dead : r).push_back(re); + + // add effects + for (size_t i = 0; i < (*it)->stats.effects.effect_list.size(); ++i) { + Effect& ei = (*it)->stats.effects.effect_list[i]; + if (ei.animation) { + Renderable ren = ei.animation->getCurrentFrame(0); + ren.map_pos = (*it)->stats.pos; + if (ei.render_above) + ren.prio = 2; + else + ren.prio = 0; + r.push_back(ren); + } + } + } + } +} + +EntityManager::~EntityManager() { + for (unsigned int i=0; i < entities.size(); i++) { + anim->decreaseCount(entities[i]->animationSet->getName()); + entities[i]->unloadSounds(); + delete entities[i]; + } + for (unsigned int i=0; i < prototypes.size(); i++) { + anim->decreaseCount(prototypes[i].animationSet->getName()); + prototypes[i].unloadSounds(); + } +} diff --git a/src/EntityManager.h b/src/EntityManager.h new file mode 100644 index 0000000..d693765 --- /dev/null +++ b/src/EntityManager.h @@ -0,0 +1,80 @@ +/* +Copyright © 2011-2012 Clint Bellanger +Copyright © 2012 Stefan Beller +Copyright © 2013 Henrik Andersson +Copyright © 2012-2016 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/* + * class EntityManager + */ + + +#ifndef ENTITY_MANAGER_H +#define ENTITY_MANAGER_H + +#include "CommonIncludes.h" +#include "Utils.h" + +class Animation; +class Entity; + +class EntityManager { +private: + + void loadAnimations(Entity *e); + + std::vector anim_prefixes; + std::vector > anim_entities; + +protected: + /** + * callee is responsible for deleting returned entity object + */ + size_t loadEntityPrototype(const std::string& type_id); + + std::vector prototypes; + +public: + EntityManager(); + ~EntityManager(); + + Entity *getEntityPrototype(const std::string& type_id); + + void handleNewMap(); + void handleSpawn(); + bool checkPartyMembers(); + void logic(); + void addRenders(std::vector &r, std::vector &r_dead); + void checkEnemiesforXP(); + bool isCleared(); + void spawn(const std::string& entity_type, const Point& target); + Entity *entityFocus(const Point& mouse, const FPoint& cam, bool alive_only); + Entity* getNearestEntity(const FPoint& pos, bool get_corpse, float *saved_distance, float max_range); + + // vars + std::vector entities; + int hero_stealth; + + bool player_blocked; + Timer player_blocked_timer; + + static const bool GET_CORPSE = true; + static const bool IS_ALIVE = true; +}; + + +#endif diff --git a/src/EventManager.cpp b/src/EventManager.cpp index ceace64..9fd7c8f 100644 --- a/src/EventManager.cpp +++ b/src/EventManager.cpp @@ -18,7 +18,7 @@ #include "Avatar.h" #include "CampaignManager.h" -#include "EnemyManager.h" +#include "EntityManager.h" #include "EngineSettings.h" #include "EventManager.h" #include "FileParser.h" @@ -43,7 +43,7 @@ */ Event::Event() : type("") - , activate_type(-1) + , activate_type(ACTIVATE_ON_TRIGGER) , components(std::vector()) , location(Rect()) , hotspot(Rect()) @@ -96,9 +96,12 @@ evnt->type = infile.val; } else if (infile.key == "activate") { - // @ATTR event.activate|["on_trigger", "on_load", "on_leave", "on_mapexit", "on_clear", "static"]|Set the state in which the event will be activated (map events only). + // @ATTR event.activate|["on_trigger", "on_interact", "on_load", "on_leave", "on_mapexit", "on_clear", "static"]|Set the state in which the event will be activated (map events only). on_trigger = the player is standing in the event area or the player interacts with the hotspot. on_interact = the player ineracts with the hotspot. on_mapexit = as the player leaves the map. on_leave = as the player steps outside of an event area they were previously inside of. on_load = as the player enters a map. on_clear = all of the enemies on a map have been defeated. static = constantly, every frame. if (infile.val == "on_trigger") { evnt->activate_type = Event::ACTIVATE_ON_TRIGGER; + } + else if (infile.val == "on_interact") { + evnt->activate_type = Event::ACTIVATE_ON_INTERACT; } else if (infile.val == "on_mapexit") { // no need to set keep_after_trigger to false correctly, it's ignored anyway @@ -119,7 +122,8 @@ evnt->activate_type = Event::ACTIVATE_STATIC; } else { - infile.error("EventManager: Event activation type '%s' unknown, change to \"on_trigger\" to suppress this warning.", infile.val.c_str()); + infile.error("EventManager: Event activation type '%s' unknown. Defaulting to 'on_trigger'.", infile.val.c_str()); + evnt->activate_type = Event::ACTIVATE_ON_TRIGGER; } } else if (infile.key == "location") { @@ -201,7 +205,7 @@ e->s = msg->get(val); } else if (key == "power_path") { - // @ATTR event.power_path|["hero", point]|Event power path + // @ATTR event.power_path|int, int, ["hero", point] : Source X, Source Y, Destination|Path that an event power will take. e->type = EventComponent::POWER_PATH; // x,y are src, if s=="hero" we target the hero, @@ -222,8 +226,8 @@ // @ATTR event.power_damage|int, int : Min, Max|Range of power damage e->type = EventComponent::POWER_DAMAGE; - e->a = Parse::popFirstInt(val); - e->b = Parse::popFirstInt(val); + e->x = Parse::popFirstInt(val); + e->y = Parse::popFirstInt(val); } else if (key == "intermap") { // @ATTR event.intermap|filename, int, int : Map file, X, Y|Jump to specific map at location specified. @@ -387,10 +391,12 @@ e->x = Parse::popFirstInt(val); } else if (key == "requires_item") { - // @ATTR event.requires_item|list(item_id)|Event requires specific item (not equipped) + // @ATTR event.requires_item|list(item_id)|Event requires specific item (not equipped). Quantity can be specified by appending ":Q" to the item_id, where Q is an integer. e->type = EventComponent::REQUIRES_ITEM; - e->x = Parse::popFirstInt(val); + ItemStack item_stack = Parse::toItemQuantityPair(Parse::popFirstString(val)); + e->id = item_stack.item; + e->x = item_stack.quantity; // add repeating requires_item if (evnt) { @@ -399,17 +405,21 @@ evnt->components.push_back(EventComponent()); e = &evnt->components.back(); e->type = EventComponent::REQUIRES_ITEM; - e->x = Parse::toInt(repeat_val); + item_stack = Parse::toItemQuantityPair(repeat_val); + e->id = item_stack.item; + e->x = item_stack.quantity; repeat_val = Parse::popFirstString(val); } } } else if (key == "requires_not_item") { - // @ATTR event.requires_not_item|list(item_id)|Event requires not having a specific item (not equipped) + // @ATTR event.requires_not_item|list(item_id)|Event requires not having a specific item (not equipped). Quantity can be specified by appending ":Q" to the item_id, where Q is an integer. e->type = EventComponent::REQUIRES_NOT_ITEM; - e->x = Parse::popFirstInt(val); + ItemStack item_stack = Parse::toItemQuantityPair(Parse::popFirstString(val)); + e->id = item_stack.item; + e->x = item_stack.quantity; // add repeating requires_not_item if (evnt) { @@ -418,7 +428,9 @@ evnt->components.push_back(EventComponent()); e = &evnt->components.back(); e->type = EventComponent::REQUIRES_NOT_ITEM; - e->x = Parse::toInt(repeat_val); + item_stack = Parse::toItemQuantityPair(repeat_val); + e->id = item_stack.item; + e->x = item_stack.quantity; repeat_val = Parse::popFirstString(val); } @@ -481,10 +493,12 @@ e->x = std::max(Parse::toInt(val), 0); } else if (key == "remove_item") { - // @ATTR event.remove_item|list(item_id)|Removes specified item from hero inventory + // @ATTR event.remove_item|list(item_id)|Removes specified item from hero inventory. Quantity can be specified by appending ":Q" to the item_id, where Q is an integer. e->type = EventComponent::REMOVE_ITEM; - e->x = Parse::popFirstInt(val); + ItemStack item_stack = Parse::toItemQuantityPair(Parse::popFirstString(val)); + e->id = item_stack.item; + e->x = item_stack.quantity; // add repeating remove_item if (evnt) { @@ -493,7 +507,9 @@ evnt->components.push_back(EventComponent()); e = &evnt->components.back(); e->type = EventComponent::REMOVE_ITEM; - e->x = Parse::toInt(repeat_val); + item_stack = Parse::toItemQuantityPair(repeat_val); + e->id = item_stack.item; + e->x = item_stack.quantity; repeat_val = Parse::popFirstString(val); } @@ -512,11 +528,37 @@ e->x = std::max(Parse::toInt(val), 0); } else if (key == "reward_item") { - // @ATTR event.reward_item|item_id, int : Item, Quantity|Reward hero with y number of item x. + // @ATTR event.reward_item|(list(item_id)|Reward hero with a specified item. Quantity can be specified by appending ":Q" to the item_id, where Q is an integer. To maintain backwards compatibility, the quantity must be defined for at least the first item in the list in order to use this syntax. + // @ATTR event.reward_item|item_id, int : Item, Quantity|Reward hero with y number of item x. NOTE: This syntax is maintained for backwards compatibility. It is recommended to use the above syntax instead. e->type = EventComponent::REWARD_ITEM; - e->x = Parse::popFirstInt(val); - e->y = std::max(Parse::popFirstInt(val), 1); + bool check_pair = false; + ItemStack item_stack = Parse::toItemQuantityPair(Parse::popFirstString(val), &check_pair); + + if (!check_pair) { + // item:quantity syntax not detected, falling back to the old syntax + e->id = item_stack.item; + e->x = std::max(Parse::popFirstInt(val), 1); + } + else { + e->id = item_stack.item; + e->x = item_stack.quantity; + + // add repeating reward_item + if (evnt) { + std::string repeat_val = Parse::popFirstString(val); + while (repeat_val != "") { + evnt->components.push_back(EventComponent()); + e = &evnt->components.back(); + e->type = EventComponent::REWARD_ITEM; + item_stack = Parse::toItemQuantityPair(repeat_val); + e->id = item_stack.item; + e->x = item_stack.quantity; + + repeat_val = Parse::popFirstString(val); + } + } + } } else if (key == "reward_loot") { // @ATTR event.reward_loot|list(loot)|Reward hero with random loot. @@ -541,7 +583,7 @@ // @ATTR event.power|power_id|Specify power coupled with event. e->type = EventComponent::POWER; - e->x = Parse::toInt(val); + e->id = Parse::toPowerID(val); } else if (key == "spawn") { // @ATTR event.spawn|list(predefined_string, int, int) : Enemy category, X, Y|Spawn an enemy from this category at location @@ -640,6 +682,18 @@ if (!use_engine_defaults.empty()) e->y = static_cast(Parse::toBool(use_engine_defaults)); + } + else if (key == "show_on_minimap") { + // @ATTR event.show_on_minimap|bool|If true, this event will be shown on the minimap if it is the appropriate type (e.g. an intermap teleport). + e->type = EventComponent::SHOW_ON_MINIMAP; + + e->x = static_cast(Parse::toBool(val)); + } + else if (key == "parallax_layers") { + // @ATTR event.parallax_layers|filename|Filename of a parallax layers definition to load. + e->type = EventComponent::PARALLAX_LAYERS; + + e->s = val; } else { return false; @@ -807,13 +861,13 @@ pc->logMsg(ec->s, Avatar::MSG_UNIQUE); } else if (ec->type == EventComponent::SHAKYCAM) { - mapr->shaky_cam_timer.setDuration(ec->x); + mapr->cam.shake_timer.setDuration(ec->x); } else if (ec->type == EventComponent::REMOVE_CURRENCY) { camp->removeCurrency(ec->x); } else if (ec->type == EventComponent::REMOVE_ITEM) { - camp->removeItem(ec->x); + camp->removeItem(ItemStack(ec->id, ec->x)); } else if (ec->type == EventComponent::REWARD_XP) { camp->rewardXP(ec->x, CampaignManager::XP_SHOW_MSG); @@ -822,10 +876,7 @@ camp->rewardCurrency(ec->x); } else if (ec->type == EventComponent::REWARD_ITEM) { - ItemStack istack; - istack.item = ec->x; - istack.quantity = ec->y; - camp->rewardItem(istack); + camp->rewardItem(ItemStack(ec->id, ec->x)); } else if (ec->type == EventComponent::REWARD_LOOT) { std::vector random_table; @@ -859,7 +910,7 @@ Point spawn_pos; spawn_pos.x = ec->x; spawn_pos.y = ec->y; - enemym->spawn(ec->s, spawn_pos); + entitym->spawn(ec->s, spawn_pos); } else if (ec->type == EventComponent::POWER) { EventComponent *ec_path = ev.getComponent(EventComponent::POWER_PATH); @@ -883,9 +934,9 @@ target.y = static_cast(ev.location.y) + 0.5f; } - // ec->x is power id - // ec->y is statblock index - mapr->activatePower(ec->x, ec->y, target); + // ec->id is power id + // ec->x is statblock index + mapr->activatePower(ec->id, ec->x, target); } else if (ec->type == EventComponent::STASH) { mapr->stash = ec->x == 0 ? false : true; @@ -962,15 +1013,18 @@ } menu_powers->setUnlockedPowers(); - menu_act->clear(); + menu_act->clear(MenuActionBar::CLEAR_SKIP_ITEMS); if (pc_class && !use_engine_defaults) { - menu->act->set(pc_class->hotkeys); + menu->act->set(pc_class->hotkeys, MenuActionBar::SET_SKIP_EMPTY); } menu->pow->newPowerNotification = false; pc->respawn = true; // re-applies equipment, also revives the player pc->stats.refresh_stats = true; } + } + else if (ec->type == EventComponent::PARALLAX_LAYERS) { + mapr->setMapParallax(ec->s); } } return !ev.keep_after_trigger; @@ -1006,7 +1060,7 @@ if (script_evnt.empty()) continue; - if (script_file.key == "script" && script_file.val == filename) { + if (script_file.key == "script" && Filesystem::convertSlashes(script_file.val) == Filesystem::convertSlashes(filename)) { script_file.error("EventManager: Calling a script from within itself is not allowed."); continue; } @@ -1019,7 +1073,7 @@ // create StatBlocks if we need them EventComponent *ec_power = script_evnt.front().getComponent(EventComponent::POWER); if (ec_power) { - ec_power->y = mapr->addEventStatBlock(script_evnt.front()); + ec_power->x = mapr->addEventStatBlock(script_evnt.front()); } if (isActive(script_evnt.front())) { diff --git a/src/EventManager.h b/src/EventManager.h index 4c75c54..ff8d6eb 100644 --- a/src/EventManager.h +++ b/src/EventManager.h @@ -75,21 +75,24 @@ SCRIPT = 41, CHANCE_EXEC = 42, RESPEC = 43, - NPC_ID = 44, - NPC_HOTSPOT = 45, - NPC_DIALOG_THEM = 46, - NPC_DIALOG_YOU = 47, - NPC_VOICE = 48, - NPC_DIALOG_TOPIC = 49, - NPC_DIALOG_GROUP = 50, - NPC_DIALOG_ID = 51, - NPC_DIALOG_RESPONSE = 52, - NPC_DIALOG_RESPONSE_ONLY = 53, - NPC_ALLOW_MOVEMENT = 54, - NPC_PORTRAIT_THEM = 55, - NPC_PORTRAIT_YOU = 56, - QUEST_TEXT = 57, - WAS_INSIDE_EVENT_AREA = 58 + SHOW_ON_MINIMAP = 44, + PARALLAX_LAYERS = 45, + NPC_ID = 46, + NPC_HOTSPOT = 47, + NPC_DIALOG_THEM = 48, + NPC_DIALOG_YOU = 49, + NPC_VOICE = 50, + NPC_DIALOG_TOPIC = 51, + NPC_DIALOG_GROUP = 52, + NPC_DIALOG_ID = 53, + NPC_DIALOG_RESPONSE = 54, + NPC_DIALOG_RESPONSE_ONLY = 55, + NPC_ALLOW_MOVEMENT = 56, + NPC_PORTRAIT_THEM = 57, + NPC_PORTRAIT_YOU = 58, + QUEST_TEXT = 59, + WAS_INSIDE_EVENT_AREA = 60, + NPC_TAKE_A_PARTY = 61 }; int type; @@ -101,6 +104,8 @@ int a; int b; int c; + float f; + size_t id; EventComponent() : type(NONE) @@ -111,7 +116,9 @@ , z(0) , a(0) , b(0) - , c(0) { + , c(0) + , f(0) + , id(0) { } }; @@ -119,11 +126,12 @@ public: enum { ACTIVATE_ON_TRIGGER = 0, - ACTIVATE_ON_MAPEXIT = 1, - ACTIVATE_ON_LEAVE = 2, - ACTIVATE_ON_LOAD = 3, - ACTIVATE_ON_CLEAR = 4, - ACTIVATE_STATIC = 5 + ACTIVATE_ON_INTERACT = 1, + ACTIVATE_ON_MAPEXIT = 2, + ACTIVATE_ON_LEAVE = 3, + ACTIVATE_ON_LOAD = 4, + ACTIVATE_ON_CLEAR = 5, + ACTIVATE_STATIC = 6 }; std::string type; diff --git a/src/FileParser.cpp b/src/FileParser.cpp index a6e19a9..7dac4f1 100644 --- a/src/FileParser.cpp +++ b/src/FileParser.cpp @@ -43,10 +43,10 @@ filenames.clear(); if (is_mod_file) { - filenames = mods->list(_filename, ModManager::LIST_FULL_PATHS); + filenames = mods->list(Filesystem::convertSlashes(_filename), ModManager::LIST_FULL_PATHS); } else { - filenames.push_back(_filename); + filenames.push_back(Filesystem::convertSlashes(_filename)); } current_index = 0; line_number = 0; @@ -232,7 +232,7 @@ va_list args; va_start(args, format); - vsprintf(buffer, format, args); + vsnprintf(buffer, 4096, format, args); va_end(args); errorBuf(buffer); diff --git a/src/FontEngine.cpp b/src/FontEngine.cpp index 4a03e9b..b7612c5 100644 --- a/src/FontEngine.cpp +++ b/src/FontEngine.cpp @@ -130,35 +130,35 @@ int max_width = 0; std::string next_word; - std::stringstream builder; - std::stringstream builder_prev; + std::string builder(""); + std::string builder_prev(""); char space = 32; size_t cursor = 0; std::string fulltext = text + " "; std::string long_token; - builder.str(""); - builder_prev.str(""); + builder.reserve(BUILDER_RESERVE); + builder_prev.reserve(BUILDER_RESERVE); next_word = getNextToken(fulltext, cursor, space); while(cursor != std::string::npos) { size_t old_cursor = cursor; - builder << next_word; - - if (calc_width(builder.str()) > width) { + builder += next_word; + + if (calc_width(builder) > width) { // this word can't fit on this line, so word wrap - if (!builder_prev.str().empty()) { + if (!builder_prev.empty()) { height += getLineHeight(); - if (calc_width(builder_prev.str()) > max_width) { - max_width = calc_width(builder_prev.str()); + if (calc_width(builder_prev) > max_width) { + max_width = calc_width(builder_prev); } } - builder_prev.str(""); - builder.str(""); + builder = ""; + builder_prev = ""; long_token = popTokenByWidth(next_word, width); @@ -177,12 +177,12 @@ } } - builder << next_word << " "; - builder_prev.str(builder.str()); + builder += next_word + " "; + builder_prev = builder; } else { - builder << " "; - builder_prev.str(builder.str()); + builder += " "; + builder_prev = builder; } next_word = getNextToken(fulltext, cursor, space); // next word @@ -192,10 +192,11 @@ break; } - builder.str(Parse::trim(builder.str())); //removes whitespace that shouldn't be included in the size - if (!builder.str().empty()) + builder = Parse::trim(builder); //removes whitespace that shouldn't be included in the size + if (!builder.empty()) height += getLineHeight(); - if (calc_width(builder.str()) > max_width) max_width = calc_width(builder.str()); + if (calc_width(builder) > max_width) + max_width = calc_width(builder); // handle blank lines if (text_with_newlines == " ") @@ -244,29 +245,29 @@ std::string fulltext = text + " "; cursor_y = y; std::string next_word; - std::stringstream builder; - std::stringstream builder_prev; + std::string builder(""); + std::string builder_prev(""); char space = 32; size_t cursor = 0; std::string long_token; - builder.str(""); - builder_prev.str(""); + builder.reserve(BUILDER_RESERVE); + builder_prev.reserve(BUILDER_RESERVE); next_word = getNextToken(fulltext, cursor, space); while(cursor != std::string::npos) { size_t old_cursor = cursor; - builder << next_word; - - if (calc_width(builder.str()) > width) { - if (!builder_prev.str().empty()) { - renderInternal(builder_prev.str(), x, cursor_y, justify, target, color); + builder += next_word; + + if (calc_width(builder) > width) { + if (!builder_prev.empty()) { + renderInternal(builder_prev, x, cursor_y, justify, target, color); cursor_y += getLineHeight(); } - builder_prev.str(""); - builder.str(""); + builder = ""; + builder_prev = ""; long_token = popTokenByWidth(next_word, width); @@ -283,12 +284,12 @@ } } - builder << next_word << " "; - builder_prev.str(builder.str()); + builder += next_word + " "; + builder_prev = builder; } else { - builder << " "; - builder_prev.str(builder.str()); + builder += " "; + builder_prev = builder; } next_word = getNextToken(fulltext, cursor, space); // next word @@ -298,7 +299,7 @@ break; } - renderInternal(builder.str(), x, cursor_y, justify, target, color); + renderInternal(builder, x, cursor_y, justify, target, color); cursor_y += getLineHeight(); } diff --git a/src/FontEngine.h b/src/FontEngine.h index b73628c..0c10300 100644 --- a/src/FontEngine.h +++ b/src/FontEngine.h @@ -100,6 +100,9 @@ std::string getNextToken(const std::string& s, size_t& cursor, char separator); std::vector font_colors; + +private: + static const size_t BUILDER_RESERVE = 128; }; #endif diff --git a/src/GameStateConfig.cpp b/src/GameStateConfig.cpp new file mode 100644 index 0000000..ae85a22 --- /dev/null +++ b/src/GameStateConfig.cpp @@ -0,0 +1,161 @@ +/* +Copyright © 2012 Clint Bellanger +Copyright © 2012 davidriod +Copyright © 2012 Igor Paliychuk +Copyright © 2012 Stefan Beller +Copyright © 2013 Kurt Rinnert +Copyright © 2014 Henrik Andersson +Copyright © 2014-2016 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/** + * GameStateConfig + * + * Handle game Settings Menu + */ + +#include "CombatText.h" +#include "DeviceList.h" +#include "EngineSettings.h" +#include "FontEngine.h" +#include "GameStateConfig.h" +#include "GameStateTitle.h" +#include "InputState.h" +#include "MenuConfig.h" +#include "MessageEngine.h" +#include "ModManager.h" +#include "RenderDevice.h" +#include "Settings.h" +#include "SharedResources.h" +#include "SoundManager.h" +#include "Stats.h" +#include "TooltipManager.h" + +GameStateConfig::GameStateConfig () + : GameState() + , menu_config(new MenuConfig(MenuConfig::IS_GAME_STATE)) +{ + + // don't save settings if we close the game while in this menu + save_settings_on_exit = false; +} + +GameStateConfig::~GameStateConfig() { + delete menu_config; +} + +void GameStateConfig::logic() { + menu_config->logic(); + + if (menu_config->force_refresh_background) { + force_refresh_background = true; + menu_config->force_refresh_background = false; + } + if (menu_config->reload_music) { + reload_music = true; + menu_config->reload_music = false; + } + + if (menu_config->clicked_accept) { + menu_config->clicked_accept = false; + logicAccept(); + } + else if (menu_config->clicked_cancel) { + menu_config->clicked_cancel = false; + logicCancel(); + } +} + +void GameStateConfig::logicAccept() { + // new_render_device = renderer_lstb->getValue(); + std::string new_render_device = menu_config->getRenderDevice(); + + if (menu_config->setMods()) { + snd->unloadMusic(); + reload_music = true; + reload_backgrounds = true; + delete mods; + mods = new ModManager(NULL); + settings->prev_save_slot = -1; + } + delete msg; + msg = new MessageEngine(); + inpt->saveKeyBindings(); + inpt->setKeybindNames(); + eset->load(); + Stats::init(); + refreshFont(); + if ((settings->enable_joystick) && (inpt->getNumJoysticks() > 0)) { + inpt->initJoystick(); + } + menu_config->cleanup(); + + showLoading(); + // need to delete the "Loading..." message here, as we're recreating our render context + if (loading_tip) { + delete loading_tip; + loading_tip = NULL; + } + + delete tooltipm; + + // we can't replace the render device in-place, so soft-reset the game + if (new_render_device != settings->render_device_name) { + settings->render_device_name = new_render_device; + inpt->done = true; + settings->soft_reset = true; + } + + render_device->createContext(); + tooltipm = new TooltipManager(); + settings->saveSettings(); + setRequestedGameState(new GameStateTitle()); +} + +void GameStateConfig::logicCancel() { + inpt->lock[Input::CANCEL] = true; + settings->loadSettings(); + inpt->loadKeyBindings(); + delete msg; + msg = new MessageEngine(); + inpt->setKeybindNames(); + eset->load(); + Stats::init(); + refreshFont(); + menu_config->update(); + menu_config->cleanup(); + render_device->windowResize(); + render_device->updateTitleBar(); + showLoading(); + setRequestedGameState(new GameStateTitle()); +} + +void GameStateConfig::render() { + if (requestedGameState != NULL) { + // we're in the process of switching game states, so skip rendering + return; + } + + menu_config->render(); +} + +void GameStateConfig::refreshFont() { + delete font; + font = getFontEngine(); + delete comb; + comb = new CombatText(); +} + diff --git a/src/GameStateConfig.h b/src/GameStateConfig.h new file mode 100644 index 0000000..e8b255b --- /dev/null +++ b/src/GameStateConfig.h @@ -0,0 +1,53 @@ +/* +Copyright © 2012 Clint Bellanger +Copyright © 2012 davidriod +Copyright © 2012 Igor Paliychuk +Copyright © 2013 Kurt Rinnert +Copyright © 2014-2016 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/** + * GameStateConfig + * + * Handle game Settings Menu + */ + +#ifndef GAMESTATECONFIG_H +#define GAMESTATECONFIG_H + +#include "CommonIncludes.h" +#include "GameState.h" + +class MenuConfig; + +class GameStateConfig : public GameState { +private: + MenuConfig* menu_config; + +public: + explicit GameStateConfig(); + ~GameStateConfig(); + + void logic(); + void logicAccept(); + void logicCancel(); + void refreshFont(); + + void render(); +}; + +#endif + diff --git a/src/GameStateConfigBase.cpp b/src/GameStateConfigBase.cpp deleted file mode 100644 index b7a1faa..0000000 --- a/src/GameStateConfigBase.cpp +++ /dev/null @@ -1,954 +0,0 @@ -/* -Copyright © 2012 Clint Bellanger -Copyright © 2012 davidriod -Copyright © 2012 Igor Paliychuk -Copyright © 2012 Stefan Beller -Copyright © 2013 Kurt Rinnert -Copyright © 2014 Henrik Andersson -Copyright © 2014-2016 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -/** - * GameStateConfigBase - * - * Handle game Settings Menu - */ - -#include "CombatText.h" -#include "CommonIncludes.h" -#include "DeviceList.h" -#include "EngineSettings.h" -#include "FileParser.h" -#include "FontEngine.h" -#include "GameStateConfigBase.h" -#include "GameStateTitle.h" -#include "InputState.h" -#include "MenuConfirm.h" -#include "MessageEngine.h" -#include "ModManager.h" -#include "Platform.h" -#include "RenderDevice.h" -#include "Settings.h" -#include "SharedResources.h" -#include "SoundManager.h" -#include "Stats.h" -#include "TooltipManager.h" -#include "UtilsFileSystem.h" -#include "UtilsParsing.h" -#include "Version.h" -#include "WidgetButton.h" -#include "WidgetCheckBox.h" -#include "WidgetListBox.h" -#include "WidgetSlider.h" -#include "WidgetTabControl.h" - -GameStateConfigBase::GameStateConfigBase (bool do_init) - : GameState() - , child_widget() - , ok_button(new WidgetButton(WidgetButton::DEFAULT_FILE)) - , defaults_button(new WidgetButton(WidgetButton::DEFAULT_FILE)) - , cancel_button(new WidgetButton(WidgetButton::DEFAULT_FILE)) - , background(NULL) - , show_fps_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , show_fps_lb(new WidgetLabel()) - , hardware_cursor_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , hardware_cursor_lb(new WidgetLabel()) - , colorblind_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , colorblind_lb(new WidgetLabel()) - , dev_mode_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , dev_mode_lb(new WidgetLabel()) - , subtitles_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , subtitles_lb(new WidgetLabel()) - , music_volume_sl(new WidgetSlider(WidgetSlider::DEFAULT_FILE)) - , music_volume_lb(new WidgetLabel()) - , sound_volume_sl(new WidgetSlider(WidgetSlider::DEFAULT_FILE)) - , sound_volume_lb(new WidgetLabel()) - , activemods_lstb(new WidgetListBox(10, WidgetListBox::DEFAULT_FILE)) - , activemods_lb(new WidgetLabel()) - , inactivemods_lstb(new WidgetListBox(10, WidgetListBox::DEFAULT_FILE)) - , inactivemods_lb(new WidgetLabel()) - , language_lstb(new WidgetListBox(10, WidgetListBox::DEFAULT_FILE)) - , language_lb(new WidgetLabel()) - , activemods_shiftup_btn(new WidgetButton("images/menus/buttons/up.png")) - , activemods_shiftdown_btn(new WidgetButton("images/menus/buttons/down.png")) - , activemods_deactivate_btn(new WidgetButton(WidgetButton::DEFAULT_FILE)) - , inactivemods_activate_btn(new WidgetButton(WidgetButton::DEFAULT_FILE)) - , defaults_confirm(new MenuConfirm(msg->get("Defaults"), msg->get("Reset ALL settings?"))) - , active_tab(0) - , frame(0,0) - , frame_offset(11,8) - , tab_offset(3,0) - , new_render_device(settings->render_device_name) -{ - - // don't save settings if we close the game while in this menu - save_settings_on_exit = false; - - Image *graphics; - graphics = render_device->loadImage("images/menus/config.png", RenderDevice::ERROR_NORMAL); - if (graphics) { - background = graphics->createSprite(); - graphics->unref(); - } - - tab_control = new WidgetTabControl(); - - ok_button->setLabel(msg->get("OK")); - defaults_button->setLabel(msg->get("Defaults")); - cancel_button->setLabel(msg->get("Cancel")); - - language_lstb->can_deselect = false; - - // Finish Mods ListBoxes setup - activemods_lstb->multi_select = true; - for (unsigned int i = 0; i < mods->mod_list.size() ; i++) { - if (mods->mod_list[i].name != mods->FALLBACK_MOD) - activemods_lstb->append(mods->mod_list[i].name,createModTooltip(&mods->mod_list[i])); - } - - inactivemods_lstb->multi_select = true; - for (unsigned int i = 0; imod_dirs.size(); i++) { - bool skip_mod = false; - for (unsigned int j = 0; jmod_list.size(); j++) { - if (mods->mod_dirs[i] == mods->mod_list[j].name) { - skip_mod = true; - break; - } - } - if (!skip_mod && mods->mod_dirs[i] != mods->FALLBACK_MOD) { - Mod temp_mod = mods->loadMod(mods->mod_dirs[i]); - inactivemods_lstb->append(mods->mod_dirs[i],createModTooltip(&temp_mod)); - } - } - inactivemods_lstb->sort(); - - if (do_init) { - init(); - } - else { - // these will be initialized properly by a derevitive class (i.e. GameStateConfigDesktop) - AUDIO_TAB = 0; - INTERFACE_TAB = 0; - MODS_TAB = 0; - } - - render_device->setBackgroundColor(Color(0,0,0,0)); -} - -GameStateConfigBase::~GameStateConfigBase() { - cleanup(); -} - -void GameStateConfigBase::init() { - AUDIO_TAB = 0; - INTERFACE_TAB = 1; - MODS_TAB = 2; - - tab_control->setTabTitle(AUDIO_TAB, msg->get("Audio")); - tab_control->setTabTitle(INTERFACE_TAB, msg->get("Interface")); - tab_control->setTabTitle(MODS_TAB, msg->get("Mods")); - - readConfig(); - - addChildWidgets(); - setupTabList(); - - refreshWidgets(); - - update(); -} - -void GameStateConfigBase::readConfig() { - //Load the menu configuration from file - - FileParser infile; - if (infile.open("menus/config.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { - while (infile.next()) { - if (parseKeyButtons(infile)) - continue; - - int x1 = Parse::popFirstInt(infile.val); - int y1 = Parse::popFirstInt(infile.val); - int x2 = Parse::popFirstInt(infile.val); - int y2 = Parse::popFirstInt(infile.val); - - if (parseKey(infile, x1, y1, x2, y2)) - continue; - else if (parseStub(infile)) - continue; - else { - infile.error("GameStateConfigBase: '%s' is not a valid key.", infile.key.c_str()); - } - } - infile.close(); - } -} - -bool GameStateConfigBase::parseKeyButtons(FileParser &infile) { - // @CLASS GameStateConfigBase|Description of menus/config.txt - - if (infile.key == "button_ok") { - // @ATTR button_ok|int, int, alignment : X, Y, Alignment|Position of the "OK" button. - int x = Parse::popFirstInt(infile.val); - int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); - ok_button->setBasePos(x, y, a); - } - else if (infile.key == "button_defaults") { - // @ATTR button_defaults|int, int, alignment : X, Y, Alignment|Position of the "Defaults" button. - int x = Parse::popFirstInt(infile.val); - int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); - defaults_button->setBasePos(x, y, a); - } - else if (infile.key == "button_cancel") { - // @ATTR button_cancel|int, int, alignment : X, Y, Alignment|Position of the "Cancel" button. - int x = Parse::popFirstInt(infile.val); - int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); - cancel_button->setBasePos(x, y, a); - } - else { - return false; - } - - return true; -} -bool GameStateConfigBase::parseKey(FileParser &infile, int &x1, int &y1, int &x2, int &y2) { - if (infile.key == "listbox_scrollbar_offset") { - // @ATTR listbox_scrollbar_offset|int|Horizontal offset from the right of listboxes (mods, languages, etc) to place the scrollbar. - activemods_lstb->scrollbar_offset = x1; - inactivemods_lstb->scrollbar_offset = x1; - language_lstb->scrollbar_offset = x1; - } - else if (infile.key == "frame_offset") { - // @ATTR frame_offset|point|Offset for all the widgets contained under each tab. - frame_offset.x = x1; - frame_offset.y = y1; - } - else if (infile.key == "tab_offset") { - // @ATTR tab_offset|point|Offset for the row of tabs. - tab_offset.x = x1; - tab_offset.y = y1; - } - else if (infile.key == "music_volume") { - // @ATTR music_volume|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Music Volume" slider relative to the frame. - placeLabeledWidget(music_volume_lb, music_volume_sl, x1, y1, x2, y2, msg->get("Music Volume"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "sound_volume") { - // @ATTR sound_volume|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Sound Volume" slider relative to the frame. - placeLabeledWidget(sound_volume_lb, sound_volume_sl, x1, y1, x2, y2, msg->get("Sound Volume"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "language") { - // @ATTR language|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Language" list box relative to the frame. - placeLabeledWidget(language_lb, language_lstb, x1, y1, x2, y2, msg->get("Language")); - language_lb->setJustify(FontEngine::JUSTIFY_CENTER); - } - else if (infile.key == "language_height") { - // @ATTR language_height|int|Number of visible rows for the "Language" list box. - language_lstb->setHeight(x1); - } - else if (infile.key == "show_fps") { - // @ATTR show_fps|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Show FPS" checkbox relative to the frame. - placeLabeledWidget(show_fps_lb, show_fps_cb, x1, y1, x2, y2, msg->get("Show FPS"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "colorblind") { - // @ATTR colorblind|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Colorblind Mode" checkbox relative to the frame. - placeLabeledWidget(colorblind_lb, colorblind_cb, x1, y1, x2, y2, msg->get("Colorblind Mode"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "hardware_cursor") { - // @ATTR hardware_cursor|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Hardware mouse cursor" checkbox relative to the frame. - placeLabeledWidget(hardware_cursor_lb, hardware_cursor_cb, x1, y1, x2, y2, msg->get("Hardware mouse cursor"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "dev_mode") { - // @ATTR dev_mode|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Developer Mode" checkbox relative to the frame. - placeLabeledWidget(dev_mode_lb, dev_mode_cb, x1, y1, x2, y2, msg->get("Developer Mode"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "subtitles") { - // @ATTR subtitles|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Subtitles" checkbox relative to the frame. - placeLabeledWidget(subtitles_lb, subtitles_cb, x1, y1, x2, y2, msg->get("Subtitles"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "activemods") { - // @ATTR activemods|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Active Mods" list box relative to the frame. - placeLabeledWidget(activemods_lb, activemods_lstb, x1, y1, x2, y2, msg->get("Active Mods")); - activemods_lb->setJustify(FontEngine::JUSTIFY_CENTER); - } - else if (infile.key == "activemods_height") { - // @ATTR activemods_height|int|Number of visible rows for the "Active Mods" list box. - activemods_lstb->setHeight(x1); - } - else if (infile.key == "inactivemods") { - // @ATTR inactivemods|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Available Mods" list box relative to the frame. - placeLabeledWidget(inactivemods_lb, inactivemods_lstb, x1, y1, x2, y2, msg->get("Available Mods")); - inactivemods_lb->setJustify(FontEngine::JUSTIFY_CENTER); - } - else if (infile.key == "inactivemods_height") { - // @ATTR inactivemods_height|int|Number of visible rows for the "Available Mods" list box. - inactivemods_lstb->setHeight(x1); - } - else if (infile.key == "activemods_shiftup") { - // @ATTR activemods_shiftup|point|Position of the button to shift mods up in "Active Mods" relative to the frame. - activemods_shiftup_btn->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); - activemods_shiftup_btn->refresh(); - } - else if (infile.key == "activemods_shiftdown") { - // @ATTR activemods_shiftdown|point|Position of the button to shift mods down in "Active Mods" relative to the frame. - activemods_shiftdown_btn->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); - activemods_shiftdown_btn->refresh(); - } - else if (infile.key == "activemods_deactivate") { - // @ATTR activemods_deactivate|point|Position of the "Disable" button relative to the frame. - activemods_deactivate_btn->setLabel(msg->get("<< Disable")); - activemods_deactivate_btn->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); - activemods_deactivate_btn->refresh(); - } - else if (infile.key == "inactivemods_activate") { - // @ATTR inactivemods_activate|point|Position of the "Enable" button relative to the frame. - inactivemods_activate_btn->setLabel(msg->get("Enable >>")); - inactivemods_activate_btn->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); - inactivemods_activate_btn->refresh(); - } - else { - return false; - } - - return true; -} - -bool GameStateConfigBase::parseStub(FileParser &infile) { - // not used for base configuration - // checking them here prevents getting an "invalid key" warning - if (infile.key == "renderer"); - else if (infile.key == "renderer_height"); - else if (infile.key == "fullscreen"); - else if (infile.key == "mouse_move"); - else if (infile.key == "hwsurface"); - else if (infile.key == "vsync"); - else if (infile.key == "texture_filter"); - else if (infile.key == "enable_joystick"); - else if (infile.key == "change_gamma"); - else if (infile.key == "mouse_aim"); - else if (infile.key == "no_mouse"); - else if (infile.key == "gamma"); - else if (infile.key == "joystick_deadzone"); - else if (infile.key == "resolution"); - else if (infile.key == "joystick_device"); - else if (infile.key == "joystick_device_height"); - else if (infile.key == "hws_note"); - else if (infile.key == "dbuf_note"); - else if (infile.key == "test_note"); - else if (infile.key == "handheld_note"); - else if (infile.key == "secondary_offset"); - else if (infile.key == "keybinds_bg_color"); - else if (infile.key == "keybinds_bg_alpha"); - else if (infile.key == "scrollpane"); - else if (infile.key == "scrollpane_contents"); - else if (infile.key == "cancel"); - else if (infile.key == "accept"); - else if (infile.key == "up"); - else if (infile.key == "down"); - else if (infile.key == "left"); - else if (infile.key == "right"); - else if (infile.key == "bar1"); - else if (infile.key == "bar2"); - else if (infile.key == "bar3"); - else if (infile.key == "bar4"); - else if (infile.key == "bar5"); - else if (infile.key == "bar6"); - else if (infile.key == "bar7"); - else if (infile.key == "bar8"); - else if (infile.key == "bar9"); - else if (infile.key == "bar0"); - else if (infile.key == "main1"); - else if (infile.key == "main2"); - else if (infile.key == "character"); - else if (infile.key == "inventory"); - else if (infile.key == "powers"); - else if (infile.key == "log"); - else if (infile.key == "ctrl"); - else if (infile.key == "shift"); - else if (infile.key == "alt"); - else if (infile.key == "delete"); - else if (infile.key == "actionbar"); - else if (infile.key == "actionbar_back"); - else if (infile.key == "actionbar_forward"); - else if (infile.key == "actionbar_use"); - else if (infile.key == "developer_menu"); - else return false; - - return true; -} - -void GameStateConfigBase::addChildWidgets() { - addChildWidget(music_volume_sl, AUDIO_TAB); - addChildWidget(music_volume_lb, AUDIO_TAB); - addChildWidget(sound_volume_sl, AUDIO_TAB); - addChildWidget(sound_volume_lb, AUDIO_TAB); - - addChildWidget(show_fps_cb, INTERFACE_TAB); - addChildWidget(show_fps_lb, INTERFACE_TAB); - addChildWidget(colorblind_cb, INTERFACE_TAB); - addChildWidget(colorblind_lb, INTERFACE_TAB); - addChildWidget(hardware_cursor_cb, INTERFACE_TAB); - addChildWidget(hardware_cursor_lb, INTERFACE_TAB); - addChildWidget(dev_mode_cb, INTERFACE_TAB); - addChildWidget(dev_mode_lb, INTERFACE_TAB); - addChildWidget(subtitles_cb, INTERFACE_TAB); - addChildWidget(subtitles_lb, INTERFACE_TAB); - addChildWidget(language_lstb, INTERFACE_TAB); - addChildWidget(language_lb, INTERFACE_TAB); - - addChildWidget(activemods_lstb, MODS_TAB); - addChildWidget(activemods_lb, MODS_TAB); - addChildWidget(inactivemods_lstb, MODS_TAB); - addChildWidget(inactivemods_lb, MODS_TAB); - addChildWidget(activemods_shiftup_btn, MODS_TAB); - addChildWidget(activemods_shiftdown_btn, MODS_TAB); - addChildWidget(activemods_deactivate_btn, MODS_TAB); - addChildWidget(inactivemods_activate_btn, MODS_TAB); -} - -void GameStateConfigBase::setupTabList() { - tablist.add(tab_control); - tablist.setPrevTabList(&tablist_main); - - tablist_main.add(ok_button); - tablist_main.add(defaults_button); - tablist_main.add(cancel_button); - tablist_main.setPrevTabList(&tablist); - tablist_main.setNextTabList(&tablist); - tablist_main.lock(); - - tablist_audio.add(music_volume_sl); - tablist_audio.add(sound_volume_sl); - tablist_audio.setPrevTabList(&tablist); - tablist_audio.setNextTabList(&tablist_main); - tablist_audio.lock(); - - tablist_interface.add(show_fps_cb); - tablist_interface.add(colorblind_cb); - tablist_interface.add(hardware_cursor_cb); - tablist_interface.add(dev_mode_cb); - tablist_interface.add(subtitles_cb); - tablist_interface.add(language_lstb); - tablist_interface.setPrevTabList(&tablist); - tablist_interface.setNextTabList(&tablist_main); - tablist_interface.lock(); - - tablist_mods.add(inactivemods_lstb); - tablist_mods.add(activemods_lstb); - tablist_mods.add(inactivemods_activate_btn); - tablist_mods.add(activemods_deactivate_btn); - tablist_mods.add(activemods_shiftup_btn); - tablist_mods.add(activemods_shiftdown_btn); - tablist_mods.setPrevTabList(&tablist); - tablist_mods.setNextTabList(&tablist_main); - tablist_mods.lock(); -} - -void GameStateConfigBase::update() { - updateAudio(); - updateInterface(); - updateMods(); -} - -void GameStateConfigBase::updateAudio() { - if (settings->audio) { - music_volume_sl->set(0, 128, settings->music_volume); - snd->setVolumeMusic(settings->music_volume); - sound_volume_sl->set(0, 128, settings->sound_volume); - snd->setVolumeSFX(settings->sound_volume); - } - else { - music_volume_sl->set(0,128,0); - sound_volume_sl->set(0,128,0); - } -} - -void GameStateConfigBase::updateInterface() { - show_fps_cb->setChecked(settings->show_fps); - colorblind_cb->setChecked(settings->colorblind); - hardware_cursor_cb->setChecked(settings->hardware_cursor); - dev_mode_cb->setChecked(settings->dev_mode); - subtitles_cb->setChecked(settings->subtitles); - - refreshLanguages(); -} - -void GameStateConfigBase::updateMods() { - activemods_lstb->refresh(); - inactivemods_lstb->refresh(); -} - -void GameStateConfigBase::logic() { - if (inpt->window_resized) - refreshWidgets(); - - if (defaults_confirm->visible) { - // reset defaults confirmation - logicDefaults(); - return; - } - else { - if (!logicMain()) - return; - } - - // tab contents - active_tab = tab_control->getActiveTab(); - - if (active_tab == AUDIO_TAB) { - tablist.setNextTabList(&tablist_audio); - logicAudio(); - } - else if (active_tab == INTERFACE_TAB) { - tablist.setNextTabList(&tablist_interface); - logicInterface(); - - if (platform.force_hardware_cursor) { - // for some platforms, hardware mouse cursor can not be turned off - settings->hardware_cursor = true; - hardware_cursor_cb->setChecked(settings->hardware_cursor); - } - } - else if (active_tab == MODS_TAB) { - tablist.setNextTabList(&tablist_mods); - logicMods(); - } -} - -bool GameStateConfigBase::logicMain() { - for (unsigned int i = 0; i < child_widget.size(); i++) { - if (child_widget[i]->in_focus) { - tab_control->setActiveTab(optiontab[i]); - break; - } - } - - // tabs & the bottom 3 main buttons - tab_control->logic(); - tablist.logic(); - tablist_main.logic(); - tablist_audio.logic(); - tablist_interface.logic(); - tablist_mods.logic(); - - // Ok/Cancel Buttons - if (ok_button->checkClick()) { - logicAccept(); - - // GameStateConfigBase deconstructed, proceed with caution - return false; - } - else if (defaults_button->checkClick()) { - defaults_confirm->visible = true; - return true; - } - else if (cancel_button->checkClick() || (inpt->pressing[Input::CANCEL] && !inpt->lock[Input::CANCEL])) { - logicCancel(); - - // GameStateConfigBase deconstructed, proceed with caution - return false; - } - - return true; -} - -void GameStateConfigBase::logicDefaults() { - defaults_confirm->logic(); - if (defaults_confirm->confirmClicked) { - settings->fullscreen = false; - settings->loadDefaults(); - eset->load(); - inpt->defaultQwertyKeyBindings(); - inpt->defaultJoystickBindings(); - update(); - render_device->windowResize(); - defaults_confirm->visible = false; - defaults_confirm->confirmClicked = false; - } -} - -void GameStateConfigBase::logicAccept() { - if (setMods()) { - snd->unloadMusic(); - reload_music = true; - reload_backgrounds = true; - delete mods; - mods = new ModManager(NULL); - settings->prev_save_slot = -1; - } - delete msg; - msg = new MessageEngine(); - inpt->saveKeyBindings(); - inpt->setKeybindNames(); - eset->load(); - Stats::init(); - refreshFont(); - if ((settings->enable_joystick) && (inpt->getNumJoysticks() > 0)) { - inpt->initJoystick(); - } - cleanup(); - - showLoading(); - // need to delete the "Loading..." message here, as we're recreating our render context - if (loading_tip) { - delete loading_tip; - loading_tip = NULL; - } - - delete tooltipm; - - // we can't replace the render device in-place, so soft-reset the game - if (new_render_device != settings->render_device_name) { - settings->render_device_name = new_render_device; - inpt->done = true; - settings->soft_reset = true; - } - - render_device->createContext(); - tooltipm = new TooltipManager(); - settings->saveSettings(); - setRequestedGameState(new GameStateTitle()); -} - -void GameStateConfigBase::logicCancel() { - inpt->lock[Input::CANCEL] = true; - settings->loadSettings(); - inpt->loadKeyBindings(); - delete msg; - msg = new MessageEngine(); - inpt->setKeybindNames(); - eset->load(); - Stats::init(); - refreshFont(); - update(); - cleanup(); - render_device->windowResize(); - render_device->updateTitleBar(); - showLoading(); - setRequestedGameState(new GameStateTitle()); -} - -void GameStateConfigBase::logicAudio() { - if (settings->audio) { - if (music_volume_sl->checkClick()) { - if (settings->music_volume == 0) - reload_music = true; - settings->music_volume = static_cast(music_volume_sl->getValue()); - snd->setVolumeMusic(settings->music_volume); - } - else if (sound_volume_sl->checkClick()) { - settings->sound_volume = static_cast(sound_volume_sl->getValue()); - snd->setVolumeSFX(settings->sound_volume); - } - } -} - -void GameStateConfigBase::logicInterface() { - if (language_lstb->checkClick()) { - int lang_id = language_lstb->getSelected(); - if (lang_id != -1) - settings->language = language_ISO[lang_id]; - } - else if (show_fps_cb->checkClick()) { - settings->show_fps = show_fps_cb->isChecked(); - } - else if (colorblind_cb->checkClick()) { - settings->colorblind = colorblind_cb->isChecked(); - } - else if (hardware_cursor_cb->checkClick()) { - settings->hardware_cursor = hardware_cursor_cb->isChecked(); - } - else if (dev_mode_cb->checkClick()) { - settings->dev_mode = dev_mode_cb->isChecked(); - } - else if (subtitles_cb->checkClick()) { - settings->subtitles = subtitles_cb->isChecked(); - } -} - -void GameStateConfigBase::logicMods() { - if (activemods_lstb->checkClick()) { - //do nothing - } - else if (inactivemods_lstb->checkClick()) { - //do nothing - } - else if (activemods_shiftup_btn->checkClick()) { - activemods_lstb->shiftUp(); - } - else if (activemods_shiftdown_btn->checkClick()) { - activemods_lstb->shiftDown(); - } - else if (activemods_deactivate_btn->checkClick()) { - disableMods(); - } - else if (inactivemods_activate_btn->checkClick()) { - enableMods(); - } -} - -void GameStateConfigBase::render() { - if (requestedGameState != NULL) { - // we're in the process of switching game states, so skip rendering - return; - } - - int tabheight = tab_control->getTabHeight(); - Rect pos; - pos.x = (settings->view_w - eset->resolutions.frame_w)/2; - pos.y = (settings->view_h - eset->resolutions.frame_h)/2 + tabheight - tabheight/16; - - if (background) { - background->setDestFromRect(pos); - render_device->render(background); - } - - tab_control->render(); - - // render OK/Defaults/Cancel buttons - ok_button->render(); - cancel_button->render(); - defaults_button->render(); - - renderTabContents(); - renderDialogs(); -} - -void GameStateConfigBase::renderTabContents() { - for (unsigned int i = 0; i < child_widget.size(); i++) { - if (optiontab[i] == active_tab) child_widget[i]->render(); - } - -} - -void GameStateConfigBase::renderDialogs() { - if (defaults_confirm->visible) - defaults_confirm->render(); -} - -void GameStateConfigBase::placeLabeledWidget(WidgetLabel *lb, Widget *w, int x1, int y1, int x2, int y2, std::string const& str, int justify) { - if (w) { - w->setBasePos(x2, y2, Utils::ALIGN_TOPLEFT); - } - - if (lb) { - lb->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); - lb->setText(str); - lb->setJustify(justify); - } -} - -void GameStateConfigBase::refreshWidgets() { - tab_control->setMainArea(((settings->view_w - eset->resolutions.frame_w)/2) + tab_offset.x, ((settings->view_h - eset->resolutions.frame_h)/2) + tab_offset.y); - - frame.x = ((settings->view_w - eset->resolutions.frame_w)/2) + frame_offset.x; - frame.y = ((settings->view_h - eset->resolutions.frame_h)/2) + tab_control->getTabHeight() + frame_offset.y; - - for (unsigned i=0; isetPos(frame.x, frame.y); - } - - ok_button->setPos(0, 0); - defaults_button->setPos(0, 0); - cancel_button->setPos(0, 0); - - defaults_confirm->align(); -} - -void GameStateConfigBase::addChildWidget(Widget *w, int tab) { - child_widget.push_back(w); - optiontab.push_back(tab); -} - -void GameStateConfigBase::refreshLanguages() { - language_ISO.clear(); - language_lstb->clear(); - - FileParser infile; - if (infile.open("engine/languages.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { - int i = 0; - while (infile.next()) { - std::string key = infile.key; - if (key != "") { - language_ISO.push_back(key); - language_lstb->append(infile.val, infile.val + " [" + infile.key + "]"); - - if (language_ISO.back() == settings->language) { - language_lstb->select(i); - } - - i++; - } - } - infile.close(); - } - - language_lstb->jumpToSelected(); -} - -void GameStateConfigBase::refreshFont() { - delete font; - font = getFontEngine(); - delete comb; - comb = new CombatText(); -} - -void GameStateConfigBase::enableMods() { - for (int i=0; igetSize(); i++) { - if (inactivemods_lstb->isSelected(i)) { - activemods_lstb->append(inactivemods_lstb->getValue(i),inactivemods_lstb->getTooltip(i)); - inactivemods_lstb->remove(i); - i--; - } - } -} - -void GameStateConfigBase::disableMods() { - for (int i=0; igetSize(); i++) { - if (activemods_lstb->isSelected(i) && activemods_lstb->getValue(i) != mods->FALLBACK_MOD) { - inactivemods_lstb->append(activemods_lstb->getValue(i),activemods_lstb->getTooltip(i)); - activemods_lstb->remove(i); - i--; - } - } - inactivemods_lstb->sort(); -} - -bool GameStateConfigBase::setMods() { - // Save new mods list and return true if modlist was changed. Else return false - - std::vector temp_list = mods->mod_list; - mods->mod_list.clear(); - mods->mod_list.push_back(mods->loadMod(mods->FALLBACK_MOD)); - - for (int i=0; igetSize(); i++) { - if (activemods_lstb->getValue(i) != "") - mods->mod_list.push_back(mods->loadMod(activemods_lstb->getValue(i))); - } - - mods->applyDepends(); - - if (mods->mod_list != temp_list) { - mods->saveMods(); - return true; - } - else { - return false; - } -} - -std::string GameStateConfigBase::createModTooltip(Mod *mod) { - std::string ret = ""; - if (mod) { - std::string mod_ver = (*mod->version == VersionInfo::MIN) ? "" : mod->version->getString(); - std::string engine_ver = VersionInfo::createVersionReqString(*mod->engine_min_version, *mod->engine_max_version); - - ret = mod->name + '\n'; - - std::string mod_description = mod->getLocaleDescription(settings->language); - if (!mod_description.empty()) { - ret += '\n'; - ret += mod_description + '\n'; - } - - bool middle_section = false; - if (!mod_ver.empty()) { - middle_section = true; - ret += '\n'; - ret += msg->get("Version:") + ' ' + mod_ver; - } - if (!mod->game.empty() && mod->game != mods->FALLBACK_GAME) { - middle_section = true; - ret += '\n'; - ret += msg->get("Game:") + ' ' + mod->game; - } - if (!engine_ver.empty()) { - middle_section = true; - ret += '\n'; - ret += msg->get("Engine version:") + ' ' + engine_ver; - } - - if (middle_section) - ret += '\n'; - - if (!mod->depends.empty()) { - ret += '\n'; - ret += msg->get("Requires mods:") + '\n'; - for (size_t i=0; idepends.size(); ++i) { - ret += "- " + mod->depends[i]; - std::string depend_ver = VersionInfo::createVersionReqString(*mod->depends_min[i], *mod->depends_max[i]); - if (depend_ver != "") - ret += " (" + depend_ver + ")"; - if (i < mod->depends.size()-1) - ret += '\n'; - } - } - - if (!ret.empty() && ret[ret.size() - 1] == '\n') - ret.erase(ret.begin() + ret.size() - 1); - } - return ret; -} - -void GameStateConfigBase::cleanup() { - if (background) { - delete background; - background = NULL; - } - - if (tab_control != NULL) { - delete tab_control; - tab_control = NULL; - } - - if (ok_button != NULL) { - delete ok_button; - ok_button = NULL; - } - if (defaults_button != NULL) { - delete defaults_button; - defaults_button = NULL; - } - if (cancel_button != NULL) { - delete cancel_button; - cancel_button = NULL; - } - - cleanupTabContents(); - cleanupDialogs(); - - language_ISO.clear(); -} - -void GameStateConfigBase::cleanupTabContents() { - for (std::vector::iterator iter = child_widget.begin(); iter != child_widget.end(); ++iter) { - if (*iter != NULL) { - delete (*iter); - *iter = NULL; - } - } - child_widget.clear(); -} - -void GameStateConfigBase::cleanupDialogs() { - if (defaults_confirm != NULL) { - delete defaults_confirm; - defaults_confirm = NULL; - } -} - diff --git a/src/GameStateConfigBase.h b/src/GameStateConfigBase.h deleted file mode 100644 index 24c979f..0000000 --- a/src/GameStateConfigBase.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -Copyright © 2012 Clint Bellanger -Copyright © 2012 davidriod -Copyright © 2012 Igor Paliychuk -Copyright © 2013 Kurt Rinnert -Copyright © 2014-2016 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -/** - * GameStateConfigBase - * - * Handle game Settings Menu - */ - -#ifndef GAMESTATECONFIGBASE_H -#define GAMESTATECONFIGBASE_H - -#include "CommonIncludes.h" -#include "GameState.h" -#include "TooltipData.h" -#include "Widget.h" - -class FileParser; -class MenuConfirm; -class Mod; -class Widget; -class WidgetButton; -class WidgetCheckBox; -class WidgetLabel; -class WidgetListBox; -class WidgetSlider; -class WidgetTabControl; - -class GameStateConfigBase : public GameState { -protected: - -public: - short AUDIO_TAB; - short INTERFACE_TAB; - short MODS_TAB; - - static const bool DO_INIT = true; - - explicit GameStateConfigBase(bool do_init); - ~GameStateConfigBase(); - - virtual void init(); - virtual void readConfig(); - bool parseKeyButtons(FileParser &infile); - bool parseKey(FileParser &infile, int &x1, int &y1, int &x2, int &y2); - bool parseStub(FileParser &infile); - void addChildWidgets(); - virtual void setupTabList(); - - virtual void update(); - void updateAudio(); - void updateInterface(); - void updateMods(); - - virtual void logic(); - virtual bool logicMain(); - void logicDefaults(); - virtual void logicAccept(); - void logicCancel(); - void logicAudio(); - void logicInterface(); - void logicMods(); - - void render(); - virtual void renderTabContents(); - virtual void renderDialogs(); - - void placeLabeledWidget(WidgetLabel* lb, Widget* w, int x1, int y1, int x2, int y2, std::string const& str, int justify = 0); - virtual void refreshWidgets(); - void addChildWidget(Widget *w, int tab); - void refreshLanguages(); - void refreshFont(); - - void enableMods(); - void disableMods(); - bool setMods(); - std::string createModTooltip(Mod *mod); - - void cleanup(); - virtual void cleanupTabContents(); - virtual void cleanupDialogs(); - - TabList tablist; - TabList tablist_main; - TabList tablist_audio; - TabList tablist_interface; - TabList tablist_mods; - - std::vector optiontab; - std::vector child_widget; - WidgetTabControl * tab_control; - WidgetButton * ok_button; - WidgetButton * defaults_button; - WidgetButton * cancel_button; - Sprite * background; - - WidgetCheckBox * show_fps_cb; - WidgetLabel * show_fps_lb; - WidgetCheckBox * hardware_cursor_cb; - WidgetLabel * hardware_cursor_lb; - WidgetCheckBox * colorblind_cb; - WidgetLabel * colorblind_lb; - WidgetCheckBox * dev_mode_cb; - WidgetLabel * dev_mode_lb; - WidgetCheckBox * subtitles_cb; - WidgetLabel * subtitles_lb; - WidgetSlider * music_volume_sl; - WidgetLabel * music_volume_lb; - WidgetSlider * sound_volume_sl; - WidgetLabel * sound_volume_lb; - WidgetListBox * activemods_lstb; - WidgetLabel * activemods_lb; - WidgetListBox * inactivemods_lstb; - WidgetLabel * inactivemods_lb; - WidgetListBox * language_lstb; - WidgetLabel * language_lb; - WidgetButton * activemods_shiftup_btn; - WidgetButton * activemods_shiftdown_btn; - WidgetButton * activemods_deactivate_btn; - WidgetButton * inactivemods_activate_btn; - - MenuConfirm * defaults_confirm; - - int active_tab; - - Point frame; - Point frame_offset; - Point tab_offset; - std::vector language_ISO; - - std::string new_render_device; -}; - -#endif - diff --git a/src/GameStateConfigDesktop.cpp b/src/GameStateConfigDesktop.cpp deleted file mode 100644 index ac88c2b..0000000 --- a/src/GameStateConfigDesktop.cpp +++ /dev/null @@ -1,976 +0,0 @@ -/* -Copyright © 2014-2016 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -/** - * GameStateConfigDesktop - * - * Handle game Settings Menu (desktop computer settings) - */ - -#include "CommonIncludes.h" -#include "DeviceList.h" -#include "FileParser.h" -#include "FontEngine.h" -#include "GameStateConfigBase.h" -#include "GameStateConfigDesktop.h" -#include "GameStateTitle.h" -#include "InputState.h" -#include "MenuConfirm.h" -#include "MessageEngine.h" -#include "RenderDevice.h" -#include "Settings.h" -#include "SharedResources.h" -#include "Stats.h" -#include "UtilsFileSystem.h" -#include "UtilsParsing.h" -#include "WidgetButton.h" -#include "WidgetCheckBox.h" -#include "WidgetListBox.h" -#include "WidgetScrollBox.h" -#include "WidgetSlider.h" -#include "WidgetTabControl.h" - -#include -#include - -GameStateConfigDesktop::GameStateConfigDesktop(bool _enable_video_tab) - : GameStateConfigBase(!GameStateConfigBase::DO_INIT) - , renderer_lstb(new WidgetListBox(4, WidgetListBox::DEFAULT_FILE)) - , renderer_lb(new WidgetLabel()) - , fullscreen_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , fullscreen_lb(new WidgetLabel()) - , hwsurface_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , hwsurface_lb(new WidgetLabel()) - , vsync_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , vsync_lb(new WidgetLabel()) - , texture_filter_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , texture_filter_lb(new WidgetLabel()) - , dpi_scaling_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , dpi_scaling_lb(new WidgetLabel()) - , parallax_layers_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , parallax_layers_lb(new WidgetLabel()) - , change_gamma_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , change_gamma_lb(new WidgetLabel()) - , gamma_sl(new WidgetSlider(WidgetSlider::DEFAULT_FILE)) - , gamma_lb(new WidgetLabel()) - , joystick_device_lstb(new WidgetListBox(10, WidgetListBox::DEFAULT_FILE)) - , joystick_device_lb(new WidgetLabel()) - , enable_joystick_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , enable_joystick_lb(new WidgetLabel()) - , mouse_move_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , mouse_move_lb(new WidgetLabel()) - , mouse_aim_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , mouse_aim_lb(new WidgetLabel()) - , no_mouse_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , no_mouse_lb(new WidgetLabel()) - , mouse_move_swap_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , mouse_move_swap_lb(new WidgetLabel()) - , mouse_move_attack_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) - , mouse_move_attack_lb(new WidgetLabel()) - , joystick_deadzone_sl(new WidgetSlider(WidgetSlider::DEFAULT_FILE)) - , joystick_deadzone_lb(new WidgetLabel()) - , input_scrollbox(NULL) - , input_confirm(new MenuConfirm(msg->get("Clear"),msg->get("Assign:"))) - , input_confirm_timer(settings->max_frames_per_sec * 10) // 10 seconds - , input_key(0) - , key_count(0) - , scrollpane_contents(0) - , enable_video_tab(_enable_video_tab) - , keybind_tip_timer(settings->max_frames_per_sec * 5) // 5 seconds - , keybind_tip(new WidgetTooltip()) -{ - // Allocate KeyBindings - for (int i = 0; i < inpt->KEY_COUNT; i++) { - keybinds_lb.push_back(new WidgetLabel()); - keybinds_lb[i]->setText(inpt->binding_name[i]); - keybinds_lb[i]->setJustify(FontEngine::JUSTIFY_RIGHT); - } - for (int i = 0; i < inpt->KEY_COUNT * 3; i++) { - keybinds_btn.push_back(new WidgetButton(WidgetButton::DEFAULT_FILE)); - } - - key_count = static_cast(keybinds_btn.size()/3); - - init(); -} - -GameStateConfigDesktop::~GameStateConfigDesktop() { -} - -void GameStateConfigDesktop::init() { - if (enable_video_tab) { - VIDEO_TAB = 0; - AUDIO_TAB = 1; - INTERFACE_TAB = 2; - INPUT_TAB = 3; - KEYBINDS_TAB = 4; - MODS_TAB = 5; - } - else { - AUDIO_TAB = 0; - INTERFACE_TAB = 1; - INPUT_TAB = 2; - KEYBINDS_TAB = 3; - MODS_TAB = 4; - } - - if (enable_video_tab) { - tab_control->setTabTitle(VIDEO_TAB, msg->get("Video")); - } - tab_control->setTabTitle(AUDIO_TAB, msg->get("Audio")); - tab_control->setTabTitle(INTERFACE_TAB, msg->get("Interface")); - tab_control->setTabTitle(INPUT_TAB, msg->get("Input")); - tab_control->setTabTitle(KEYBINDS_TAB, msg->get("Keybindings")); - tab_control->setTabTitle(MODS_TAB, msg->get("Mods")); - - readConfig(); - - // Allocate KeyBindings ScrollBox - input_scrollbox = new WidgetScrollBox(scrollpane.w, scrollpane.h); - input_scrollbox->setBasePos(scrollpane.x, scrollpane.y, Utils::ALIGN_TOPLEFT); - input_scrollbox->bg = scrollpane_color; - input_scrollbox->resize(scrollpane.w, scrollpane_contents); - - // Set positions of secondary key bindings - for (unsigned int i = key_count; i < key_count*2; i++) { - keybinds_btn[i]->pos.x = keybinds_btn[i-key_count]->pos.x + secondary_offset.x; - keybinds_btn[i]->pos.y = keybinds_btn[i-key_count]->pos.y + secondary_offset.y; - } - - // Set positions of joystick bindings - for (unsigned int i = key_count*2; i < keybinds_btn.size(); i++) { - keybinds_btn[i]->pos.x = keybinds_btn[i-(key_count*2)]->pos.x + (secondary_offset.x*2); - keybinds_btn[i]->pos.y = keybinds_btn[i-(key_count*2)]->pos.y + (secondary_offset.y*2); - } - - addChildWidgets(); - addChildWidgetsDesktop(); - setupTabList(); - - refreshWidgets(); - - update(); -} - -void GameStateConfigDesktop::readConfig() { - FileParser infile; - if (infile.open("menus/config.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { - while (infile.next()) { - if (parseKeyButtons(infile)) - continue; - - int x1 = Parse::popFirstInt(infile.val); - int y1 = Parse::popFirstInt(infile.val); - int x2 = Parse::popFirstInt(infile.val); - int y2 = Parse::popFirstInt(infile.val); - - if (parseKeyDesktop(infile, x1, y1, x2, y2)) - continue; - else if (parseKey(infile, x1, y1, x2, y2)) - continue; - else { - infile.error("GameStateConfigDesktop: '%s' is not a valid key.", infile.key.c_str()); - } - } - infile.close(); - } - - hwsurface_cb->tooltip = msg->get("Will try to store surfaces in video memory versus system memory. The effect this has on performance depends on the renderer."); - vsync_cb->tooltip = msg->get("Prevents screen tearing. Disable if you experience \"stuttering\" in windowed mode or input lag."); - dpi_scaling_cb->tooltip = msg->get("When enabled, this uses the screen DPI in addition to the window dimensions to scale the rendering resolution. Otherwise, only the window dimensions are used."); - parallax_layers_cb->tooltip = msg->get("This enables parallax (non-tile) layers. Disabling this setting can improve performance in some cases."); - change_gamma_cb->tooltip = msg->get("Experimental"); - no_mouse_cb->tooltip = msg->get("For handheld devices"); - mouse_move_swap_cb->tooltip = msg->get("When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero instead of 'Main1'."); - mouse_move_attack_cb->tooltip = msg->get("When 'Move hero using mouse' is enabled, this setting controls if the Power assigned to the movement button can be used by targeting an enemy. If this setting is disabled, it is required to use 'Shift' to access the Power assigned to the movement button."); -} - -bool GameStateConfigDesktop::parseKeyDesktop(FileParser &infile, int &x1, int &y1, int &x2, int &y2) { - // @CLASS GameStateConfigDesktop|Description of menus/config.txt - - int keybind_num = -1; - - if (infile.key == "listbox_scrollbar_offset") { - // overrides same key in GameStateConfigBase - renderer_lstb->scrollbar_offset = x1; - joystick_device_lstb->scrollbar_offset = x1; - activemods_lstb->scrollbar_offset = x1; - inactivemods_lstb->scrollbar_offset = x1; - language_lstb->scrollbar_offset = x1; - } - else if (infile.key == "renderer") { - // @ATTR renderer|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Renderer" list box relative to the frame. - placeLabeledWidget(renderer_lb, renderer_lstb, x1, y1, x2, y2, msg->get("Renderer")); - - renderer_lstb->can_select = true; - renderer_lstb->multi_select = false; - renderer_lstb->can_deselect = false; - - refreshRenderers(); - - renderer_lb->setJustify(FontEngine::JUSTIFY_CENTER); - } - else if (infile.key == "renderer_height") { - // @ATTR renderer_height|int|Number of visible rows for the "Renderer" list box. - renderer_lstb->setHeight(x1); - } - else if (infile.key == "fullscreen") { - // @ATTR fullscreen|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Full Screen Mode" checkbox relative to the frame. - placeLabeledWidget(fullscreen_lb, fullscreen_cb, x1, y1, x2, y2, msg->get("Full Screen Mode"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "mouse_move") { - // @ATTR mouse_move|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Move hero using mouse" checkbox relative to the frame. - placeLabeledWidget(mouse_move_lb, mouse_move_cb, x1, y1, x2, y2, msg->get("Move hero using mouse"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "hwsurface") { - // @ATTR hwsurface|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Hardware surfaces" checkbox relative to the frame. - placeLabeledWidget(hwsurface_lb, hwsurface_cb, x1, y1, x2, y2, msg->get("Hardware surfaces"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "vsync") { - // @ATTR vsync|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "V-Sync" checkbox relative to the frame. - placeLabeledWidget(vsync_lb, vsync_cb, x1, y1, x2, y2, msg->get("V-Sync"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "texture_filter") { - // @ATTR texture_filter|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Texture Filtering" checkbox relative to the frame. - placeLabeledWidget(texture_filter_lb, texture_filter_cb, x1, y1, x2, y2, msg->get("Texture Filtering"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "dpi_scaling") { - // @ATTR dpi_scaling|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "DPI scaling" checkbox relative to the frame. - placeLabeledWidget(dpi_scaling_lb, dpi_scaling_cb, x1, y1, x2, y2, msg->get("DPI scaling"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "parallax_layers") { - // @ATTR parallax_layers|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Parallax Layers" checkbox relative to the frame. - placeLabeledWidget(parallax_layers_lb, parallax_layers_cb, x1, y1, x2, y2, msg->get("Parallax Layers"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "change_gamma") { - // @ATTR change_gamma|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Allow changing gamma" checkbox relative to the frame. - placeLabeledWidget(change_gamma_lb, change_gamma_cb, x1, y1, x2, y2, msg->get("Allow changing gamma"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "gamma") { - // @ATTR gamma|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Gamma" slider relative to the frame. - placeLabeledWidget(gamma_lb, gamma_sl, x1, y1, x2, y2, msg->get("Gamma"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "enable_joystick") { - // @ATTR enable_joystick|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Use joystick" checkbox relative to the frame. - placeLabeledWidget(enable_joystick_lb, enable_joystick_cb, x1, y1, x2, y2, msg->get("Use joystick"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "joystick_device") { - // @ATTR joystick_device|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Joystick" list box relative to the frame. - placeLabeledWidget(joystick_device_lb, joystick_device_lstb, x1, y1, x2, y2, msg->get("Joystick")); - - for(int i = 0; i < inpt->getNumJoysticks(); i++) { - std::string joystick_name = inpt->getJoystickName(i); - if (joystick_name != "") - joystick_device_lstb->append(joystick_name, joystick_name); - } - - joystick_device_lb->setJustify(FontEngine::JUSTIFY_CENTER); - } - else if (infile.key == "joystick_device_height") { - // @ATTR joystick_device_height|int|Number of visible rows for the "Joystick" list box. - joystick_device_lstb->setHeight(x1); - } - else if (infile.key == "mouse_aim") { - // @ATTR mouse_aim|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Mouse aim" checkbox relative to the frame. - placeLabeledWidget(mouse_aim_lb, mouse_aim_cb, x1, y1, x2, y2, msg->get("Mouse aim"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "no_mouse") { - // @ATTR no_mouse|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Do not use mouse" checkbox relative to the frame. - placeLabeledWidget(no_mouse_lb, no_mouse_cb, x1, y1, x2, y2, msg->get("Do not use mouse"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "mouse_move_swap") { - // @ATTR mouse_move_swap|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Swap mouse movement button" checkbox relative to the frame. - placeLabeledWidget(mouse_move_swap_lb, mouse_move_swap_cb, x1, y1, x2, y2, msg->get("Swap mouse movement button"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "mouse_move_attack") { - // @ATTR mouse_move_attack|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Attack with mouse movement" checkbox relative to the frame. - placeLabeledWidget(mouse_move_attack_lb, mouse_move_attack_cb, x1, y1, x2, y2, msg->get("Attack with mouse movement"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "joystick_deadzone") { - // @ATTR joystick_deadzone|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Joystick Deadzone" slider relative to the frame. - placeLabeledWidget(joystick_deadzone_lb, joystick_deadzone_sl, x1, y1, x2, y2, msg->get("Joystick Deadzone"), FontEngine::JUSTIFY_RIGHT); - } - else if (infile.key == "secondary_offset") { - // @ATTR secondary_offset|point|Offset of the second (and third) columns of keybinds. - secondary_offset.x = x1; - secondary_offset.y = y1; - } - else if (infile.key == "keybinds_bg_color") { - // @ATTR keybinds_bg_color|color|Background color for the keybindings scrollbox. - scrollpane_color.r = static_cast(x1); - scrollpane_color.g = static_cast(y1); - scrollpane_color.b = static_cast(x2); - } - else if (infile.key == "keybinds_bg_alpha") { - // @ATTR keybinds_bg_alpha|int|Alpha value for the keybindings scrollbox background color. - scrollpane_color.a = static_cast(x1); - } - else if (infile.key == "scrollpane") { - // @ATTR scrollpane|rectangle|Position of the keybinding scrollbox relative to the frame. - scrollpane.x = x1; - scrollpane.y = y1; - scrollpane.w = x2; - scrollpane.h = y2; - } - else if (infile.key == "scrollpane_contents") { - // @ATTR scrollpane_contents|int|The vertical size of the keybinding scrollbox's contents. - scrollpane_contents = x1; - } - - // @ATTR cancel|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Cancel" keybind relative to the keybinding scrollbox. - else if (infile.key == "cancel") keybind_num = Input::CANCEL; - // @ATTR accept|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Accept" keybind relative to the keybinding scrollbox. - else if (infile.key == "accept") keybind_num = Input::ACCEPT; - // @ATTR up|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Up" keybind relative to the keybinding scrollbox. - else if (infile.key == "up") keybind_num = Input::UP; - // @ATTR down|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Down" keybind relative to the keybinding scrollbox. - else if (infile.key == "down") keybind_num = Input::DOWN; - // @ATTR left|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Left" keybind relative to the keybinding scrollbox. - else if (infile.key == "left") keybind_num = Input::LEFT; - // @ATTR right|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Right" keybind relative to the keybinding scrollbox. - else if (infile.key == "right") keybind_num = Input::RIGHT; - // @ATTR bar1|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar1" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar1") keybind_num = Input::BAR_1; - // @ATTR bar2|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar2" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar2") keybind_num = Input::BAR_2; - // @ATTR bar3|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar3" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar3") keybind_num = Input::BAR_3; - // @ATTR bar4|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar4" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar4") keybind_num = Input::BAR_4; - // @ATTR bar5|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar5" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar5") keybind_num = Input::BAR_5; - // @ATTR bar6|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar6" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar6") keybind_num = Input::BAR_6; - // @ATTR bar7|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar7" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar7") keybind_num = Input::BAR_7; - // @ATTR Bar8|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar8" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar8") keybind_num = Input::BAR_8; - // @ATTR bar9|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar9" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar9") keybind_num = Input::BAR_9; - // @ATTR bar0|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Bar0" keybind relative to the keybinding scrollbox. - else if (infile.key == "bar0") keybind_num = Input::BAR_0; - // @ATTR main1|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Main1" keybind relative to the keybinding scrollbox. - else if (infile.key == "main1") keybind_num = Input::MAIN1; - // @ATTR main2|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Main2" keybind relative to the keybinding scrollbox. - else if (infile.key == "main2") keybind_num = Input::MAIN2; - // @ATTR character|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Character" keybind relative to the keybinding scrollbox. - else if (infile.key == "character") keybind_num = Input::CHARACTER; - // @ATTR inventory|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Inventory" keybind relative to the keybinding scrollbox. - else if (infile.key == "inventory") keybind_num = Input::INVENTORY; - // @ATTR powers|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Powers" keybind relative to the keybinding scrollbox. - else if (infile.key == "powers") keybind_num = Input::POWERS; - // @ATTR log|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Log" keybind relative to the keybinding scrollbox. - else if (infile.key == "log") keybind_num = Input::LOG; - // @ATTR ctrl|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Ctrl" keybind relative to the keybinding scrollbox. - else if (infile.key == "ctrl") keybind_num = Input::CTRL; - // @ATTR shift|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Shift" keybind relative to the keybinding scrollbox. - else if (infile.key == "shift") keybind_num = Input::SHIFT; - // @ATTR alt|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Alt" keybind relative to the keybinding scrollbox. - else if (infile.key == "alt") keybind_num = Input::ALT; - // @ATTR delete|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Delete" keybind relative to the keybinding scrollbox. - else if (infile.key == "delete") keybind_num = Input::DEL; - // @ATTR actionbar|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "ActionBar Accept" keybind relative to the keybinding scrollbox. - else if (infile.key == "actionbar") keybind_num = Input::ACTIONBAR; - // @ATTR actionbar_back|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "ActionBar Left" keybind relative to the keybinding scrollbox. - else if (infile.key == "actionbar_back") keybind_num = Input::ACTIONBAR_BACK; - // @ATTR actionbar_forward|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "ActionBar Right" keybind relative to the keybinding scrollbox. - else if (infile.key == "actionbar_forward") keybind_num = Input::ACTIONBAR_FORWARD; - // @ATTR actionbar_use|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "ActionBar Use" keybind relative to the keybinding scrollbox. - else if (infile.key == "actionbar_use") keybind_num = Input::ACTIONBAR_USE; - // @ATTR developer_menu|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Developer Menu" keybind relative to the keybinding scrollbox. - else if (infile.key == "developer_menu") keybind_num = Input::DEVELOPER_MENU; - - else return false; - - if (keybind_num > -1 && static_cast(keybind_num) < keybinds_lb.size() && static_cast(keybind_num) < keybinds_btn.size()) { - //keybindings - keybinds_lb[keybind_num]->setPos(x1, y1); - keybinds_btn[keybind_num]->pos.x = x2; - keybinds_btn[keybind_num]->pos.y = y2; - } - - return true; -} - -void GameStateConfigDesktop::addChildWidgetsDesktop() { - if (enable_video_tab) { - addChildWidget(renderer_lstb, VIDEO_TAB); - addChildWidget(renderer_lb, VIDEO_TAB); - addChildWidget(fullscreen_cb, VIDEO_TAB); - addChildWidget(fullscreen_lb, VIDEO_TAB); - addChildWidget(hwsurface_cb, VIDEO_TAB); - addChildWidget(hwsurface_lb, VIDEO_TAB); - addChildWidget(vsync_cb, VIDEO_TAB); - addChildWidget(vsync_lb, VIDEO_TAB); - addChildWidget(texture_filter_cb, VIDEO_TAB); - addChildWidget(texture_filter_lb, VIDEO_TAB); - addChildWidget(dpi_scaling_cb, VIDEO_TAB); - addChildWidget(dpi_scaling_lb, VIDEO_TAB); - addChildWidget(parallax_layers_cb, VIDEO_TAB); - addChildWidget(parallax_layers_lb, VIDEO_TAB); - addChildWidget(change_gamma_cb, VIDEO_TAB); - addChildWidget(change_gamma_lb, VIDEO_TAB); - addChildWidget(gamma_sl, VIDEO_TAB); - addChildWidget(gamma_lb, VIDEO_TAB); - } - - addChildWidget(mouse_move_cb, INPUT_TAB); - addChildWidget(mouse_move_lb, INPUT_TAB); - addChildWidget(enable_joystick_cb, INPUT_TAB); - addChildWidget(enable_joystick_lb, INPUT_TAB); - addChildWidget(mouse_aim_cb, INPUT_TAB); - addChildWidget(mouse_aim_lb, INPUT_TAB); - addChildWidget(no_mouse_cb, INPUT_TAB); - addChildWidget(no_mouse_lb, INPUT_TAB); - addChildWidget(mouse_move_swap_cb, INPUT_TAB); - addChildWidget(mouse_move_swap_lb, INPUT_TAB); - addChildWidget(mouse_move_attack_cb, INPUT_TAB); - addChildWidget(mouse_move_attack_lb, INPUT_TAB); - addChildWidget(joystick_deadzone_sl, INPUT_TAB); - addChildWidget(joystick_deadzone_lb, INPUT_TAB); - addChildWidget(joystick_device_lstb, INPUT_TAB); - addChildWidget(joystick_device_lb, INPUT_TAB); - - for (unsigned int i = 0; i < keybinds_btn.size(); i++) { - input_scrollbox->addChildWidget(keybinds_btn[i]); - } -} - -void GameStateConfigDesktop::setupTabList() { - tablist.add(tab_control); - tablist.setPrevTabList(&tablist_main); - - tablist_main.add(ok_button); - tablist_main.add(defaults_button); - tablist_main.add(cancel_button); - tablist_main.setPrevTabList(&tablist); - tablist_main.setNextTabList(&tablist); - tablist_main.lock(); - - if (enable_video_tab) { - tablist_video.add(fullscreen_cb); - tablist_video.add(hwsurface_cb); - tablist_video.add(vsync_cb); - tablist_video.add(texture_filter_cb); - tablist_video.add(dpi_scaling_cb); - tablist_video.add(parallax_layers_cb); - tablist_video.add(change_gamma_cb); - tablist_video.add(gamma_sl); - tablist_video.add(renderer_lstb); - tablist_video.setPrevTabList(&tablist); - tablist_video.setNextTabList(&tablist_main); - tablist_video.lock(); - } - - tablist_audio.add(music_volume_sl); - tablist_audio.add(sound_volume_sl); - tablist_audio.setPrevTabList(&tablist); - tablist_audio.setNextTabList(&tablist_main); - tablist_audio.lock(); - - tablist_interface.add(show_fps_cb); - tablist_interface.add(colorblind_cb); - tablist_interface.add(hardware_cursor_cb); - tablist_interface.add(dev_mode_cb); - tablist_interface.add(language_lstb); - tablist_interface.setPrevTabList(&tablist); - tablist_interface.setNextTabList(&tablist_main); - tablist_interface.lock(); - - tablist_input.add(enable_joystick_cb); - tablist_input.add(mouse_move_cb); - tablist_input.add(mouse_aim_cb); - tablist_input.add(no_mouse_cb); - tablist_input.add(mouse_move_swap_cb); - tablist_input.add(mouse_move_attack_cb); - tablist_input.add(joystick_deadzone_sl); - tablist_input.add(joystick_device_lstb); - tablist_input.setPrevTabList(&tablist); - tablist_input.setNextTabList(&tablist_main); - tablist_input.lock(); - - tablist_keybinds.add(input_scrollbox); - tablist_keybinds.setPrevTabList(&tablist); - tablist_keybinds.setNextTabList(&tablist_main); - tablist_keybinds.lock(); - - tablist_mods.add(inactivemods_lstb); - tablist_mods.add(activemods_lstb); - tablist_mods.add(inactivemods_activate_btn); - tablist_mods.add(activemods_deactivate_btn); - tablist_mods.add(activemods_shiftup_btn); - tablist_mods.add(activemods_shiftdown_btn); - tablist_mods.setPrevTabList(&tablist); - tablist_mods.setNextTabList(&tablist_main); - tablist_mods.lock(); -} - -void GameStateConfigDesktop::update() { - GameStateConfigBase::update(); - - updateVideo(); - updateInput(); - updateKeybinds(); -} - -void GameStateConfigDesktop::updateVideo() { - fullscreen_cb->setChecked(settings->fullscreen); - hwsurface_cb->setChecked(settings->hwsurface); - vsync_cb->setChecked(settings->vsync); - texture_filter_cb->setChecked(settings->texture_filter); - dpi_scaling_cb->setChecked(settings->dpi_scaling); - parallax_layers_cb->setChecked(settings->parallax_layers); - change_gamma_cb->setChecked(settings->change_gamma); - - if (settings->change_gamma) { - render_device->setGamma(settings->gamma); - } - else { - settings->gamma = 1.0; - gamma_sl->enabled = false; - render_device->resetGamma(); - } - gamma_sl->set(GAMMA_MIN, GAMMA_MAX, static_cast(settings->gamma * 10.0)); - - refreshRenderers(); -} - -void GameStateConfigDesktop::updateInput() { - enable_joystick_cb->setChecked(settings->enable_joystick); - mouse_aim_cb->setChecked(settings->mouse_aim); - no_mouse_cb->setChecked(settings->no_mouse); - mouse_move_cb->setChecked(settings->mouse_move); - mouse_move_swap_cb->setChecked(settings->mouse_move_swap); - mouse_move_attack_cb->setChecked(settings->mouse_move_attack); - - if (settings->enable_joystick && inpt->getNumJoysticks() > 0) { - inpt->initJoystick(); - joystick_device_lstb->select(settings->joystick_device); - } - joystick_device_lstb->jumpToSelected(); - - joystick_deadzone_sl->set(0, 32768, settings->joy_deadzone); -} - -void GameStateConfigDesktop::updateKeybinds() { - // now do labels for keybinds that are set - for (unsigned int i = 0; i < key_count; i++) { - keybinds_btn[i]->setLabel(inpt->getBindingString(i)); - keybinds_btn[i]->refresh(); - } - for (unsigned int i = key_count; i < key_count*2; i++) { - keybinds_btn[i]->setLabel(inpt->getBindingString(i-key_count, InputState::BINDING_ALT)); - keybinds_btn[i]->refresh(); - } - for (unsigned int i = key_count*2; i < keybinds_btn.size(); i++) { - keybinds_btn[i]->setLabel(inpt->getBindingString(i-(key_count*2), InputState::BINDING_JOYSTICK)); - keybinds_btn[i]->refresh(); - } - input_scrollbox->refresh(); -} - -void GameStateConfigDesktop::logic() { - if (inpt->window_resized) - refreshWidgets(); - - if (defaults_confirm->visible) { - // reset defaults confirmation - logicDefaults(); - return; - } - else if (input_confirm->visible) { - // assign a keybind - input_confirm->logic(); - scanKey(input_key); - input_confirm_timer.tick(); - if (input_confirm_timer.isEnd()) - input_confirm->visible = false; - return; - } - else { - if (!logicMain()) - return; - } - - // tab contents - active_tab = tab_control->getActiveTab(); - - if (enable_video_tab && active_tab == VIDEO_TAB) { - tablist.setNextTabList(&tablist_video); - logicVideo(); - } - else if (active_tab == AUDIO_TAB) { - tablist.setNextTabList(&tablist_audio); - logicAudio(); - } - else if (active_tab == INTERFACE_TAB) { - tablist.setNextTabList(&tablist_interface); - logicInterface(); - } - else if (active_tab == INPUT_TAB) { - tablist.setNextTabList(&tablist_input); - logicInput(); - } - else if (active_tab == KEYBINDS_TAB) { - tablist.setNextTabList(&tablist_keybinds); - logicKeybinds(); - } - else if (active_tab == MODS_TAB) { - tablist.setNextTabList(&tablist_mods); - logicMods(); - } -} - -bool GameStateConfigDesktop::logicMain() { - if (GameStateConfigBase::logicMain()) { - if (enable_video_tab) { - tablist_video.logic(); - } - tablist_input.logic(); - tablist_keybinds.logic(); - return true; - } - - return false; -} - -void GameStateConfigDesktop::logicVideo() { - if (fullscreen_cb->checkClick()) { - settings->fullscreen = fullscreen_cb->isChecked(); - } - else if (hwsurface_cb->checkClick()) { - settings->hwsurface = hwsurface_cb->isChecked(); - } - else if (vsync_cb->checkClick()) { - settings->vsync = vsync_cb->isChecked(); - } - else if (texture_filter_cb->checkClick()) { - settings->texture_filter = texture_filter_cb->isChecked(); - } - else if (dpi_scaling_cb->checkClick()) { - settings->dpi_scaling = dpi_scaling_cb->isChecked(); - render_device->windowResize(); - refreshWidgets(); - force_refresh_background = true; - } - else if (parallax_layers_cb->checkClick()) { - settings->parallax_layers = parallax_layers_cb->isChecked(); - } - else if (change_gamma_cb->checkClick()) { - settings->change_gamma = change_gamma_cb->isChecked(); - if (settings->change_gamma) { - gamma_sl->enabled = true; - } - else { - settings->gamma = 1.0; - gamma_sl->enabled = false; - gamma_sl->set(GAMMA_MIN, GAMMA_MAX, static_cast(settings->gamma * 10.0)); - render_device->resetGamma(); - } - } - else if (gamma_sl->checkClick()) { - settings->gamma = static_cast(gamma_sl->getValue()) * 0.1f; - render_device->setGamma(settings->gamma); - } - else if (renderer_lstb->checkClick()) { - new_render_device = renderer_lstb->getValue(); - } -} - -void GameStateConfigDesktop::logicInput() { - if (inpt->joysticks_changed) { - disableJoystickOptions(); - joystick_device_lstb->clear(); - for(int i = 0; i < inpt->getNumJoysticks(); i++) { - std::string joystick_name = inpt->getJoystickName(i); - if (joystick_name != "") - joystick_device_lstb->append(joystick_name, joystick_name); - } - inpt->joysticks_changed = false; - } - - if (mouse_move_cb->checkClick()) { - if (mouse_move_cb->isChecked()) { - settings->mouse_move = true; - enableMouseOptions(); - } - else settings->mouse_move=false; - } - else if (mouse_aim_cb->checkClick()) { - if (mouse_aim_cb->isChecked()) { - settings->mouse_aim = true; - enableMouseOptions(); - } - else settings->mouse_aim=false; - } - else if (no_mouse_cb->checkClick()) { - if (no_mouse_cb->isChecked()) { - settings->no_mouse = true; - disableMouseOptions(); - } - else settings->no_mouse = false; - } - else if (mouse_move_swap_cb->checkClick()) { - settings->mouse_move_swap = mouse_move_swap_cb->isChecked(); - } - else if (mouse_move_attack_cb->checkClick()) { - settings->mouse_move_attack = mouse_move_attack_cb->isChecked(); - } - else if (enable_joystick_cb->checkClick()) { - if (enable_joystick_cb->isChecked()) { - settings->enable_joystick = true; - if (inpt->getNumJoysticks() > 0) { - settings->joystick_device = 0; - inpt->initJoystick(); - joystick_device_lstb->select(settings->joystick_device); - } - - if (inpt->getNumJoysticks() > 0) - joystick_device_lstb->jumpToSelected(); - } - else { - disableJoystickOptions(); - } - } - else if (joystick_deadzone_sl->checkClick()) { - settings->joy_deadzone = joystick_deadzone_sl->getValue(); - } - else if (joystick_device_lstb->checkClick()) { - settings->joystick_device = joystick_device_lstb->getSelected(); - if (settings->joystick_device != -1) { - settings->enable_joystick = true; - if (inpt->getNumJoysticks() > 0) { - inpt->initJoystick(); - } - } - else { - settings->enable_joystick = false; - } - enable_joystick_cb->setChecked(settings->enable_joystick); - } -} - -void GameStateConfigDesktop::logicKeybinds() { - input_scrollbox->logic(); - for (unsigned int i = 0; i < keybinds_btn.size(); i++) { - if (i >= static_cast(inpt->KEY_COUNT * 2)) { - keybinds_btn[i]->enabled = settings->enable_joystick; - keybinds_btn[i]->refresh(); - } - Point mouse = input_scrollbox->input_assist(inpt->mouse); - if (keybinds_btn[i]->checkClickAt(mouse.x,mouse.y)) { - std::string confirm_msg; - confirm_msg = msg->get("Assign:") + ' ' + inpt->binding_name[i%key_count]; - delete input_confirm; - input_confirm = new MenuConfirm(msg->get("Clear"),confirm_msg); - input_confirm_timer.reset(Timer::BEGIN); - input_confirm->visible = true; - input_key = i; - inpt->last_button = -1; - inpt->last_key = -1; - inpt->last_joybutton = -1; - } - } -} - -void GameStateConfigDesktop::renderTabContents() { - if (active_tab == KEYBINDS_TAB) { - if (input_scrollbox->update) { - input_scrollbox->refresh(); - } - input_scrollbox->render(); - for (unsigned int i = 0; i < keybinds_lb.size(); i++) { - keybinds_lb[i]->local_frame = input_scrollbox->pos; - keybinds_lb[i]->local_offset.y = input_scrollbox->getCursor(); - keybinds_lb[i]->render(); - } - } - - for (unsigned int i = 0; i < child_widget.size(); i++) { - if (optiontab[i] == active_tab) child_widget[i]->render(); - } -} - -void GameStateConfigDesktop::renderDialogs() { - GameStateConfigBase::renderDialogs(); - - if (input_confirm->visible) - input_confirm->render(); - - if (active_tab == KEYBINDS_TAB && !keybind_msg.empty()) { - TooltipData keybind_tip_data; - keybind_tip_data.addText(keybind_msg); - - if (keybind_tip_timer.isEnd()) - keybind_tip_timer.reset(Timer::BEGIN); - - keybind_tip_timer.tick(); - - if (!keybind_tip_timer.isEnd()) { - keybind_tip->render(keybind_tip_data, Point(settings->view_w, 0), TooltipData::STYLE_FLOAT); - } - else { - keybind_msg.clear(); - } - } - else { - keybind_msg.clear(); - keybind_tip_timer.reset(Timer::END); - } -} - -void GameStateConfigDesktop::refreshWidgets() { - GameStateConfigBase::refreshWidgets(); - - input_scrollbox->setPos(frame.x, frame.y); - - input_confirm->align(); -} - -void GameStateConfigDesktop::confirmKey(int button) { - inpt->pressing[button] = false; - inpt->lock[button] = false; - - input_confirm->visible = false; - input_confirm_timer.reset(Timer::END); - keybind_tip_timer.reset(Timer::END); - - updateKeybinds(); -} - -void GameStateConfigDesktop::scanKey(int button) { - int column = button / key_count; - int real_button = button % key_count; - - // clear the keybind if the user clicks "Clear" in the dialog - if (input_confirm->visible && input_confirm->confirmClicked) { - inpt->setKeybind(-1, real_button, column, keybind_msg); - confirmKey(real_button); - return; - } - - if (input_confirm->visible && !input_confirm->isWithinButtons) { - // keyboard & mouse - if (column == InputState::BINDING_DEFAULT || column == InputState::BINDING_ALT) { - if (inpt->last_button != -1) { - // mouse - inpt->setKeybind(inpt->last_button, real_button, column, keybind_msg); - confirmKey(real_button); - } - else if (inpt->last_key != -1) { - // keyboard - inpt->setKeybind(inpt->last_key, real_button, column, keybind_msg); - confirmKey(real_button); - } - } - // joystick - else if (column == InputState::BINDING_JOYSTICK && inpt->last_joybutton != -1) { - inpt->setKeybind(inpt->last_joybutton, real_button, column, keybind_msg); - confirmKey(real_button); - } - else if (column == InputState::BINDING_JOYSTICK && inpt->last_joyaxis != -1) { - inpt->setKeybind(inpt->last_joyaxis, real_button, column, keybind_msg); - confirmKey(real_button); - } - } -} - -void GameStateConfigDesktop::cleanupTabContents() { - for (std::vector::iterator iter = child_widget.begin(); iter != child_widget.end(); ++iter) { - if (*iter != NULL) { - delete (*iter); - *iter = NULL; - } - } - child_widget.clear(); - - for (unsigned int i = 0; i < keybinds_lb.size(); i++) { - if (keybinds_lb[i] != NULL) { - delete keybinds_lb[i]; - keybinds_lb[i] = NULL; - } - } - for (unsigned int i = 0; i < keybinds_btn.size(); i++) { - if (keybinds_btn[i] != NULL) { - delete keybinds_btn[i]; - keybinds_btn[i] = NULL; - } - } - - if (input_scrollbox != NULL) { - delete input_scrollbox; - input_scrollbox = NULL; - } -} - -void GameStateConfigDesktop::cleanupDialogs() { - if (defaults_confirm != NULL) { - delete defaults_confirm; - defaults_confirm = NULL; - } - if (input_confirm != NULL) { - delete input_confirm; - input_confirm = NULL; - } - if (keybind_tip != NULL) { - delete keybind_tip; - keybind_tip = NULL; - } -} - -void GameStateConfigDesktop::enableMouseOptions() { - settings->no_mouse = false; - no_mouse_cb->setChecked(settings->no_mouse); -} - -void GameStateConfigDesktop::disableMouseOptions() { - settings->mouse_aim = false; - mouse_aim_cb->setChecked(settings->mouse_aim); - - settings->mouse_move = false; - mouse_move_cb->setChecked(settings->mouse_move); - - settings->no_mouse = true; - no_mouse_cb->setChecked(settings->no_mouse); -} - -void GameStateConfigDesktop::disableJoystickOptions() { - settings->enable_joystick = false; - enable_joystick_cb->setChecked(settings->enable_joystick); - - for (int i=0; igetSize(); i++) - joystick_device_lstb->deselect(i); - - if (inpt->getNumJoysticks() > 0) - joystick_device_lstb->refresh(); -} - -void GameStateConfigDesktop::refreshRenderers() { - renderer_lstb->clear(); - - std::vector rd_name, rd_desc; - createRenderDeviceList(msg, rd_name, rd_desc); - - for (size_t i = 0; i < rd_name.size(); ++i) { - renderer_lstb->append(rd_name[i], rd_desc[i]); - if (rd_name[i] == settings->render_device_name) { - renderer_lstb->select(static_cast(i)); - } - } - - renderer_lstb->jumpToSelected(); -} diff --git a/src/GameStateConfigDesktop.h b/src/GameStateConfigDesktop.h deleted file mode 100644 index 0ad75c2..0000000 --- a/src/GameStateConfigDesktop.h +++ /dev/null @@ -1,156 +0,0 @@ -/* -Copyright © 2014-2016 Justin Jacobs - -This file is part of FLARE. - -FLARE is free software: you can redistribute it and/or modify it under the terms -of the GNU General Public License as published by the Free Software Foundation, -either version 3 of the License, or (at your option) any later version. - -FLARE is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -FLARE. If not, see http://www.gnu.org/licenses/ -*/ - -/** - * GameStateConfigDesktop - * - * Handle game Settings Menu (desktop computer settings) - */ - -#ifndef GAMESTATECONFIGDESKTOP_H -#define GAMESTATECONFIGDESKTOP_H - -#include "CommonIncludes.h" -#include "GameState.h" -#include "GameStateConfigBase.h" -#include "Utils.h" - -class FileParser; -class MenuConfirm; -class Widget; -class WidgetButton; -class WidgetCheckBox; -class WidgetInput; -class WidgetLabel; -class WidgetListBox; -class WidgetScrollBox; -class WidgetSlider; -class WidgetTabControl; - -class GameStateConfigDesktop : public GameStateConfigBase { -public: - static const bool ENABLE_VIDEO_TAB = true; - - explicit GameStateConfigDesktop(bool _enable_video_tab); - ~GameStateConfigDesktop(); - -private: - static const int GAMMA_MIN = 5; - static const int GAMMA_MAX = 15; - - short VIDEO_TAB; - short INPUT_TAB; - short KEYBINDS_TAB; - - void init(); - void readConfig(); - bool parseKeyDesktop(FileParser &infile, int &x1, int &y1, int &x2, int &y2); - void addChildWidgetsDesktop(); - void setupTabList(); - - void update(); - void updateVideo(); - void updateInput(); - void updateKeybinds(); - - void logic(); - bool logicMain(); - void logicVideo(); - void logicInput(); - void logicKeybinds(); - - void renderTabContents(); - void renderDialogs(); - - void refreshWidgets(); - - void cleanupTabContents(); - void cleanupDialogs(); - - TabList tablist_video; - TabList tablist_input; - TabList tablist_keybinds; - - void confirmKey(int button); - void scanKey(int button); - - void enableMouseOptions(); - void disableMouseOptions(); - void disableJoystickOptions(); - void refreshRenderers(); - - WidgetListBox * renderer_lstb; - WidgetLabel * renderer_lb; - WidgetCheckBox * fullscreen_cb; - WidgetLabel * fullscreen_lb; - WidgetCheckBox * hwsurface_cb; - WidgetLabel * hwsurface_lb; - WidgetCheckBox * vsync_cb; - WidgetLabel * vsync_lb; - WidgetCheckBox * texture_filter_cb; - WidgetLabel * texture_filter_lb; - WidgetCheckBox * dpi_scaling_cb; - WidgetLabel * dpi_scaling_lb; - WidgetCheckBox * parallax_layers_cb; - WidgetLabel * parallax_layers_lb; - WidgetCheckBox * change_gamma_cb; - WidgetLabel * change_gamma_lb; - WidgetSlider * gamma_sl; - WidgetLabel * gamma_lb; - WidgetListBox * joystick_device_lstb; - WidgetLabel * joystick_device_lb; - WidgetCheckBox * enable_joystick_cb; - WidgetLabel * enable_joystick_lb; - WidgetCheckBox * mouse_move_cb; - WidgetLabel * mouse_move_lb; - WidgetCheckBox * mouse_aim_cb; - WidgetLabel * mouse_aim_lb; - WidgetCheckBox * no_mouse_cb; - WidgetLabel * no_mouse_lb; - WidgetCheckBox * mouse_move_swap_cb; - WidgetLabel * mouse_move_swap_lb; - WidgetCheckBox * mouse_move_attack_cb; - WidgetLabel * mouse_move_attack_lb; - WidgetSlider * joystick_deadzone_sl; - WidgetLabel * joystick_deadzone_lb; - - std::vector video_modes; - - std::vector keybinds_lb; - std::vector keybinds_btn; - - WidgetScrollBox * input_scrollbox; - MenuConfirm * input_confirm; - - Timer input_confirm_timer; - int input_key; - unsigned key_count; - - Rect scrollpane; - Color scrollpane_color; - int scrollpane_contents; - Point secondary_offset; - - bool enable_video_tab; - - std::string keybind_msg; - Timer keybind_tip_timer; - WidgetTooltip* keybind_tip; -}; - -#endif - diff --git a/src/GameStateLoad.cpp b/src/GameStateLoad.cpp index eaca4da..d585659 100644 --- a/src/GameStateLoad.cpp +++ b/src/GameStateLoad.cpp @@ -77,7 +77,9 @@ , scroll_offset(0) , has_scroll_bar(false) , game_slot_max(4) - , text_trim_boundary(0) { + , text_trim_boundary(0) + , portrait_align(Utils::ALIGN_FRAME_TOPLEFT) + , gameslot_align(Utils::ALIGN_FRAME_TOPLEFT) { if (items == NULL) items = new ItemManager(); @@ -109,6 +111,11 @@ tablist.ignore_no_mouse = true; tablist.add(button_exit); tablist.add(button_new); + + // Some widgets default to being aligned to the menu frame + button_new->alignment = Utils::ALIGN_FRAME_TOPLEFT; + button_load->alignment = Utils::ALIGN_FRAME_TOPLEFT; + button_delete->alignment = Utils::ALIGN_FRAME_TOPLEFT; // Read positions from config file FileParser infile; @@ -120,21 +127,21 @@ if (infile.key == "button_new") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); button_new->setBasePos(x, y, a); } // @ATTR button_load|int, int, alignment : X, Y, Alignment|Position of the "Load Game" button. else if (infile.key == "button_load") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); button_load->setBasePos(x, y, a); } // @ATTR button_delete|int, int, alignment : X, Y, Alignment|Position of the "Delete Save" button. else if (infile.key == "button_delete") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); button_delete->setBasePos(x, y, a); } // @ATTR button_exit|int, int, alignment : X, Y, Alignment|Position of the "Exit to Title" button. @@ -250,6 +257,7 @@ graphics = render_device->loadImage("images/menus/portrait_border.png", RenderDevice::ERROR_NORMAL); if (graphics) { portrait_border = graphics->createSprite(); + portrait_border->setClip(0, 0, portrait_dest.w, portrait_dest.h); graphics->unref(); } } @@ -279,7 +287,7 @@ void GameStateLoad::readGameSlots() { FileParser infile; - std::stringstream filename; + std::string save_root = settings->path_user + "saves/" + eset->misc.save_prefix + "/"; std::vector save_dirs; Filesystem::getDirList(settings->path_user + "saves/" + eset->misc.save_prefix, save_dirs); @@ -297,10 +305,9 @@ for (size_t i=0; ipath_user << "saves/" << eset->misc.save_prefix << "/" << save_dirs[i] << "/avatar.txt"; - - if (!infile.open(filename.str(), !FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) continue; + std::string filename = save_root + save_dirs[i] + "/avatar.txt"; + + if (!infile.open(filename, !FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) continue; game_slots[i] = new GameSlot(); game_slots[i]->id = Parse::toInt(save_dirs[i]); @@ -396,12 +403,12 @@ } for (unsigned int i=0; iequipped.size(); i++) { - if (static_cast(slot->equipped[i]) > items->items.size()-1) { - Utils::logError("GameStateLoad: Item in save slot %d with id=%d is out of bounds 1-%d. Your savegame is broken or you might be using an incompatible savegame/mod", slot->id, slot->equipped[i], static_cast(items->items.size())-1); + if (slot->equipped[i] != 0 && !items->items[slot->equipped[i]].has_name) { + Utils::logError("GameStateLoad: Item in save slot %d with id=%d is unknown. Your savegame is broken or you might be using an incompatible savegame/mod", slot->id, slot->equipped[i]); continue; } - if (slot->equipped[i] > 0 && !preview_layer.empty() && static_cast(slot->equipped[i]) < items->items.size()) { + if (slot->equipped[i] > 0 && !preview_layer.empty()) { std::vector::iterator found = find(preview_layer.begin(), preview_layer.end(), items->items[slot->equipped[i]].type); if (found != preview_layer.end()) img_gfx[distance(preview_layer.begin(), found)] = items->items[slot->equipped[i]].gfx; @@ -614,20 +621,23 @@ void GameStateLoad::refreshWidgets() { button_exit->setPos(0, 0); - button_new->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); - button_load->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); - button_delete->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); + button_new->setPos(0, 0); + button_load->setPos(0, 0); + button_delete->setPos(0, 0); if (portrait) { - portrait->setDest(portrait_dest.x + ((settings->view_w - eset->resolutions.frame_w)/2), portrait_dest.y + ((settings->view_h - eset->resolutions.frame_h)/2)); + Rect portrait_rect = portrait_dest; + Utils::alignToScreenEdge(portrait_align, &portrait_rect); + portrait->setDest(portrait_rect.x, portrait_rect.y); } slot_pos.resize(visible_slots); for (size_t i=0; iview_w - eset->resolutions.frame_w)/2; + slot_pos[i].x = gameslot_pos.x; slot_pos[i].h = gameslot_pos.h; - slot_pos[i].y = gameslot_pos.y + (settings->view_h - eset->resolutions.frame_h)/2 + (static_cast(i) * gameslot_pos.h); + slot_pos[i].y = gameslot_pos.y + (static_cast(i) * gameslot_pos.h); slot_pos[i].w = gameslot_pos.w; + Utils::alignToScreenEdge(gameslot_align, &slot_pos[i]); } refreshScrollBar(); diff --git a/src/GameStateLoad.h b/src/GameStateLoad.h index 51c7654..283df95 100644 --- a/src/GameStateLoad.h +++ b/src/GameStateLoad.h @@ -125,6 +125,8 @@ bool has_scroll_bar; int game_slot_max; int text_trim_boundary; + int portrait_align; + int gameslot_align; public: GameStateLoad(); diff --git a/src/GameStateNew.cpp b/src/GameStateNew.cpp index c3c94ae..0a2d17a 100644 --- a/src/GameStateNew.cpp +++ b/src/GameStateNew.cpp @@ -54,6 +54,7 @@ , portrait_image(NULL) , portrait_border(NULL) , show_classlist(true) + , show_randomize(true) , modified_name(false) , delete_items(true) , random_option(false) @@ -104,6 +105,14 @@ label_classlist->setText(msg->get("Choose a Class")); label_classlist->setColor(font->getColor(FontEngine::COLOR_MENU_NORMAL)); + // Some widgets default to being aligned to the menu frame + button_prev->alignment = Utils::ALIGN_FRAME_TOPLEFT; + button_next->alignment = Utils::ALIGN_FRAME_TOPLEFT; + button_permadeath->alignment = Utils::ALIGN_FRAME_TOPLEFT; + button_randomize->alignment = Utils::ALIGN_FRAME_TOPLEFT; + input_name->alignment = Utils::ALIGN_FRAME_TOPLEFT; + class_list->alignment = Utils::ALIGN_FRAME_TOPLEFT; + // Read positions from config file FileParser infile; @@ -114,14 +123,14 @@ if (infile.key == "button_prev") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); button_prev->setBasePos(x, y, a); } // @ATTR button_next|int, int, alignment : X, Y, Alignment|Position of button to choose the next preset hero. else if (infile.key == "button_next") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); button_next->setBasePos(x, y, a); } // @ATTR button_exit|int, int, alignment : X, Y, Alignment|Position of "Cancel" button. @@ -142,21 +151,21 @@ else if (infile.key == "button_permadeath") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); button_permadeath->setBasePos(x, y, a); } - // @ATTR bytton_randomize|int, int, alignment : X, Y, Alignment|Position of the "Randomize" button. + // @ATTR button_randomize|int, int, alignment : X, Y, Alignment|Position of the "Randomize" button. else if (infile.key == "button_randomize") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); button_randomize->setBasePos(x, y, a); } // @ATTR name_input|int, int, alignment : X, Y, Alignment|Position of the hero name textbox. else if (infile.key == "name_input") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); input_name->setBasePos(x, y, a); } // @ATTR portrait_label|label|Label for the "Choose a Portrait" text. @@ -187,12 +196,16 @@ else if (infile.key == "class_list") { int x = Parse::popFirstInt(infile.val); int y = Parse::popFirstInt(infile.val); - int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + int a = Parse::toAlignment(Parse::popFirstString(infile.val), Utils::ALIGN_FRAME_TOPLEFT); class_list->setBasePos(x, y, a); } // @ATTR show_classlist|bool|Allows hiding the class list. else if (infile.key == "show_classlist") { show_classlist = Parse::toBool(infile.val); + } + // @ATTR show_randomize|bool|Toggles the visibility of the "Randomize" button. + else if (infile.key == "show_randomize") { + show_randomize = Parse::toBool(infile.val); } // @ATTR random_option|bool|Initially picks a random character option (aka portrait/name). else if (infile.key == "random_option") { @@ -236,10 +249,14 @@ tablist.add(button_create); tablist.add(input_name); tablist.add(button_permadeath); - tablist.add(button_randomize); + if (show_randomize) { + tablist.add(button_randomize); + } tablist.add(button_prev); tablist.add(button_next); - tablist.add(class_list); + if (show_classlist) { + tablist.add(class_list); + } refreshWidgets(); @@ -441,7 +458,7 @@ setHeroOption(OPTION_PREV); } - if (button_randomize->checkClick()) { + if (show_randomize && button_randomize->checkClick()) { if (!eset->hero_classes.list.empty()) { int class_index = static_cast(rand() % eset->hero_classes.list.size()); class_list->select(class_index); @@ -457,18 +474,18 @@ button_exit->setPos(0, 0); button_create->setPos(0, 0); - button_prev->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); - button_next->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); - button_permadeath->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); - button_randomize->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); - class_list->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); + button_prev->setPos(0, 0); + button_next->setPos(0, 0); + button_permadeath->setPos(0, 0); + button_randomize->setPos(0, 0); + class_list->setPos(0, 0); label_portrait->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); label_name->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); label_permadeath->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); label_classlist->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); - input_name->setPos((settings->view_w - eset->resolutions.frame_w)/2, (settings->view_h - eset->resolutions.frame_h)/2); + input_name->setPos(0, 0); } void GameStateNew::render() { @@ -480,7 +497,10 @@ button_next->render(); input_name->render(); button_permadeath->render(); - button_randomize->render(); + + if (show_randomize) { + button_randomize->render(); + } // display portrait option Rect src; diff --git a/src/GameStateNew.h b/src/GameStateNew.h index 6fbc9c3..bac9cd6 100644 --- a/src/GameStateNew.h +++ b/src/GameStateNew.h @@ -87,6 +87,7 @@ Rect portrait_pos; bool show_classlist; + bool show_randomize; bool modified_name; bool delete_items; bool random_option; diff --git a/src/GameStatePlay.cpp b/src/GameStatePlay.cpp index fe4c5d4..f3a7f8c 100644 --- a/src/GameStatePlay.cpp +++ b/src/GameStatePlay.cpp @@ -31,9 +31,9 @@ #include "CampaignManager.h" #include "CombatText.h" #include "CursorManager.h" -#include "Enemy.h" #include "EnemyGroupManager.h" -#include "EnemyManager.h" +#include "Entity.h" +#include "EntityManager.h" #include "EngineSettings.h" #include "FileParser.h" #include "GameState.h" @@ -99,7 +99,7 @@ powers = new PowerManager(); mapr = new MapRenderer(); pc = new Avatar(); - enemym = new EnemyManager(); + entitym = new EntityManager(); enemyg = new EnemyGroupManager(); hazards = new HazardManager(); menu = new MenuManager(); @@ -120,12 +120,10 @@ * Reset all game states to a new game. */ void GameStatePlay::resetGame() { - mapr->load("maps/spawn.txt"); - setLoadingFrame(); camp->resetAllStatuses(); pc->init(); pc->stats.currency = 0; - menu->act->clear(); + menu->act->clear(!MenuActionBar::CLEAR_SKIP_ITEMS); menu->inv->inventory[0].clear(); menu->inv->inventory[1].clear(); menu->inv->changed_equipment = true; @@ -138,7 +136,8 @@ menu->talker->setHero(pc->stats); pc->loadSounds(); - mapr->executeOnLoadEvents(); + mapr->teleportation = true; + mapr->teleport_mapname = "maps/spawn.txt"; } /** @@ -168,7 +167,7 @@ enemy = hazards->last_enemy; } else { - enemy = enemym->getNearestEnemy(pc->stats.pos, !EnemyManager::GET_CORPSE, NULL, eset->misc.interact_range); + enemy = entitym->getNearestEntity(pc->stats.pos, !EntityManager::GET_CORPSE, NULL, eset->misc.interact_range); } } else { @@ -177,10 +176,11 @@ hazards->last_enemy = NULL; } else { - enemy = enemym->enemyFocus(inpt->mouse, mapr->cam, EnemyManager::IS_ALIVE); - if (enemy) + enemy = entitym->entityFocus(inpt->mouse, mapr->cam.pos, EntityManager::IS_ALIVE); + if (enemy) { curs->setCursor(CursorManager::CURSOR_ATTACK); - src_pos = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, mapr->cam.x, mapr->cam.y); + } + src_pos = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, mapr->cam.pos.x, mapr->cam.pos.y); } } @@ -194,7 +194,7 @@ } else if (inpt->usingMouse()) { // if we're using a mouse and we didn't select an enemy, try selecting a dead one instead - Enemy *temp_enemy = enemym->enemyFocus(inpt->mouse, mapr->cam, !EnemyManager::IS_ALIVE); + Entity *temp_enemy = entitym->entityFocus(inpt->mouse, mapr->cam.pos, !EntityManager::IS_ALIVE); if (temp_enemy) { pc->stats.target_corpse = &(temp_enemy->stats); menu->enemy->enemy = temp_enemy; @@ -211,12 +211,43 @@ } // save the positions of the nearest enemies for powers that use "target_nearest" - Enemy *nearest = enemym->getNearestEnemy(src_pos, !EnemyManager::GET_CORPSE, &(pc->stats.target_nearest_dist), eset->misc.interact_range); + Entity *nearest = entitym->getNearestEntity(src_pos, !EntityManager::GET_CORPSE, &(pc->stats.target_nearest_dist), eset->misc.interact_range); if (nearest) pc->stats.target_nearest = &(nearest->stats); - Enemy *nearest_corpse = enemym->getNearestEnemy(src_pos, EnemyManager::GET_CORPSE, &(pc->stats.target_nearest_corpse_dist), eset->misc.interact_range); + Entity *nearest_corpse = entitym->getNearestEntity(src_pos, EntityManager::GET_CORPSE, &(pc->stats.target_nearest_corpse_dist), eset->misc.interact_range); if (nearest_corpse) pc->stats.target_nearest_corpse = &(nearest_corpse->stats); +} + +/** + * Similar to the above checkEnemyFocus(), but handles NPCManager instead + */ +void GameStatePlay::checkNPCFocus() { + Entity *focus_npc; + + if (!inpt->usingMouse() && (!menu->enemy->enemy || (menu->enemy->enemy && menu->enemy->enemy->stats.hero_ally))) { + // TODO bug? If mixed monster allies and npc allies, npc allies will always be highlighted, regardless of distance to player + focus_npc = npcs->getNearestNPC(pc->stats.pos); + } + else { + focus_npc = npcs->npcFocus(inpt->mouse, mapr->cam.pos, true); + } + + if (focus_npc) { + // set the actual menu with the npc selected above + if (!focus_npc->stats.suppress_hp) { + menu->enemy->enemy = focus_npc; + menu->enemy->timeout.reset(Timer::BEGIN); + } + } + else if (inpt->usingMouse()) { + // if we're using a mouse and we didn't select an npc, try selecting a dead one instead + Entity *temp_npc = npcs->npcFocus(inpt->mouse, mapr->cam.pos, false); + if (temp_npc) { + menu->enemy->enemy = temp_npc; + menu->enemy->timeout.reset(Timer::BEGIN); + } + } } /** @@ -258,7 +289,7 @@ // Normal pickups if (!pc->using_main1) { - pickup = loot->checkPickup(inpt->mouse, mapr->cam, pc->stats.pos); + pickup = loot->checkPickup(inpt->mouse, mapr->cam.pos, pc->stats.pos); } if (!pickup.empty()) { @@ -283,6 +314,7 @@ // during intermap teleport, we set the camera to the player position pc->stats.pos.x = mapr->teleport_destination.x; pc->stats.pos.y = mapr->teleport_destination.y; + pc->teleport_camera_lock = true; } else { pc->stats.pos.x = pc->stats.teleport_destination.x; @@ -290,22 +322,21 @@ } // if we're not changing map, move allies to a the player's new position - // when changing maps, enemym->handleNewMap() does something similar to this + // when changing maps, entitym->handleNewMap() does something similar to this if (mapr->teleport_mapname.empty()) { FPoint spawn_pos = mapr->collider.getRandomNeighbor(Point(pc->stats.pos), 1, !MapCollision::IGNORE_BLOCKED); - for (unsigned int i=0; i < enemym->enemies.size(); i++) { - if(enemym->enemies[i]->stats.hero_ally && enemym->enemies[i]->stats.alive) { - mapr->collider.unblock(enemym->enemies[i]->stats.pos.x, enemym->enemies[i]->stats.pos.y); - enemym->enemies[i]->stats.pos = spawn_pos; - mapr->collider.block(enemym->enemies[i]->stats.pos.x, enemym->enemies[i]->stats.pos.y, MapCollision::IS_ALLY); + for (unsigned int i=0; i < entitym->entities.size(); i++) { + if(entitym->entities[i]->stats.hero_ally && entitym->entities[i]->stats.alive) { + mapr->collider.unblock(entitym->entities[i]->stats.pos.x, entitym->entities[i]->stats.pos.y); + entitym->entities[i]->stats.pos = spawn_pos; + mapr->collider.block(entitym->entities[i]->stats.pos.x, entitym->entities[i]->stats.pos.y, MapCollision::IS_ALLY); } } } // process intermap teleport if (mapr->teleportation && !mapr->teleport_mapname.empty()) { - mapr->cam.x = pc->stats.pos.x; - mapr->cam.y = pc->stats.pos.y; + mapr->cam.warpTo(pc->stats.pos); std::string teleport_mapname = mapr->teleport_mapname; mapr->teleport_mapname = ""; inpt->lock_all = (teleport_mapname == "maps/spawn.txt"); @@ -316,8 +347,9 @@ // use the default hero spawn position for this map if (mapr->teleport_destination.x == -1 && mapr->teleport_destination.y == -1) { - mapr->cam.x = pc->stats.pos.x = mapr->hero_pos.x; - mapr->cam.y = pc->stats.pos.y = mapr->hero_pos.y; + pc->stats.pos.x = mapr->hero_pos.x; + pc->stats.pos.y = mapr->hero_pos.y; + mapr->cam.warpTo(pc->stats.pos); } // store this as the new respawn point (provided the tile is open) @@ -344,14 +376,14 @@ on_load_teleport = true; // enemies and npcs should be initialized AFTER on_load events execute - enemym->handleNewMap(); + entitym->handleNewMap(); npcs->handleNewMap(); resetNPC(); menu->mini->prerender(&mapr->collider, mapr->w, mapr->h); // return to title (permadeath) OR auto-save - if (pc->stats.permadeath && pc->stats.cur_state == StatBlock::AVATAR_DEAD) { + if (pc->stats.permadeath && pc->stats.cur_state == StatBlock::ENTITY_DEAD) { snd->stopMusic(); showLoading(); setRequestedGameState(new GameStateTitle()); @@ -384,7 +416,7 @@ * Also check closing the game window entirely. */ void GameStatePlay::checkCancel() { - bool save_on_exit = eset->misc.save_onexit && !(pc->stats.permadeath && pc->stats.cur_state == StatBlock::AVATAR_DEAD); + bool save_on_exit = eset->misc.save_onexit && !(pc->stats.permadeath && pc->stats.cur_state == StatBlock::ENTITY_DEAD); if (save_on_exit && eset->misc.save_pos_onexit) { mapr->respawn_point = pc->stats.pos; @@ -399,6 +431,7 @@ // audio levels can be changed in the pause menu, so update our settings file settings->saveSettings(); + inpt->saveKeyBindings(); snd->stopMusic(); showLoading(); @@ -413,6 +446,9 @@ if (save_on_exit) save_load->saveGame(); + + settings->saveSettings(); + inpt->saveKeyBindings(); snd->stopMusic(); exitRequested = true; @@ -479,7 +515,7 @@ } else if (infile.key == "power") { // @ATTR title.power|power_id|Requires power. - titles.back().power = Parse::toInt(infile.val); + titles.back().power = Parse::toPowerID(infile.val); } else if (infile.key == "requires_status") { // @ATTR title.requires_status|list(string)|Requires status. @@ -553,12 +589,9 @@ } void GameStatePlay::checkEquipmentChange() { - // force the actionbar to update when we change gear if (menu->inv->changed_equipment) { + // force the actionbar to update when we change gear menu->act->updated = true; - } - - if (menu->inv->changed_equipment) { int feet_index = -1; std::vector img_gfx; @@ -631,7 +664,7 @@ */ void GameStatePlay::checkUsedItems() { for (unsigned i=0; iused_items.size(); i++) { - menu->inv->remove(powers->used_items[i]); + menu->inv->remove(powers->used_items[i], 1); } for (unsigned i=0; iused_equipped_items.size(); i++) { menu->inv->inventory[MenuInventory::EQUIPMENT].remove(powers->used_equipped_items[i], 1); @@ -707,7 +740,7 @@ if (npc_id != -1) { bool interact_with_npc = false; if (menu->talker->npc_from_map) { - float interact_distance = Utils::calcDist(pc->stats.pos, npcs->npcs[npc_id]->pos); + float interact_distance = Utils::calcDist(pc->stats.pos, npcs->npcs[npc_id]->stats.pos); if (interact_distance < eset->misc.interact_range) { interact_with_npc = true; @@ -744,6 +777,7 @@ menu->inv->visible = true; menu->stash->visible = true; mapr->stash = false; + menu->stash->validate(menu->drop_stack); } else if (menu->stash->visible) { // Close stash if inventory is closed @@ -762,8 +796,7 @@ } // If the stash has been updated, save the game - if (menu->stash->updated) { - menu->stash->updated = false; + if (menu->stash->checkUpdates()) { save_load->saveGame(); } } @@ -796,12 +829,10 @@ mapr->respawn_point = pc->stats.pos; } - if (eset->misc.save_onload) + if (eset->misc.save_oncutscene) save_load->saveGame(); - if (menu->devconsole) { - menu->devconsole->closeWindow(); - } + menu->closeAll(); setRequestedGameState(cutscene); } @@ -825,7 +856,7 @@ for (unsigned i = index; i < menu->act->slots_count; i++) { if (menu->act->hotkeys[i] == 0) continue; - int id = menu->inv->getPowerMod(menu->act->hotkeys_mod[i]); + PowerID id = menu->inv->getPowerMod(menu->act->hotkeys_mod[i]); if (id > 0) { menu->act->hotkeys_mod[i] = id; return updateActionBar(i); @@ -840,6 +871,8 @@ void GameStatePlay::logic() { if (inpt->window_resized) refreshWidgets(); + + curs->setLowHP(pc->isLowHpCursorEnabled() && pc->isLowHp()); checkCutscene(); @@ -857,6 +890,7 @@ // these actions only occur when the game isn't paused if (pc->stats.alive) checkLoot(); checkEnemyFocus(); + checkNPCFocus(); if (pc->stats.alive) { mapr->checkHotspots(); mapr->checkNearestEvent(); @@ -864,8 +898,8 @@ } checkTitle(); - menu->act->checkAction(action_queue); - pc->logic(action_queue, restrictPowerUse()); + menu->act->checkAction(pc->action_queue); + pc->logic(); // Transform powers change the actionbar layout, // so we need to prevent accidental clicks if a new power is placed under the slot we clicked on. @@ -875,18 +909,17 @@ } // transfer hero data to enemies, for AI use - if (pc->stats.get(Stats::STEALTH) > 100) enemym->hero_stealth = 100; - else enemym->hero_stealth = pc->stats.get(Stats::STEALTH); - - enemym->logic(); + if (pc->stats.get(Stats::STEALTH) > 100) entitym->hero_stealth = 100; + else entitym->hero_stealth = pc->stats.get(Stats::STEALTH); + + entitym->logic(); hazards->logic(); loot->logic(); - enemym->checkEnemiesforXP(); npcs->logic(); snd->logic(pc->stats.pos); - comb->logic(mapr->cam); + comb->logic(mapr->cam.pos); } // close menus when the player dies, but still allow them to be reopened @@ -909,7 +942,7 @@ checkCancel(); mapr->logic(isPaused()); - mapr->enemies_cleared = enemym->isCleared(); + mapr->enemies_cleared = entitym->isCleared(); quests->logic(); pc->checkTransform(); @@ -970,7 +1003,7 @@ if (pc->respawn) { pc->stats.alive = true; pc->stats.corpse = false; - pc->stats.cur_state = StatBlock::AVATAR_STANCE; + pc->stats.cur_state = StatBlock::ENTITY_STANCE; menu->inv->applyEquipment(); menu->inv->changed_equipment = true; checkEquipmentChange(); @@ -1010,6 +1043,8 @@ * Render all graphics for a single frame */ void GameStatePlay::render() { + if (mapr->is_spawn_map) + return; // Create a list of Renderables from all objects not already on the map. // split the list into the beings alive (may move) and dead beings (must not move) @@ -1018,7 +1053,7 @@ pc->addRenders(rens); - enemym->addRenders(rens, rens_dead); + entitym->addRenders(rens, rens_dead); npcs->addRenders(rens); // npcs cannot be dead @@ -1031,7 +1066,7 @@ mapr->render(rens, rens_dead); // mouseover tooltips - loot->renderTooltips(mapr->cam); + loot->renderTooltips(mapr->cam.pos); if (mapr->map_change) { menu->mini->prerender(&mapr->collider, mapr->w, mapr->h); @@ -1097,10 +1132,12 @@ } GameStatePlay::~GameStatePlay() { + curs->setLowHP(false); + delete quests; delete npcs; delete hazards; - delete enemym; + delete entitym; delete pc; delete mapr; delete menu; @@ -1116,7 +1153,7 @@ menu = NULL; camp = NULL; enemyg = NULL; - enemym = NULL; + entitym = NULL; items = NULL; loot = NULL; mapr = NULL; diff --git a/src/GameStatePlay.h b/src/GameStatePlay.h index b5f9881..c7962b9 100644 --- a/src/GameStatePlay.h +++ b/src/GameStatePlay.h @@ -32,9 +32,8 @@ #include "Utils.h" class Avatar; -class Enemy; +class Entity; class MenuManager; -class NPCManager; class QuestLog; class WidgetLabel; @@ -44,7 +43,7 @@ public: std::string title; int level; - int power; + PowerID power; std::vector requires_status; std::vector requires_not_status; std::string primary_stat_1; @@ -63,13 +62,13 @@ class GameStatePlay : public GameState { private: - Enemy *enemy; + Entity *enemy; - NPCManager *npcs; QuestLog *quests; bool restrictPowerUse(); void checkEnemyFocus(); + void checkNPCFocus(); void checkLoot(); void checkLootDrop(); void checkTeleport(); @@ -93,8 +92,6 @@ std::vector titles; - std::vector<ActionData> action_queue; - Timer second_timer; bool is_first_map_load; diff --git a/src/GameStateTitle.cpp b/src/GameStateTitle.cpp index 7f7b5bf..b8a290f 100644 --- a/src/GameStateTitle.cpp +++ b/src/GameStateTitle.cpp @@ -21,12 +21,12 @@ #include "EngineSettings.h" #include "FileParser.h" #include "FontEngine.h" -#include "GameStateConfigBase.h" -#include "GameStateConfigDesktop.h" +#include "GameStateConfig.h" #include "GameStateCutscene.h" #include "GameStateLoad.h" #include "GameStateTitle.h" #include "InputState.h" +#include "MenuMovementType.h" #include "MessageEngine.h" #include "Platform.h" #include "RenderDevice.h" @@ -43,17 +43,16 @@ GameStateTitle::GameStateTitle() : GameState() , logo(NULL) + , button_play(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , button_exit(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , button_cfg(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , button_credits(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , label_version(new WidgetLabel()) + , menu_movement_type(NULL) , align_logo(Utils::ALIGN_CENTER) , exit_game(false) , load_game(false) { - - // set up buttons - button_play = new WidgetButton(WidgetButton::DEFAULT_FILE); - button_exit = new WidgetButton(WidgetButton::DEFAULT_FILE); - button_cfg = new WidgetButton(WidgetButton::DEFAULT_FILE); - button_credits = new WidgetButton(WidgetButton::DEFAULT_FILE); - FileParser infile; // @CLASS GameStateTitle|Description of menus/gametitle.txt if (infile.open("menus/gametitle.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { @@ -122,7 +121,6 @@ button_exit->refresh(); // set up labels - label_version = new WidgetLabel(); label_version->setJustify(FontEngine::JUSTIFY_RIGHT); label_version->setText(VersionInfo::createVersionStringFull()); label_version->setColor(font->getColor(FontEngine::COLOR_MENU_NORMAL)); @@ -142,6 +140,13 @@ } render_device->setBackgroundColor(Color(0,0,0,0)); + + // NOTE The presence of the mouse move setting is used to determine if the + // movement type dialog is displayed. Is this adequate? + if (!settings->move_type_dimissed && platform.config_input[Platform::Input::MOUSE_MOVE]) { + menu_movement_type = new MenuMovementType(); + menu_movement_type->visible = true; + } } void GameStateTitle::logic() { @@ -157,36 +162,36 @@ exitRequested = true; } - tablist.logic(); - - if (button_play->checkClick()) { - showLoading(); - setRequestedGameState(new GameStateLoad()); - } - else if (button_cfg->checkClick()) { - showLoading(); - if (platform.config_menu_type == Platform::CONFIG_MENU_TYPE_DESKTOP_NO_VIDEO) - setRequestedGameState(new GameStateConfigDesktop(!GameStateConfigDesktop::ENABLE_VIDEO_TAB)); - else if (platform.config_menu_type == Platform::CONFIG_MENU_TYPE_DESKTOP) - setRequestedGameState(new GameStateConfigDesktop(GameStateConfigDesktop::ENABLE_VIDEO_TAB)); - else - setRequestedGameState(new GameStateConfigBase(GameStateConfigBase::DO_INIT)); - } - else if (button_credits->checkClick()) { - showLoading(); - GameStateTitle *title = new GameStateTitle(); - GameStateCutscene *credits = new GameStateCutscene(title); - - if (!credits->load("cutscenes/credits.txt")) { - delete credits; - delete title; - } - else { - setRequestedGameState(credits); - } - } - else if (platform.has_exit_button && button_exit->checkClick()) { - exitRequested = true; + if (menu_movement_type && menu_movement_type->visible) { + menu_movement_type->logic(); + } + else { + tablist.logic(); + + if (button_play->checkClick()) { + showLoading(); + setRequestedGameState(new GameStateLoad()); + } + else if (button_cfg->checkClick()) { + showLoading(); + setRequestedGameState(new GameStateConfig()); + } + else if (button_credits->checkClick()) { + showLoading(); + GameStateTitle *title = new GameStateTitle(); + GameStateCutscene *credits = new GameStateCutscene(title); + + if (!credits->load("cutscenes/credits.txt")) { + delete credits; + delete title; + } + else { + setRequestedGameState(credits); + } + } + else if (platform.has_exit_button && button_exit->checkClick()) { + exitRequested = true; + } } } @@ -207,19 +212,27 @@ button_exit->setPos(0, 0); label_version->setPos(settings->view_w, 0); + + if (menu_movement_type) + menu_movement_type->align(); } void GameStateTitle::render() { - // display logo - render_device->render(logo); - - // display buttons - button_play->render(); - button_cfg->render(); - button_credits->render(); - - if (platform.has_exit_button) - button_exit->render(); + if (!menu_movement_type || !menu_movement_type->visible) { + // display logo + render_device->render(logo); + + // display buttons + button_play->render(); + button_cfg->render(); + button_credits->render(); + + if (platform.has_exit_button) + button_exit->render(); + } + else { + menu_movement_type->render(); + } // version number label_version->render(); @@ -232,4 +245,5 @@ delete button_credits; delete button_exit; delete label_version; -} + delete menu_movement_type; +} diff --git a/src/GameStateTitle.h b/src/GameStateTitle.h index 8d2d16c..63a732f 100644 --- a/src/GameStateTitle.h +++ b/src/GameStateTitle.h @@ -23,6 +23,7 @@ #include "GameState.h" #include "Widget.h" +class MenuMovementType; class WidgetButton; class WidgetLabel; @@ -36,6 +37,7 @@ WidgetButton *button_cfg; WidgetButton *button_credits; WidgetLabel *label_version; + MenuMovementType *menu_movement_type; TabList tablist; diff --git a/src/Hazard.cpp b/src/Hazard.cpp index 2371ef0..71ec2e2 100644 --- a/src/Hazard.cpp +++ b/src/Hazard.cpp @@ -164,6 +164,8 @@ if (activeAnimation) activeAnimation->advanceFrame(); + prev_pos = pos; + // handle movement bool check_collide = false; if (!(speed.x == 0 && speed.y == 0)) { diff --git a/src/Hazard.h b/src/Hazard.h index bebf5fb..d0a904a 100644 --- a/src/Hazard.h +++ b/src/Hazard.h @@ -50,7 +50,6 @@ void setAngle(const float& _angle); bool isDangerousNow(); void addRenderable(std::vector<Renderable> &r, std::vector<Renderable> &r_dead); - void setPower(size_t power_index); bool active; bool remove_now; @@ -71,7 +70,7 @@ StatBlock *src_stats; Power *power; - size_t power_index; + PowerID power_index; FPoint pos; FPoint speed; @@ -80,6 +79,8 @@ // for linking hazards together, e.g. repeaters Hazard* parent; std::vector<Hazard*> children; + + FPoint prev_pos; private: void reflect(); diff --git a/src/HazardManager.cpp b/src/HazardManager.cpp index 2f379ad..2b66a7b 100644 --- a/src/HazardManager.cpp +++ b/src/HazardManager.cpp @@ -25,8 +25,8 @@ #include "Avatar.h" #include "Animation.h" -#include "Enemy.h" -#include "EnemyManager.h" +#include "Entity.h" +#include "EntityManager.h" #include "EventManager.h" #include "Hazard.h" #include "HazardManager.h" @@ -92,17 +92,17 @@ // process hazards that can hurt enemies if (h[i]->source_type != Power::SOURCE_TYPE_ENEMY) { //hero or neutral sources - for (unsigned int eindex = 0; eindex < enemym->enemies.size(); eindex++) { + for (unsigned int eindex = 0; eindex < entitym->entities.size(); eindex++) { // only check living enemies - if (enemym->enemies[eindex]->stats.hp > 0 && h[i]->active && (enemym->enemies[eindex]->stats.hero_ally == h[i]->power->target_party)) { - if (Utils::isWithinRadius(h[i]->pos, h[i]->power->radius, enemym->enemies[eindex]->stats.pos)) { - if (!h[i]->hasEntity(enemym->enemies[eindex])) { + if (entitym->entities[eindex]->stats.hp > 0 && h[i]->active && (entitym->entities[eindex]->stats.hero_ally == h[i]->power->target_party)) { + if (Utils::isWithinRadius(h[i]->pos, h[i]->power->radius, entitym->entities[eindex]->stats.pos)) { + if (!h[i]->hasEntity(entitym->entities[eindex])) { // hit! - h[i]->addEntity(enemym->enemies[eindex]); - hitEntity(i, enemym->enemies[eindex]->takeHit(*h[i])); + h[i]->addEntity(entitym->entities[eindex]); + hitEntity(i, entitym->entities[eindex]->takeHit(*h[i])); if (!h[i]->power->beacon) { - last_enemy = enemym->enemies[eindex]; + last_enemy = entitym->entities[eindex]; } } } @@ -124,14 +124,14 @@ } //now process allies - for (unsigned int eindex = 0; eindex < enemym->enemies.size(); eindex++) { + for (unsigned int eindex = 0; eindex < entitym->entities.size(); eindex++) { // only check living allies - if (enemym->enemies[eindex]->stats.hp > 0 && h[i]->active && enemym->enemies[eindex]->stats.hero_ally) { - if (Utils::isWithinRadius(h[i]->pos, h[i]->power->radius, enemym->enemies[eindex]->stats.pos)) { - if (!h[i]->hasEntity(enemym->enemies[eindex])) { + if (entitym->entities[eindex]->stats.hp > 0 && h[i]->active && entitym->entities[eindex]->stats.hero_ally) { + if (Utils::isWithinRadius(h[i]->pos, h[i]->power->radius, entitym->entities[eindex]->stats.pos)) { + if (!h[i]->hasEntity(entitym->entities[eindex])) { // hit! - h[i]->addEntity(enemym->enemies[eindex]); - hitEntity(i, enemym->enemies[eindex]->takeHit(*h[i])); + h[i]->addEntity(entitym->entities[eindex]); + hitEntity(i, entitym->entities[eindex]->takeHit(*h[i])); } } } diff --git a/src/HazardManager.h b/src/HazardManager.h index 2a6b2b3..77483a4 100644 --- a/src/HazardManager.h +++ b/src/HazardManager.h @@ -29,7 +29,7 @@ #include "Utils.h" class Avatar; -class Enemy; +class Entity; class Hazard; class HazardManager { @@ -45,7 +45,7 @@ void addRenders(std::vector<Renderable> &r, std::vector<Renderable> &r_dead); std::vector<Hazard*> h; - Enemy* last_enemy; + Entity* last_enemy; }; #endif diff --git a/src/InputState.cpp b/src/InputState.cpp index 01d3a36..25be1a5 100644 --- a/src/InputState.cpp +++ b/src/InputState.cpp @@ -31,6 +31,7 @@ #include "Platform.h" #include "Settings.h" #include "SharedResources.h" +#include "UtilsFileSystem.h" #include "UtilsParsing.h" #include "Version.h" @@ -62,11 +63,12 @@ , pressing_up(false) , pressing_down(false) , joysticks_changed(false) + , refresh_hotkeys(false) , un_press() , current_touch() , dump_event(false) , file_version(new Version()) - , file_version_min(new Version(1, 6, 28)) + , file_version_min(new Version(1, 9, 20)) { } @@ -115,9 +117,17 @@ opened_file = true; } } - // if there are no mod keybinds, fall back to global config - else if (infile.open(settings->path_conf + "keybindings.txt", !FileParser::MOD_FILE, FileParser::ERROR_NONE)) { - opened_file = true; + else { + // if there are no mod keybinds, fall back to global config + if (infile.open(settings->path_conf + "keybindings.txt", !FileParser::MOD_FILE, FileParser::ERROR_NONE)) { + opened_file = true; + } + + // clean up mod keybinds if engine/default_keybindings.txt is not present + if (Filesystem::fileExists(settings->path_user + "saves/" + eset->misc.save_prefix + "/keybindings.txt")) { + Utils::logInfo("InputState: Found unexpected save prefix keybinding file. Removing it now."); + Filesystem::removeFile(settings->path_user + "saves/" + eset->misc.save_prefix + "/keybindings.txt"); + } } if (!opened_file) { @@ -259,6 +269,8 @@ } infile.close(); + + setFixedKeyBindings(); } /** @@ -267,6 +279,7 @@ void InputState::saveKeyBindings() { std::string out_path; if (mods->locate("engine/default_keybindings.txt") != "") { + Filesystem::createDir(settings->path_user + "saves/" + eset->misc.save_prefix); out_path = settings->path_user + "saves/" + eset->misc.save_prefix + "/keybindings.txt"; } else { @@ -329,6 +342,8 @@ } void InputState::handle() { + refresh_hotkeys = false; + if (lock_all) return; inkeys = ""; diff --git a/src/InputState.h b/src/InputState.h index 2be7c09..6f5decc 100644 --- a/src/InputState.h +++ b/src/InputState.h @@ -49,15 +49,15 @@ LOG = 19, MAIN1 = 20, MAIN2 = 21, - CTRL = 22, - SHIFT = 23, - ALT = 24, - DEL = 25, - ACTIONBAR = 26, - ACTIONBAR_BACK = 27, - ACTIONBAR_FORWARD = 28, - ACTIONBAR_USE = 29, - DEVELOPER_MENU = 30 + ACTIONBAR = 22, + ACTIONBAR_BACK = 23, + ACTIONBAR_FORWARD = 24, + ACTIONBAR_USE = 25, + DEVELOPER_MENU = 26, + CTRL = 27, + SHIFT = 28, + ALT = 29, + DEL = 30 }; } @@ -86,7 +86,9 @@ BINDING_JOYSTICK = 2 }; + static const bool GET_SHORT_STRING = true; static const int KEY_COUNT = 31; + static const int KEY_COUNT_USER = KEY_COUNT - 4; // exclude CTRL, SHIFT, etc from keybinding menu int binding[KEY_COUNT]; int binding_alt[KEY_COUNT]; int binding_joy[KEY_COUNT]; @@ -108,13 +110,14 @@ virtual void handle(); virtual void defaultQwertyKeyBindings() = 0; + virtual void setFixedKeyBindings() = 0; virtual void hideCursor() = 0; virtual void showCursor() = 0; virtual std::string getJoystickName(int index) = 0; - virtual std::string getKeyName(int key) = 0; - virtual std::string getMouseButtonName(int button) = 0; - virtual std::string getJoystickButtonName(int button) = 0; - virtual std::string getBindingString(int key, int bindings_list = BINDING_DEFAULT) = 0; + virtual std::string getKeyName(int key, bool get_short_string = !GET_SHORT_STRING) = 0; + virtual std::string getMouseButtonName(int button, bool get_short_string = !GET_SHORT_STRING) = 0; + virtual std::string getJoystickButtonName(int button, bool get_short_string = !GET_SHORT_STRING) = 0; + virtual std::string getBindingString(int key, int bindings_list = BINDING_DEFAULT, bool get_short_string = !GET_SHORT_STRING) = 0; virtual std::string getMovementString() = 0; virtual std::string getAttackString() = 0; virtual std::string getContinueString() = 0; @@ -152,6 +155,7 @@ bool pressing_up; bool pressing_down; bool joysticks_changed; + bool refresh_hotkeys; protected: Point scaleMouse(unsigned int x, unsigned int y); diff --git a/src/ItemManager.cpp b/src/ItemManager.cpp index ceafebd..815294e 100644 --- a/src/ItemManager.cpp +++ b/src/ItemManager.cpp @@ -31,6 +31,7 @@ #include "FontEngine.h" #include "InputState.h" #include "ItemManager.h" +#include "MenuInventory.h" #include "MenuManager.h" #include "MenuPowers.h" #include "MessageEngine.h" @@ -53,6 +54,12 @@ bool compareItemStack(const ItemStack &stack1, const ItemStack &stack2) { return stack1.item < stack2.item; } + +ItemStack::ItemStack(const Point& _p) + : item(_p.x) + , quantity(_p.y) + , can_buyback(false) +{} Item::Item() : name("") @@ -81,21 +88,14 @@ , max_quantity(INT_MAX) , pickup_status("") , stepfx("") - , quest_item(false) { + , quest_item(false) + , no_stash(NO_STASH_NULL) + , script("") { } ItemManager::ItemManager() { - // These values are a bit arbitrary, but they should be a good starting point. - items.reserve(1000); - item_sets.reserve(100); - loadAll(); - - // make sure we have at least 1 item - if (items.empty()) { - addUnknownItem(1); - } } /** @@ -108,21 +108,6 @@ this->loadTypes("items/types.txt"); this->loadSets("items/sets.txt"); this->loadQualities("items/qualities.txt"); - - /* - * Shrinks the items vector to the absolute needed size. - * - * While loading the items, the item vector grows dynamically. To have - * no much time overhead for reallocating the vector, a new reallocation - * is twice as large as the needed item id, which means in the worst case - * the item vector was reallocated for loading the last element, so the - * vector is twice as large as needed. This memory is definitly not used, - * so we can free it. - */ - if (items.capacity() != items.size()) - std::vector<Item>(items).swap(items); - if (item_sets.capacity() != item_sets.size()) - std::vector<ItemSet>(item_sets).swap(item_sets); if (items.empty()) Utils::logInfo("ItemManager: No items were found."); @@ -146,15 +131,18 @@ bool clear_loot_anim = true; bool clear_replace_power = true; - int id = 0; + ItemID id = 0; bool id_line = false; while (infile.next()) { if (infile.key == "id") { // @ATTR id|item_id|An uniq id of the item used as reference from other classes. id_line = true; - id = Parse::toInt(infile.val); - addUnknownItem(id); - items[id].max_quantity = 1; + id = Parse::toItemID(infile.val); + items[id] = Item(); + + // set the max quantity if it has not been done yet + if (items[id].max_quantity == INT_MAX) + items[id].max_quantity = 1; clear_req_stat = true; clear_bonus = true; @@ -168,8 +156,6 @@ continue; } if (id_line) continue; - - assert(items.size() > std::size_t(id)); if (infile.key == "name") { // @ATTR name|string|Item name displayed on long and short tooltips. @@ -279,7 +265,7 @@ else if (infile.key == "bonus_power_level") { // @ATTR bonus_power_level|repeatable(power_id, int) : Base power, Bonus levels|Grants bonus levels to a given base power. BonusData bdata; - bdata.power_id = Parse::popFirstInt(infile.val); + bdata.power_id = Parse::toPowerID(Parse::popFirstString(infile.val)); bdata.value = Parse::popFirstInt(infile.val); items[id].bonus.push_back(bdata); } @@ -316,7 +302,9 @@ items[id].replace_power.clear(); clear_replace_power = false; } - Point power_ids = Parse::toPoint(infile.val); + std::pair<PowerID, PowerID> power_ids; + power_ids.first = Parse::toPowerID(Parse::popFirstString(infile.val)); + power_ids.second = Parse::toPowerID(Parse::popFirstString(infile.val)); items[id].replace_power.push_back(power_ids); } else if (infile.key == "power_desc") @@ -351,8 +339,30 @@ } } else if (infile.key == "quest_item") { - // @ATTR quest_item|bool|If true, this item is a quest item and can not be dropped, stashed, or sold. + // @ATTR quest_item|bool|If true, this item is a quest item and can not be dropped or sold. The item also can't be stashed, unless the no_stash property is set to something other than "all". items[id].quest_item = Parse::toBool(infile.val); + + // for legacy reasons, quest items can't be stashed by default + if (items[id].no_stash == Item::NO_STASH_NULL) + items[id].no_stash = Item::NO_STASH_ALL; + } + else if (infile.key == "no_stash") { + // @ATTR no_stash|["ignore", "private", "shared", "all"]|If not set to 'ignore', this item will not be able to be put in the corresponding stash. + std::string temp = Parse::popFirstString(infile.val); + if (temp == "ignore") + items[id].no_stash = Item::NO_STASH_IGNORE; + else if (temp == "private") + items[id].no_stash = Item::NO_STASH_PRIVATE; + else if (temp == "shared") + items[id].no_stash = Item::NO_STASH_SHARED; + else if (temp == "all") + items[id].no_stash = Item::NO_STASH_ALL; + else + infile.error("ItemManager: '%s' is not a valid value for 'no_stash'. Use 'ignore', 'private', 'shared', or 'all'.", temp.c_str()); + } + else if (infile.key == "script") { + // @ATTR item.script|filename|Loads and executes a script file when the item is activated from the player's inventory. + items[id].script = Parse::popFirstString(infile.val); } else { infile.error("ItemManager: '%s' is not a valid key.", infile.key.c_str()); @@ -360,6 +370,14 @@ } infile.close(); + + // normal items can be stored in either stash + std::map<ItemID, Item>::iterator item_it; + for (item_it = items.begin(); item_it != items.end(); ++item_it) { + if (item_it->second.no_stash == Item::NO_STASH_NULL) { + item_it->second.no_stash = Item::NO_STASH_IGNORE; + } + } } /** @@ -452,9 +470,7 @@ } } -std::string ItemManager::getItemName(unsigned id) { - if (id >= items.size()) return msg->get("Unknown Item"); - +std::string ItemManager::getItemName(ItemID id) { if (!items[id].has_name) items[id].name = msg->get("Unknown Item"); @@ -470,10 +486,7 @@ return _type; } -Color ItemManager::getItemColor(unsigned id) { - if (id < 1 || id > items.size()) - return font->getColor(FontEngine::COLOR_WIDGET_NORMAL); - +Color ItemManager::getItemColor(ItemID id) { if (items[id].set > 0) { return item_sets[items[id].set].color; } @@ -489,9 +502,6 @@ } int ItemManager::getItemIconOverlay(size_t id) { - if (id < 1 || id > items.size()) - return -1; - for (size_t i=0; i < item_qualities.size(); ++i) { if (item_qualities[i].id == items[id].quality) { return item_qualities[i].overlay_icon; @@ -500,14 +510,6 @@ // no overlay icon return -1; -} - -void ItemManager::addUnknownItem(unsigned id) { - if (id > 0) { - size_t new_size = id+1; - if (items.size() <= new_size) - items.resize(new_size); - } } /** @@ -524,18 +526,16 @@ bool clear_bonus = true; - int id = 0; + ItemSetID id = 0; bool id_line; while (infile.next()) { if (infile.key == "id") { // @ATTR id|int|A uniq id for the item set. id_line = true; - id = Parse::toInt(infile.val); + id = Parse::toSizeT(infile.val); if (id > 0) { - size_t new_size = id+1; - if (item_sets.size() <= new_size) - item_sets.resize(new_size); + item_sets[id] = ItemSet(); } clear_bonus = true; @@ -547,8 +547,6 @@ continue; } if (id_line) continue; - - assert(item_sets.size() > std::size_t(id)); if (infile.key == "name") { // @ATTR name|string|Name of the item set. @@ -559,15 +557,9 @@ item_sets[id].items.clear(); std::string item_id = Parse::popFirstString(infile.val); while (item_id != "") { - int temp_id = Parse::toInt(item_id); - if (temp_id > 0 && temp_id < static_cast<int>(items.size())) { - items[temp_id].set = id; - item_sets[id].items.push_back(temp_id); - } - else { - const int maxsize = static_cast<int>(items.size()-1); - infile.error("ItemManager: Item index out of bounds 1-%d, skipping item.", maxsize); - } + ItemID temp_id = Parse::toItemID(item_id); + items[temp_id].set = id; + item_sets[id].items.push_back(temp_id); item_id = Parse::popFirstString(infile.val); } } @@ -590,7 +582,7 @@ // @ATTR bonus_power_level|repeatable(int, power_id, int) : Required set item count, Base power, Bonus levels|Grants bonus levels to a given base power. SetBonusData bonus; bonus.requirement = Parse::popFirstInt(infile.val); - bonus.power_id = Parse::popFirstInt(infile.val); + bonus.power_id = Parse::toPowerID(Parse::popFirstString(infile.val)); bonus.value = Parse::popFirstInt(infile.val); item_sets[id].bonus.push_back(bonus); } @@ -692,7 +684,7 @@ } } -void ItemManager::playSound(int item, const Point& pos) { +void ItemManager::playSound(ItemID item, const Point& pos) { std::stringstream channel_name; channel_name << "item_" << items[item].sfx_id; snd->play(items[item].sfx_id, channel_name.str(), FPoint(pos), false); @@ -857,6 +849,7 @@ // buy or sell price if (items[stack.item].getPrice() > 0 && stack.item != eset->misc.currency_id) { + Color currency_color = getItemColor(eset->misc.currency_id); int price_per_unit; if (context == VENDOR_BUY) { @@ -864,7 +857,7 @@ if (stats->currency < price_per_unit) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else - color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); + color = currency_color; if (items[stack.item].max_quantity <= 1) tip.addColoredText(msg->get("Buy Price: %d %s", price_per_unit, eset->loot.currency), color); @@ -876,7 +869,7 @@ if (stats->currency < price_per_unit) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else - color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); + color = currency_color; if (items[stack.item].max_quantity <= 1) tip.addColoredText(msg->get("Buy Price: %d %s", price_per_unit, eset->loot.currency), color); @@ -889,9 +882,9 @@ price_per_unit = 1; if (items[stack.item].max_quantity <= 1) - tip.addText(msg->get("Sell Price: %d %s", price_per_unit, eset->loot.currency)); - else - tip.addText(msg->get("Sell Price: %d %s each", price_per_unit, eset->loot.currency)); + tip.addColoredText(msg->get("Sell Price: %d %s", price_per_unit, eset->loot.currency), currency_color); + else + tip.addColoredText(msg->get("Sell Price: %d %s each", price_per_unit, eset->loot.currency), currency_color); } } @@ -918,15 +911,11 @@ // input hint for consumables/books // TODO hint when not using mouse control. The action for using an item there is hard to describe if (context == PLAYER_INV && !settings->no_mouse) { - int power_id = items[stack.item].power; - if (power_id > 0 && items[stack.item].type == "consumable") { + if (!items[stack.item].book.empty() && items[stack.item].book_is_readable) { + tip.addColoredText('\n' + msg->get("Press [%s] to read", inpt->getBindingString(Input::MAIN2)), font->getColor(FontEngine::COLOR_ITEM_BONUS)); + } + else if (menu->inv->canActivateItem(stack.item)) { tip.addColoredText('\n' + msg->get("Press [%s] to use", inpt->getBindingString(Input::MAIN2)), font->getColor(FontEngine::COLOR_ITEM_BONUS)); - } - else if (!items[stack.item].book.empty()) { - if (items[stack.item].book_is_readable) - tip.addColoredText('\n' + msg->get("Press [%s] to read", inpt->getBindingString(Input::MAIN2)), font->getColor(FontEngine::COLOR_ITEM_BONUS)); - else - tip.addColoredText('\n' + msg->get("Press [%s] to use", inpt->getBindingString(Input::MAIN2)), font->getColor(FontEngine::COLOR_ITEM_BONUS)); } } @@ -936,7 +925,7 @@ /** * Check requirements on an item */ -bool ItemManager::requirementsMet(const StatBlock *stats, int item) { +bool ItemManager::requirementsMet(const StatBlock *stats, ItemID item) { if (!stats) return false; // level @@ -1025,3 +1014,12 @@ return new_price; } +// Bonus documentation + +// @CLASS ItemManager|Description of "bonus" attribute in items/items.txt +// @TYPE speed|Movement speed. A value of 100 is 100% speed (aka normal speed). +// @TYPE attack_speed|Attack animation speed. A value of 100 is 100% speed (aka normal speed). +// @TYPE ${STATNAME}|Increases ${STATNAME}, where ${STATNAME} is any of the base stats. Examples: hp, avoidance, xp_gain +// @TYPE ${DAMAGE_TYPE}|Increases a damage min or max, where ${DAMAGE_TYPE} is any 'min' or 'max' value found in engine/damage_types.txt. Example: dmg_melee_min +// @TYPE ${ELEMENT}_resist|Increase Resistance % to ${ELEMENT}, where ${ELEMENT} is any found in engine/elements.txt. Example: fire_resist +// @TYPE ${PRIMARYSTAT}|Increases ${PRIMARYSTAT}, where ${PRIMARYSTAT} is any of the primary stats defined in engine/primary_stats.txt. Example: physical diff --git a/src/ItemManager.h b/src/ItemManager.h index 37b2c57..f133682 100644 --- a/src/ItemManager.h +++ b/src/ItemManager.h @@ -55,7 +55,7 @@ bool is_speed; bool is_attack_speed; int value; - int power_id; // for bonus_power_level + PowerID power_id; // for bonus_power_level BonusData() : stat_index(-1) , damage_index_min(-1) @@ -98,10 +98,18 @@ friend class ItemManager; public: + enum { + NO_STASH_NULL = 0, + NO_STASH_IGNORE = 1, + NO_STASH_PRIVATE = 2, + NO_STASH_SHARED = 3, + NO_STASH_ALL = 4 + }; + bool has_name; // flag that is set when the item name is parsed std::string flavor; // optional flavor text describing the item int level; // rough estimate of quality, used in the loot algorithm - int set; // item can be attached to item set + ItemSetID set; // item can be attached to item set std::string quality; // should match an id from items/qualities.txt std::string type; // equipment slot or base item type std::vector<std::string> equip_flags; // common values include: melee, ranged, mental, shield @@ -121,8 +129,8 @@ SoundID sfx_id; std::string gfx; // the sprite layer shown when this item is equipped std::vector<LootAnimation> loot_animation;// the flying loot animation for this item - int power; // this item can be dragged to the action bar and used as a power - std::vector<Point> replace_power; // alter powers when this item is equipped. Power id 'x' is replaced with id 'y' + PowerID power; // this item can be dragged to the action bar and used as a power + std::vector< std::pair<PowerID, PowerID> > replace_power; // alter powers when this item is equipped. The first PowerID is replaced with the second. std::string power_desc; // shows up in green text on the tooltip int price; // if price = 0 the item cannot be sold int price_per_level; // additional price for each character level above 1 @@ -132,6 +140,8 @@ std::string stepfx; // sound effect played when walking (armors only) std::vector<std::string> disable_slots; // if this item is equipped, it will disable slots that match the types in the list bool quest_item; + int no_stash; + std::string script; int getPrice(); int getSellPrice(bool is_new_buyback); @@ -144,7 +154,7 @@ class ItemSet { public: std::string name; // item set name displayed on long and short tool tips - std::vector<int> items; // items, included into set + std::vector<ItemID> items; // items, included into set std::vector<SetBonusData> bonus;// vector with stats to increase/decrease Color color; @@ -161,18 +171,21 @@ class ItemStack { public: - ItemStack() - : item(0) - , quantity(0) + ItemStack(ItemID _item = 0, int _quantity = 0) + : item(_item) + , quantity(_quantity) , can_buyback(false) { } ~ItemStack() {} - int item; + explicit ItemStack(const Point& _p); + bool operator > (const ItemStack ¶m) const; + + bool empty(); + void clear(); + + ItemID item; int quantity; bool can_buyback; - bool operator > (const ItemStack ¶m) const; - bool empty(); - void clear(); }; class ItemType { @@ -209,19 +222,18 @@ ItemManager(); ~ItemManager(); - void playSound(int item, const Point& pos = Point(0,0)); + void playSound(ItemID item, const Point& pos = Point(0,0)); TooltipData getTooltip(ItemStack stack, StatBlock *stats, int context); TooltipData getShortTooltip(ItemStack item); - std::string getItemName(unsigned id); + std::string getItemName(ItemID id); std::string getItemType(const std::string& _type); - Color getItemColor(unsigned id); + Color getItemColor(ItemID id); int getItemIconOverlay(size_t id); - void addUnknownItem(unsigned id); - bool requirementsMet(const StatBlock *stats, int item); - - std::vector<Item> items; + bool requirementsMet(const StatBlock *stats, ItemID item); + + std::map<ItemID, Item> items; std::vector<ItemType> item_types; - std::vector<ItemSet> item_sets; + std::map<ItemSetID, ItemSet> item_sets; std::vector<ItemQuality> item_qualities; }; diff --git a/src/ItemStorage.cpp b/src/ItemStorage.cpp index 35484f0..8298c82 100644 --- a/src/ItemStorage.cpp +++ b/src/ItemStorage.cpp @@ -59,15 +59,9 @@ void ItemStorage::setItems(const std::string& s) { std::string item_list = s + ','; for (int i=0; i<slot_number; i++) { - storage[i].item = Parse::popFirstInt(item_list); - // check if such item exists to avoid crash if savegame was modified manually - if (storage[i].item < 0) { - Utils::logError("ItemStorage: Item on position %d has negative id, skipping", i); - storage[i].clear(); - } - else if ((items->items.empty() && storage[i].item > 0) || static_cast<unsigned>(storage[i].item) > items->items.size()-1) { - Utils::logError("ItemStorage: Item id (%d) out of bounds 1-%d, marking as unknown", storage[i].item, static_cast<int>(items->items.size())); - items->addUnknownItem(storage[i].item); + storage[i].item = Parse::toItemID(Parse::popFirstString(item_list)); + if (storage[i].item > 0 && !items->items[storage[i].item].has_name) { + Utils::logError("ItemStorage: Item id (%d) has no name, marking as unknown", storage[i].item); } } } @@ -131,10 +125,6 @@ */ ItemStack ItemStorage::add( ItemStack stack, int slot) { if (!stack.empty()) { - if (items->items.empty() || stack.item <= 0 || static_cast<unsigned>(stack.item) > items->items.size()-1) { - items->addUnknownItem(stack.item); - } - int max_quantity = items->items[stack.item].max_quantity; if (slot > -1) { // a slot is specified @@ -199,7 +189,7 @@ /** * Remove a quantity of a given item by its ID */ -bool ItemStorage::remove(int item, int quantity) { +bool ItemStorage::remove(ItemID item, int quantity) { if (item == 0) return false; @@ -267,7 +257,7 @@ /** * Get the number of the specified item carried (not equipped) */ -int ItemStorage::count(int item) { +int ItemStorage::count(ItemID item) { int item_count=0; for (int i=0; i<slot_number; i++) { if (storage[i].item == item) { @@ -280,7 +270,7 @@ /** * Check to see if the given item is equipped */ -bool ItemStorage::contain(int item, int quantity) { +bool ItemStorage::contain(ItemID item, int quantity) { int total_quantity = 0; for (int i=0; i<slot_number; i++) { if (storage[i].item == item) diff --git a/src/ItemStorage.h b/src/ItemStorage.h index 845ff48..8f2b409 100644 --- a/src/ItemStorage.h +++ b/src/ItemStorage.h @@ -47,15 +47,15 @@ std::string getQuantities(); ItemStack add(ItemStack stack, int slot); void subtract(int slot, int quantity); - bool remove(int item, int quantity); + bool remove(ItemID item, int quantity); void sort(); void clear(); void clean(); bool empty(); bool full(ItemStack stack); - int count(int item); - bool contain(int item, int quantity); + int count(ItemID item); + bool contain(ItemID item, int quantity); ItemStack * storage; }; diff --git a/src/Loot.cpp b/src/Loot.cpp index 9a6bad9..4a8f6d5 100644 --- a/src/Loot.cpp +++ b/src/Loot.cpp @@ -22,10 +22,12 @@ #include "AnimationSet.h" #include "Loot.h" #include "SharedResources.h" +#include "WidgetTooltip.h" Loot::Loot() : gfx("") , animation(NULL) + , wtip(new WidgetTooltip()) , tip_visible(false) , dropped_by_hero(false) , on_ground(false) @@ -36,7 +38,9 @@ Loot::Loot(const Loot &other) : gfx("") , animation(NULL) + , wtip(NULL) { + // operator= creates a new animation and tooltip *this = other; } @@ -52,7 +56,7 @@ animation = NULL; loadAnimation(other.gfx); - if (animation) + if (animation && other.animation) animation->syncTo(other.animation); stack.item = other.stack.item; @@ -60,7 +64,7 @@ pos.x = other.pos.x; pos.y = other.pos.y; tip = other.tip; - tip_bounds = other.tip_bounds; + wtip = new WidgetTooltip(); tip_visible = other.tip_visible; dropped_by_hero = other.dropped_by_hero; on_ground = other.on_ground; @@ -89,5 +93,6 @@ if (gfx != "") anim->decreaseCount(gfx); delete animation; + delete wtip; } diff --git a/src/Loot.h b/src/Loot.h index 3ca37d5..6cb4536 100644 --- a/src/Loot.h +++ b/src/Loot.h @@ -24,6 +24,8 @@ #include "ItemManager.h" #include "TooltipData.h" +class WidgetTooltip; + class Loot { private: std::string gfx; @@ -33,7 +35,7 @@ FPoint pos; Animation *animation; TooltipData tip; - Rect tip_bounds; + WidgetTooltip *wtip; bool tip_visible; bool dropped_by_hero; bool on_ground; diff --git a/src/LootManager.cpp b/src/LootManager.cpp index 3a65e55..a05ab11 100644 --- a/src/LootManager.cpp +++ b/src/LootManager.cpp @@ -30,8 +30,8 @@ #include "Avatar.h" #include "CommonIncludes.h" #include "CursorManager.h" -#include "Enemy.h" -#include "EnemyManager.h" +#include "Entity.h" +#include "EntityManager.h" #include "EngineSettings.h" #include "FileParser.h" #include "InputState.h" @@ -45,6 +45,7 @@ #include "SharedResources.h" #include "SoundManager.h" #include "Utils.h" +#include "UtilsFileSystem.h" #include "UtilsMath.h" #include "UtilsParsing.h" #include "WidgetTooltip.h" @@ -53,8 +54,7 @@ #include <math.h> LootManager::LootManager() - : tip(new WidgetTooltip()) - , sfx_loot(snd->load(eset->loot.sfx_loot, "LootManager dropping loot")) + : sfx_loot(snd->load(eset->loot.sfx_loot, "LootManager dropping loot")) { loadGraphics(); loadLootTables(); @@ -65,23 +65,24 @@ * Here we load all the animations used by the item database. */ void LootManager::loadGraphics() { - animations.resize(items->items.size()); - // check all items in the item database - for (unsigned int i=0; i < items->items.size(); i++) { - if (items->items[i].loot_animation.empty()) continue; - - animations[i].resize(items->items[i].loot_animation.size()); - - for (unsigned int j=0; j<items->items[i].loot_animation.size(); j++) { - anim->increaseCount(items->items[i].loot_animation[j].name); - animations[i][j] = anim->getAnimationSet(items->items[i].loot_animation[j].name)->getAnimation(""); + std::map<ItemID, Item>::iterator item_it; + for (item_it = items->items.begin(); item_it != items->items.end(); ++item_it) { + if (item_it->second.loot_animation.empty()) + continue; + + animations[item_it->first].resize(item_it->second.loot_animation.size()); + + for (size_t i = 0; i < item_it->second.loot_animation.size(); ++i) { + anim->increaseCount(item_it->second.loot_animation[i].name); + animations[item_it->first][i] = anim->getAnimationSet(item_it->second.loot_animation[i].name)->getAnimation(""); } } } void LootManager::handleNewMap() { loot.clear(); + enemiesDroppingLoot.clear(); } void LootManager::logic() { @@ -91,7 +92,7 @@ // animate flying loot if (it->animation) { it->animation->advanceFrame(); - if (it->animation->isSecondLastFrame()) { + if (!it->on_ground && it->animation->isSecondLastFrame()) { it->on_ground = true; } } @@ -123,6 +124,7 @@ Point dest; bool tooltip_below = true; + Rect screen_rect(0, 0, settings->view_w, settings->view_h); std::vector<Loot>::iterator it; for (it = loot.begin(); it != loot.end(); ) { @@ -130,6 +132,11 @@ if (it->on_ground) { Point p = Utils::mapToScreen(it->pos.x, it->pos.y, cam.x, cam.y); + if (!Utils::isWithinRect(screen_rect, p)) { + ++it; + continue; + } + dest.x = p.x; dest.y = p.y + eset->tileset.tile_h_half; @@ -151,7 +158,7 @@ default_visibility = false; } else { - Enemy* test_enemy = enemym->getNearestEnemy(it->pos, !EnemyManager::GET_CORPSE, NULL, eset->loot.hide_radius); + Entity* test_enemy = entitym->getNearestEntity(it->pos, !EntityManager::GET_CORPSE, NULL, eset->loot.hide_radius); if (test_enemy) { default_visibility = false; } @@ -178,23 +185,22 @@ } // try to prevent tooltips from overlapping - tip->prerender(it->tip, dest, TooltipData::STYLE_TOPLABEL); + it->wtip->prerender(it->tip, dest, TooltipData::STYLE_TOPLABEL); std::vector<Loot>::iterator test_it; for (test_it = loot.begin(); test_it != it; ) { - if (test_it->tip_visible && Utils::rectsOverlap(test_it->tip_bounds, tip->bounds)) { + if (test_it->tip_visible && Utils::rectsOverlap(test_it->wtip->bounds, it->wtip->bounds)) { if (tooltip_below) - dest.y = test_it->tip_bounds.y + test_it->tip_bounds.h + eset->tooltips.offset; + dest.y = test_it->wtip->bounds.y + test_it->wtip->bounds.h + eset->tooltips.offset; else - dest.y = test_it->tip_bounds.y - test_it->tip_bounds.h + eset->tooltips.offset; - - tip->bounds.y = dest.y; + dest.y = test_it->wtip->bounds.y - test_it->wtip->bounds.h + eset->tooltips.offset; + + it->wtip->bounds.y = dest.y; } ++test_it; } - tip->render(it->tip, dest, TooltipData::STYLE_TOPLABEL); - it->tip_bounds = tip->bounds; + it->wtip->render(it->tip, dest, TooltipData::STYLE_TOPLABEL); if (settings->loot_tooltips == Settings::LOOT_TIPS_HIDE_ALL && !inpt->pressing[Input::ALT]) break; @@ -213,35 +219,38 @@ */ void LootManager::checkEnemiesForLoot() { for (unsigned i=0; i < enemiesDroppingLoot.size(); ++i) { - Enemy *e = enemiesDroppingLoot[i]; - - if (e->stats.quest_loot_id != 0) { + StatBlock *e = enemiesDroppingLoot[i]; + + if (!e) + continue; + + if (e->quest_loot_id != 0) { // quest loot std::vector<EventComponent> quest_loot_table; EventComponent ec; ec.type = EventComponent::LOOT; - ec.c = e->stats.quest_loot_id; + ec.id = e->quest_loot_id; ec.a = ec.b = 1; ec.z = 0; quest_loot_table.push_back(ec); - checkLoot(quest_loot_table, &e->stats.pos, NULL); - } - - if (!e->stats.loot_table.empty()) { + checkLoot(quest_loot_table, &e->pos, NULL); + } + + if (!e->loot_table.empty()) { unsigned drops; - if (e->stats.loot_count.y != 0) { - drops = Math::randBetween(e->stats.loot_count.x, e->stats.loot_count.y); + if (e->loot_count.y != 0) { + drops = Math::randBetween(e->loot_count.x, e->loot_count.y); } else { drops = Math::randBetween(1, eset->loot.drop_max); } for (unsigned j=0; j<drops; ++j) { - checkLoot(e->stats.loot_table, &e->stats.pos, NULL); - } - - e->stats.loot_table.clear(); + checkLoot(e->loot_table, &e->pos, NULL); + } + + e->loot_table.clear(); } } enemiesDroppingLoot.clear(); @@ -270,7 +279,7 @@ } } -void LootManager::addEnemyLoot(Enemy *e) { +void LootManager::addEnemyLoot(StatBlock *e) { enemiesDroppingLoot.push_back(e); } @@ -280,26 +289,26 @@ ItemStack new_loot; std::vector<EventComponent*> possible_ids; - int chance = Math::randBetween(1,100); + float chance = Math::randBetweenF(0,100); // first drop any 'fixed' (0% chance) items for (size_t i = loot_table.size(); i > 0; i--) { ec = &loot_table[i-1]; - if (ec->z == 0) { + if (ec->f == 0) { checkLootComponent(ec, pos, itemstack_vec); loot_table.erase(loot_table.begin()+i-1); } } // now pick up to 1 random item to drop - int threshold = pc->stats.get(Stats::ITEM_FIND) + 100; + float threshold = static_cast<float>(pc->stats.get(Stats::ITEM_FIND) + 100); for (unsigned i = 0; i < loot_table.size(); i++) { ec = &loot_table[i]; - int real_chance = ec->z; - - if (ec->c != 0 && ec->c != eset->misc.currency_id) { - real_chance = static_cast<int>(static_cast<float>(ec->z) * static_cast<float>(pc->stats.get(Stats::ITEM_FIND) + 100) / 100.f); + float real_chance = ec->f; + + if (ec->id != 0) { + real_chance = ec->f * static_cast<float>(pc->stats.get(Stats::ITEM_FIND) + 100) / 100.f; } if (real_chance >= chance) { @@ -326,17 +335,24 @@ } void LootManager::addLoot(ItemStack stack, const FPoint& pos, bool dropped_by_hero) { - if (static_cast<size_t>(stack.item) >= items->items.size()) { - Utils::logError("LootManager: Loot item with id %d is not valid.", stack.item); - return; - } - Loot ld; ld.stack = stack; ld.pos.x = pos.x; ld.pos.y = pos.y; ld.pos.align(); // prevent "rounding jitter" ld.dropped_by_hero = dropped_by_hero; + + // merge stacks that have the same item id and position + std::vector<Loot>::iterator it; + for (it = loot.end(); it != loot.begin(); ) { + --it; + if (it->stack.item == ld.stack.item && it->pos.x == ld.pos.x && it->pos.y == ld.pos.y) { + it->stack.quantity += ld.stack.quantity; + it->tip.clear(); + snd->play(sfx_loot, snd->DEFAULT_CHANNEL, pos, false); + return; + } + } if (!items->items[stack.item].loot_animation.empty()) { size_t index = items->items[stack.item].loot_animation.size()-1; @@ -387,7 +403,7 @@ r.w = eset->tileset.tile_w; r.h = eset->tileset.tile_h; - if (it_tip == loot.end() && it->tip_visible && Utils::isWithinRect(it->tip_bounds, mouse)) { + if (it_tip == loot.end() && it->tip_visible && Utils::isWithinRect(it->wtip->bounds, mouse)) { // clicked on a tooltip curs->setCursor(CursorManager::CURSOR_INTERACT); if (inpt->pressing[Input::MAIN1] && !inpt->lock[Input::MAIN1] && !it->stack.empty()) { @@ -502,9 +518,9 @@ e->s = Parse::popFirstString(val); if (e->s == "currency") - e->c = eset->misc.currency_id; + e->id = eset->misc.currency_id; else if (Parse::toInt(e->s, -1) != -1) - e->c = Parse::toInt(e->s); + e->id = Parse::toItemID(e->s); else if (ec_list) { // load entire loot table std::string filename = e->s; @@ -523,8 +539,8 @@ // drop chance chance = Parse::popFirstString(val); - if (chance == "fixed") e->z = 0; - else e->z = Parse::toInt(chance); + if (chance == "fixed") e->f = 0; + else e->f = Parse::toFloat(chance); // quantity min/max e->a = std::max(Parse::popFirstInt(val), 1); @@ -541,9 +557,9 @@ ec->s = repeat_val; if (ec->s == "currency") - ec->c = eset->misc.currency_id; + ec->id = eset->misc.currency_id; else if (Parse::toInt(ec->s, -1) != -1) - ec->c = Parse::toInt(ec->s); + ec->id = Parse::toItemID(ec->s); else { // remove the last event component, since getLootTable() will create a new one ec_list->pop_back(); @@ -555,8 +571,8 @@ } chance = Parse::popFirstString(val); - if (chance == "fixed") ec->z = 0; - else ec->z = Parse::toInt(chance); + if (chance == "fixed") ec->f = 0; + else ec->f = Parse::toFloat(chance); ec->a = std::max(Parse::popFirstInt(val), 1); ec->b = std::max(Parse::popFirstInt(val), ec->a); @@ -601,9 +617,9 @@ ec->s = infile.val; if (ec->s == "currency") - ec->c = eset->misc.currency_id; + ec->id = eset->misc.currency_id; else if (Parse::toInt(ec->s, -1) != -1) - ec->c = Parse::toInt(ec->s); + ec->id = Parse::toItemID(ec->s); else { skip_to_next = true; infile.error("LootManager: Invalid item id for loot."); @@ -611,9 +627,9 @@ } else if (infile.key == "chance") { if (infile.val == "fixed") - ec->z = 0; + ec->f = 0; else - ec->z = Parse::toInt(infile.val); + ec->f = Parse::toFloat(infile.val); } else if (infile.key == "quantity") { ec->a = std::max(Parse::popFirstInt(infile.val), 1); @@ -632,7 +648,7 @@ std::map<std::string, std::vector<EventComponent> >::iterator it; for (it = loot_tables.begin(); it != loot_tables.end(); ++it) { - if (it->first == filename) { + if (it->first == Filesystem::convertSlashes(filename)) { std::vector<EventComponent> *loot_defs = &it->second; for (unsigned i=0; i<loot_defs->size(); ++i) { ec_list->push_back((*loot_defs)[i]); @@ -675,12 +691,12 @@ new_loot.quantity = Math::randBetween(ec->a,ec->b); // an item id of 0 means we should drop currency instead - if (ec->c == 0 || ec->c == eset->misc.currency_id) { + if (ec->id == 0 || ec->id == eset->misc.currency_id) { new_loot.item = eset->misc.currency_id; new_loot.quantity = new_loot.quantity * (100 + pc->stats.get(Stats::CURRENCY_FIND)) / 100; } else { - new_loot.item = ec->c; + new_loot.item = ec->id; } if (itemstack_vec) @@ -689,14 +705,24 @@ addLoot(new_loot, p, !DROPPED_BY_HERO); } +void LootManager::removeFromEnemiesDroppingLoot(StatBlock* sb) { + for (size_t i = enemiesDroppingLoot.size(); i > 0; i--) { + // enemies will actually be removed the next time checkEnemiesForLoot() runs + if (enemiesDroppingLoot[i-1] == sb) + enemiesDroppingLoot[i-1] = NULL; + } +} + LootManager::~LootManager() { // remove all items in the item database - for (unsigned int i=0; i < items->items.size(); i++) { - if (items->items[i].loot_animation.empty()) continue; - - for (unsigned int j=0; j<items->items[i].loot_animation.size(); j++) { - anim->decreaseCount(items->items[i].loot_animation[j].name); - delete animations[i][j]; + std::map<ItemID, Item>::iterator item_it; + for (item_it = items->items.begin(); item_it != items->items.end(); ++item_it) { + if (item_it->second.loot_animation.empty()) + continue; + + for (size_t i = 0; i < item_it->second.loot_animation.size(); ++i) { + anim->decreaseCount(item_it->second.loot_animation[i].name); + delete animations[item_it->first][i]; } } @@ -706,6 +732,4 @@ anim->cleanUp(); snd->unload(sfx_loot); - - delete tip; -} +} diff --git a/src/LootManager.h b/src/LootManager.h index 236119d..81852d4 100644 --- a/src/LootManager.h +++ b/src/LootManager.h @@ -34,15 +34,11 @@ #include "Utils.h" class Animation; - class EnemyManager; -class WidgetTooltip; +class StatBlock; class LootManager { private: - - WidgetTooltip *tip; - // functions void loadGraphics(); void checkEnemiesForLoot(); @@ -57,7 +53,7 @@ std::vector<Loot> loot; // enemies which should drop loot, but didnt yet. - std::vector<class Enemy*> enemiesDroppingLoot; + std::vector<class StatBlock*> enemiesDroppingLoot; // loot tables defined in files under "loot/" std::map<std::string, std::vector<EventComponent> > loot_tables; @@ -66,7 +62,7 @@ // we block tiles that have loot dropped on them std::vector<Point> tiles_to_unblock; - std::vector< std::vector<Animation*> > animations; + std::map< size_t, std::vector<Animation*> > animations; public: static const bool DROPPED_BY_HERO = true; @@ -80,7 +76,7 @@ void renderTooltips(const FPoint& cam); // called by enemy, who definitly wants to drop loot. - void addEnemyLoot(Enemy *e); + void addEnemyLoot(StatBlock *e); void addLoot(ItemStack stack, const FPoint& pos, bool dropped_by_hero); void checkLoot(std::vector<EventComponent> &loot_table, FPoint *pos, std::vector<ItemStack> *itemstack_vec); ItemStack checkPickup(const Point& mouse, const FPoint& cam, const FPoint& hero_pos); @@ -90,6 +86,8 @@ void addRenders(std::vector<Renderable> &ren, std::vector<Renderable> &ren_dead); void parseLoot(std::string &val, EventComponent *e, std::vector<EventComponent> *ec_list); + + void removeFromEnemiesDroppingLoot(StatBlock* sb); }; #endif diff --git a/src/Map.cpp b/src/Map.cpp index 6183009..5e61b63 100644 --- a/src/Map.cpp +++ b/src/Map.cpp @@ -78,6 +78,8 @@ clearQueues(); music_filename = ""; + parallax_filename = ""; + background_color = Color(0,0,0,0); collision_layer = -1; w = 1; @@ -125,7 +127,7 @@ EventComponent *ec_power = events[i].getComponent(EventComponent::POWER); if (ec_power) { // store the index of this StatBlock so that we can find it when the event is activated - ec_power->y = addEventStatBlock(events[i]); + ec_power->x = addEventStatBlock(events[i]); } } @@ -395,10 +397,10 @@ if (ec_damage) { for (size_t i = 0; i < eset->damage_types.count; ++i) { if (i % 2 == 0) { - statb->starting[Stats::COUNT + i] = ec_damage->a; // min + statb->starting[Stats::COUNT + i] = ec_damage->x; // min } else { - statb->starting[Stats::COUNT + i] = ec_damage->b; // max + statb->starting[Stats::COUNT + i] = ec_damage->y; // max } } } @@ -412,7 +414,7 @@ // create a temporary EffectDef for immunity; will be used for map StatBlocks EffectDef immunity_effect; immunity_effect.id = "MAP_EVENT_IMMUNITY"; - immunity_effect.type = "immunity"; + immunity_effect.type = Effect::IMMUNITY; statb->effects.addEffect(immunity_effect, 0, 0, Power::SOURCE_TYPE_ENEMY, EffectManager::NO_POWER); // ensure the statblock will be alive diff --git a/src/Map.h b/src/Map.h index d441347..b6cedae 100644 --- a/src/Map.h +++ b/src/Map.h @@ -95,7 +95,7 @@ int wander_radius; bool hero_ally; bool enemy_ally; - int summon_power_index; + PowerID summon_power_index; StatBlock* summoner; std::vector<StatusID> requires_status; std::vector<StatusID> requires_not_status; diff --git a/src/MapCollision.cpp b/src/MapCollision.cpp index e18263f..73848bc 100644 --- a/src/MapCollision.cpp +++ b/src/MapCollision.cpp @@ -517,7 +517,9 @@ const int tile_x = int(map_x); const int tile_y = int(map_y); - if (colmap[tile_x][tile_y] == BLOCKS_ENTITIES || colmap[tile_x][tile_y] == BLOCKS_ENEMIES) { + if (colmap[tile_x][tile_y] == BLOCKS_ENTITIES || colmap[tile_x][tile_y] == BLOCKS_ENEMIES || + // TODO: check this logic + colmap[tile_x][tile_y] == BLOCKS_MOVEMENT_HIDDEN) { colmap[tile_x][tile_y] = BLOCKS_NONE; } diff --git a/src/MapParallax.cpp b/src/MapParallax.cpp index 890ecbe..4f668fe 100644 --- a/src/MapParallax.cpp +++ b/src/MapParallax.cpp @@ -27,6 +27,8 @@ MapParallax::MapParallax() : current_layer(0) + , loaded(false) + , current_filename("") { } @@ -40,13 +42,18 @@ } layers.clear(); + + loaded = false; } void MapParallax::load(const std::string& filename) { + current_filename = filename; + + if (loaded) + clear(); + if (!settings->parallax_layers) return; - - clear(); // @CLASS MapParallax|Description of maps/parallax/ FileParser infile; @@ -84,6 +91,8 @@ infile.close(); } + + loaded = true; } void MapParallax::setMapCenter(int x, int y) { @@ -92,8 +101,15 @@ } void MapParallax::render(const FPoint& cam, const std::string& map_layer) { - if (!settings->parallax_layers) + if (!settings->parallax_layers) { + if (loaded) + clear(); + return; + } + else if (!loaded) { + load(current_filename); + } if (map_layer.empty()) current_layer = 0; diff --git a/src/MapParallax.h b/src/MapParallax.h index 47ea6f2..6642869 100644 --- a/src/MapParallax.h +++ b/src/MapParallax.h @@ -52,6 +52,8 @@ std::vector<MapParallaxLayer> layers; FPoint map_center; size_t current_layer; + bool loaded; + std::string current_filename; }; #endif diff --git a/src/MapRenderer.cpp b/src/MapRenderer.cpp index 73d6eb1..0cf3fe2 100644 --- a/src/MapRenderer.cpp +++ b/src/MapRenderer.cpp @@ -20,13 +20,14 @@ */ #include "Avatar.h" +#include "Camera.h" #include "CampaignManager.h" #include "CombatText.h" #include "CommonIncludes.h" #include "CursorManager.h" -#include "Enemy.h" #include "EnemyGroupManager.h" -#include "EnemyManager.h" +#include "Entity.h" +#include "EntityManager.h" #include "EngineSettings.h" #include "EventManager.h" #include "Hazard.h" @@ -56,7 +57,6 @@ , tip(new WidgetTooltip()) , tip_pos() , show_tooltip(false) - , shakycam() , entity_hidden_normal(NULL) , entity_hidden_enemy(NULL) , cam() @@ -66,7 +66,6 @@ , respawn_point() , cutscene(false) , cutscene_file("") - , shaky_cam_timer() , stash(false) , stash_pos() , enemies_cleared(false) @@ -74,6 +73,7 @@ , npc_id(-1) , show_book("") , index_objectlayer(0) + , is_spawn_map(false) { // Load entity markers Image *gfx = render_device->loadImage("images/menus/entity_hidden.png", RenderDevice::ERROR_NORMAL); @@ -196,10 +196,7 @@ comb->clear(); show_tooltip = false; - - parallax_filename = ""; - - background_color = Color(0,0,0,0); + is_spawn_map = (fname == "maps/spawn.txt"); Map::load(fname); @@ -251,8 +248,7 @@ } } - map_parallax.load(parallax_filename); - map_parallax.setMapCenter(w/2, h/2); + setMapParallax(parallax_filename); render_device->setBackgroundColor(background_color); @@ -281,22 +277,11 @@ if (paused) return; - // handle camera shaking timer - shaky_cam_timer.tick(); - - if (shaky_cam_timer.isEnd()) { - shakycam.x = cam.x; - shakycam.y = cam.y; - } - else { - shakycam.x = cam.x + static_cast<float>((rand() % 16 - 8)) * 0.0078125f; - shakycam.y = cam.y + static_cast<float>((rand() % 16 - 8)) * 0.0078125f; - } - - // handle statblock logic for map powers for (unsigned i=0; i<statblocks.size(); ++i) { - statblocks[i].logic(); + for (size_t j=0; j<statblocks[i].powers_ai.size(); ++j) { + statblocks[i].powers_ai[j].cooldown.tick(); + } } // handle event cooldowns @@ -319,6 +304,8 @@ it = delayed_events.erase(it); } } + + cam.logic(); } bool priocompare(const Renderable &r1, const Renderable &r2) { @@ -350,7 +337,7 @@ void MapRenderer::render(std::vector<Renderable> &r, std::vector<Renderable> &r_dead) { - map_parallax.render(shakycam, ""); + map_parallax.render(cam.shake, ""); if (eset->tileset.orientation == eset->tileset.TILESET_ORTHOGONAL) { calculatePriosOrtho(r); @@ -373,7 +360,7 @@ void MapRenderer::drawRenderable(std::vector<Renderable>::iterator r_cursor) { if (r_cursor->image != NULL) { Rect dest; - Point p = Utils::mapToScreen(r_cursor->map_pos.x, r_cursor->map_pos.y, shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(r_cursor->map_pos.x, r_cursor->map_pos.y, cam.shake.x, cam.shake.y); dest.x = p.x - r_cursor->offset.x; dest.y = p.y - r_cursor->offset.y; render_device->render(*r_cursor, dest); @@ -384,7 +371,7 @@ int_fast16_t i; // first index of the map array int_fast16_t j; // second index of the map array Point dest; - const Point upperleft(Utils::screenToMap(0, 0, shakycam.x, shakycam.y)); + const Point upperleft(Utils::screenToMap(0, 0, cam.shake.x, cam.shake.y)); const int_fast16_t max_tiles_width = static_cast<int_fast16_t>((settings->view_w / eset->tileset.tile_w) + 2*tset.max_size_x); const int_fast16_t max_tiles_height = static_cast<int_fast16_t>((2 * settings->view_h / eset->tileset.tile_h) + 2*(tset.max_size_y+1)); @@ -413,7 +400,7 @@ // lower left (south west) corner is caught by having 0 in there, so j>0 const int_fast16_t j_end = std::max(static_cast<int_fast16_t>(j+i-w+1), std::max(static_cast<int_fast16_t>(j - max_tiles_width), static_cast<int_fast16_t>(0))); - Point p = Utils::mapToScreen(float(i), float(j), shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(float(i), float(j), cam.shake.x, cam.shake.y); p = centerTile(p); // draw one horizontal line @@ -452,7 +439,7 @@ void MapRenderer::renderIsoFrontObjects(std::vector<Renderable> &r) { Point dest; - const Point upperleft(Utils::screenToMap(0, 0, shakycam.x, shakycam.y)); + const Point upperleft(Utils::screenToMap(0, 0, cam.shake.x, cam.shake.y)); const int_fast16_t max_tiles_width = static_cast<int_fast16_t>((settings->view_w / eset->tileset.tile_w) + 2 * tset.max_size_x); const int_fast16_t max_tiles_height = static_cast<int_fast16_t>(((settings->view_h / eset->tileset.tile_h) + 2 * tset.max_size_y)*2); @@ -493,7 +480,7 @@ const int_fast16_t j_end = std::max(static_cast<int_fast16_t>(j+i-w+1), std::max(static_cast<int_fast16_t>(j - max_tiles_width), static_cast<int_fast16_t>(0))); // draw one horizontal line - Point p = Utils::mapToScreen(float(i), float(j), shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(float(i), float(j), cam.shake.x, cam.shake.y); p = centerTile(p); const Map_Layer ¤t_layer = layers[index_objectlayer]; bool is_last_NE_tile = false; @@ -563,7 +550,7 @@ draw_NE_tile = !is_last_NE_tile; // r_cursor left/right side - Point r_cursor_left = Utils::mapToScreen(r_cursor->map_pos.x, r_cursor->map_pos.y, shakycam.x, shakycam.y); + Point r_cursor_left = Utils::mapToScreen(r_cursor->map_pos.x, r_cursor->map_pos.y, cam.shake.x, cam.shake.y); r_cursor_left.y -= r_cursor->offset.y; Point r_cursor_right = r_cursor_left; r_cursor_left.x -= r_cursor->offset.x; @@ -668,18 +655,18 @@ size_t index = 0; while (index < index_objectlayer) { renderIsoLayer(layers[index]); - map_parallax.render(shakycam, layernames[index]); + map_parallax.render(cam.shake, layernames[index]); index++; } renderIsoBackObjects(r_dead); renderIsoFrontObjects(r); - map_parallax.render(shakycam, layernames[index]); + map_parallax.render(cam.shake, layernames[index]); index++; while (index < layers.size()) { renderIsoLayer(layers[index]); - map_parallax.render(shakycam, layernames[index]); + map_parallax.render(cam.shake, layernames[index]); index++; } @@ -692,7 +679,7 @@ void MapRenderer::renderOrthoLayer(const Map_Layer& layerdata) { Point dest; - const Point upperleft(Utils::screenToMap(0, 0, shakycam.x, shakycam.y)); + const Point upperleft(Utils::screenToMap(0, 0, cam.shake.x, cam.shake.y)); short int startj = static_cast<short int>(std::max(0, upperleft.y)); short int starti = static_cast<short int>(std::max(0, upperleft.x)); @@ -703,7 +690,7 @@ short int j; for (j = startj; j < max_tiles_height; j++) { - Point p = Utils::mapToScreen(starti, j, shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(starti, j, cam.shake.x, cam.shake.y); p = centerTile(p); for (i = starti; i < max_tiles_width; i++) { @@ -734,7 +721,7 @@ std::vector<Renderable>::iterator r_cursor = r.begin(); std::vector<Renderable>::iterator r_end = r.end(); - const Point upperleft(Utils::screenToMap(0, 0, shakycam.x, shakycam.y)); + const Point upperleft(Utils::screenToMap(0, 0, cam.shake.x, cam.shake.y)); short int startj = static_cast<short int>(std::max(0, upperleft.y)); short int starti = static_cast<short int>(std::max(0, upperleft.x)); @@ -748,7 +735,7 @@ return; for (j = startj; j < max_tiles_height; j++) { - Point p = Utils::mapToScreen(starti, j, shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(starti, j, cam.shake.x, cam.shake.y); p = centerTile(p); for (i = starti; i<max_tiles_width; i++) { @@ -778,18 +765,18 @@ unsigned index = 0; while (index < index_objectlayer) { renderOrthoLayer(layers[index]); - map_parallax.render(shakycam, layernames[index]); + map_parallax.render(cam.shake, layernames[index]); index++; } renderOrthoBackObjects(r_dead); renderOrthoFrontObjects(r); - map_parallax.render(shakycam, layernames[index]); + map_parallax.render(cam.shake, layernames[index]); index++; while (index < layers.size()) { renderOrthoLayer(layers[index]); - map_parallax.render(shakycam, layernames[index]); + map_parallax.render(cam.shake, layernames[index]); index++; } @@ -829,6 +816,21 @@ it = events.erase(it); } } + + // Also check static events, as they should execute alongside on_load events + // Yet, this should be done *after* the on_load events to not break old behavior. + // That's why we don't just check static events in the above loop + for (it = events.end(); it != events.begin(); ) { + --it; + + // skip inactive events + if (!EventManager::isActive(*it)) continue; + + if ((*it).activate_type == Event::ACTIVATE_STATIC) { + if (EventManager::executeEvent(*it)) + it = events.erase(it); + } + } } void MapRenderer::executeOnMapExitEvents() { @@ -894,7 +896,7 @@ } } } - else if ((*it).activate_type == -1 || (*it).activate_type == Event::ACTIVATE_ON_TRIGGER) { + else if ((*it).activate_type == Event::ACTIVATE_ON_TRIGGER) { if (inside) if (EventManager::executeEvent(*it)) it = events.erase(it); @@ -923,16 +925,26 @@ for (it = events.end(); it != events.begin(); ) { --it; + // skip inactive events + if (!EventManager::isActive(*it)) continue; + + // skip events without hotspots + if (it->hotspot.h == 0) continue; + + // skip events on cooldown + if (!it->cooldown.isEnd() || !it->delay.isEnd()) continue; + + EventComponent* npc = (*it).getComponent(EventComponent::NPC_HOTSPOT); + for (int x=it->hotspot.x; x < it->hotspot.x + it->hotspot.w; ++x) { for (int y=it->hotspot.y; y < it->hotspot.y + it->hotspot.h; ++y) { bool matched = false; bool is_npc = false; - EventComponent* npc = (*it).getComponent(EventComponent::NPC_HOTSPOT); if (npc) { is_npc = true; - Point p = Utils::mapToScreen(float(npc->x), float(npc->y), shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(float(npc->x), float(npc->y), cam.shake.x, cam.shake.y); p = centerTile(p); Rect dest; @@ -949,7 +961,7 @@ } else { for (unsigned index = 0; index <= index_objectlayer; ++index) { - Point p = Utils::mapToScreen(float(x), float(y), shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(float(x), float(y), cam.shake.x, cam.shake.y); p = centerTile(p); if (const short current_tile = layers[index][x][y]) { @@ -963,7 +975,7 @@ if (Utils::isWithinRect(dest, inpt->mouse)) { matched = true; - tip_pos = Utils::mapToScreen(it->center.x, it->center.y, shakycam.x, shakycam.y); + tip_pos = Utils::mapToScreen(it->center.x, it->center.y, cam.shake.x, cam.shake.y); tip_pos.y -= eset->tileset.tile_h; } } @@ -971,20 +983,11 @@ } if (matched) { - // skip inactive events - if (!EventManager::isActive(*it)) continue; - - // skip events without hotspots - if (it->hotspot.h == 0) continue; - - // skip events on cooldown - if (!it->cooldown.isEnd() || !it->delay.isEnd()) continue; - // new tooltip? createTooltip(it->getComponent(EventComponent::TOOLTIP)); - if (((it->reachable_from.w == 0 && it->reachable_from.h == 0) || Utils::isWithinRect(it->reachable_from, Point(cam))) - && Utils::calcDist(cam, it->center) < eset->misc.interact_range) { + if (((it->reachable_from.w == 0 && it->reachable_from.h == 0) || Utils::isWithinRect(it->reachable_from, Point(cam.pos))) + && Utils::calcDist(pc->stats.pos, it->center) < eset->misc.interact_range) { // only check events if the player is clicking // and allowed to click @@ -1030,8 +1033,8 @@ // skip events on cooldown if (!it->cooldown.isEnd() || !it->delay.isEnd()) continue; - float distance = Utils::calcDist(cam, it->center); - if (((it->reachable_from.w == 0 && it->reachable_from.h == 0) || Utils::isWithinRect(it->reachable_from, Point(cam))) + float distance = Utils::calcDist(pc->stats.pos, it->center); + if (((it->reachable_from.w == 0 && it->reachable_from.h == 0) || Utils::isWithinRect(it->reachable_from, Point(cam.pos))) && distance < eset->misc.interact_range && distance < best_distance) { best_distance = distance; nearest = it; @@ -1043,7 +1046,7 @@ if (!inpt->usingMouse() || settings->touchscreen) { // new tooltip? createTooltip(nearest->getComponent(EventComponent::TOOLTIP)); - tip_pos = Utils::mapToScreen(nearest->center.x, nearest->center.y, shakycam.x, shakycam.y); + tip_pos = Utils::mapToScreen(nearest->center.x, nearest->center.y, cam.shake.x, cam.shake.y); if (nearest->getComponent(EventComponent::NPC_HOTSPOT)) { tip_pos.y -= eset->tooltips.margin_npc; } @@ -1083,9 +1086,9 @@ /** * Activate a power that is attached to an event */ -void MapRenderer::activatePower(int power_index, unsigned statblock_index, FPoint &target) { - if (power_index < 0 || static_cast<unsigned>(power_index) >= powers->powers.size()) { - Utils::logError("MapRenderer: Power index is out of bounds."); +void MapRenderer::activatePower(PowerID power_index, unsigned statblock_index, FPoint &target) { + if (powers->powers[power_index].is_empty) { + Utils::logError("MapRenderer: Power index %d is not valid.", power_index); return; } @@ -1129,7 +1132,7 @@ const Tile_Def &tile = tset.tiles[tile_index]; if (!tile.tile) return; - center = centerTile(Utils::mapToScreen(float(x), float(y), shakycam.x, shakycam.y)); + center = centerTile(Utils::mapToScreen(float(x), float(y), cam.shake.x, cam.shake.y)); bounds.x = center.x - tile.offset.x; bounds.y = center.y - tile.offset.y; bounds.w = tile.tile->getClip().w; @@ -1144,17 +1147,17 @@ return; Color dev_cursor_color = Color(255,255,0,255); - FPoint target = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, shakycam.x, shakycam.y); + FPoint target = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, cam.shake.x, cam.shake.y); if (!collider.isOutsideMap(floorf(target.x), floorf(target.y))) { if (eset->tileset.orientation == eset->tileset.TILESET_ORTHOGONAL) { - Point p_topleft = Utils::mapToScreen(floorf(target.x), floorf(target.y), shakycam.x, shakycam.y); + Point p_topleft = Utils::mapToScreen(floorf(target.x), floorf(target.y), cam.shake.x, cam.shake.y); Point p_bottomright(p_topleft.x + eset->tileset.tile_w, p_topleft.y + eset->tileset.tile_h); render_device->drawRectangle(p_topleft, p_bottomright, dev_cursor_color); } else { - Point p_left = Utils::mapToScreen(floorf(target.x), floorf(target.y+1), shakycam.x, shakycam.y); + Point p_left = Utils::mapToScreen(floorf(target.x), floorf(target.y+1), cam.shake.x, cam.shake.y); Point p_top(p_left.x + eset->tileset.tile_w_half, p_left.y - eset->tileset.tile_h_half); Point p_right(p_left.x + eset->tileset.tile_w, p_left.y); Point p_bottom(p_left.x + eset->tileset.tile_w_half, p_left.y + eset->tileset.tile_h_half); @@ -1167,8 +1170,8 @@ // draw distance line if (menu->devconsole->distance_timer.isEnd()) { - Point p0 = Utils::mapToScreen(menu->devconsole->target.x, menu->devconsole->target.y, shakycam.x, shakycam.y); - Point p1 = Utils::mapToScreen(pc->stats.pos.x, pc->stats.pos.y, shakycam.x, shakycam.y); + Point p0 = Utils::mapToScreen(menu->devconsole->target.x, menu->devconsole->target.y, cam.shake.x, cam.shake.y); + Point p1 = Utils::mapToScreen(pc->stats.pos.x, pc->stats.pos.y, cam.shake.x, cam.shake.y); render_device->drawLine(p0.x, p0.y, p1.x, p1.y, dev_cursor_color); } } @@ -1180,21 +1183,29 @@ Color color_hazard(255,0,0,255); Color color_entity(0,255,0,255); + Color color_cam(255,255,0,255); int cross_size = eset->tileset.tile_h_half / 4; // ellipses are distorted for isometric tilesets - int distort = eset->tileset.orientation == eset->tileset.TILESET_ORTHOGONAL ? 0 : 2; + int distort = eset->tileset.orientation == eset->tileset.TILESET_ORTHOGONAL ? 1 : 2; + + // camera + { + Point p0 = Utils::mapToScreen(cam.pos.x, cam.pos.y, cam.shake.x, cam.shake.y); + render_device->drawLine(p0.x - cross_size, p0.y, p0.x + cross_size, p0.y, color_cam); + render_device->drawLine(p0.x, p0.y - cross_size, p0.x, p0.y + cross_size, color_cam); + } // player { - Point p0 = Utils::mapToScreen(pc->stats.pos.x, pc->stats.pos.y, shakycam.x, shakycam.y); + Point p0 = Utils::mapToScreen(pc->stats.pos.x, pc->stats.pos.y, cam.shake.x, cam.shake.y); render_device->drawLine(p0.x - cross_size, p0.y, p0.x + cross_size, p0.y, color_entity); render_device->drawLine(p0.x, p0.y - cross_size, p0.x, p0.y + cross_size, color_entity); } // enemies - for (size_t i = 0; i < enemym->enemies.size(); ++i) { - Point p0 = Utils::mapToScreen(enemym->enemies[i]->stats.pos.x, enemym->enemies[i]->stats.pos.y, shakycam.x, shakycam.y); + for (size_t i = 0; i < entitym->entities.size(); ++i) { + Point p0 = Utils::mapToScreen(entitym->entities[i]->stats.pos.x, entitym->entities[i]->stats.pos.y, cam.shake.x, cam.shake.y); render_device->drawLine(p0.x - cross_size, p0.y, p0.x + cross_size, p0.y, color_entity); render_device->drawLine(p0.x, p0.y - cross_size, p0.x, p0.y + cross_size, color_entity); } @@ -1204,9 +1215,8 @@ if (hazards->h[i]->delay_frames != 0) continue; - float radius_c = sqrtf(powf(hazards->h[i]->power->radius, 2) + powf(hazards->h[i]->power->radius, 2)); - Point p0 = Utils::mapToScreen(hazards->h[i]->pos.x, hazards->h[i]->pos.y, shakycam.x, shakycam.y); - Point p1 = Utils::mapToScreen(hazards->h[i]->pos.x + radius_c, hazards->h[i]->pos.y, shakycam.x, shakycam.y); + Point p0 = Utils::mapToScreen(hazards->h[i]->pos.x, hazards->h[i]->pos.y, cam.shake.x, cam.shake.y); + Point p1 = Utils::mapToScreen(hazards->h[i]->pos.x + hazards->h[i]->power->radius, hazards->h[i]->pos.y, cam.shake.x, cam.shake.y); int radius = p1.x - p0.x; render_device->drawLine(p0.x - cross_size, p0.y, p0.x + cross_size, p0.y, color_hazard); render_device->drawLine(p0.x, p0.y - cross_size, p0.x, p0.y + cross_size, color_hazard); @@ -1216,6 +1226,9 @@ } void MapRenderer::drawHiddenEntityMarkers() { + if (!settings->entity_markers) + return; + std::vector<std::vector<Renderable>::iterator>::iterator hero_it = hidden_entities.end(); Point hidden_hero_pos(0, settings->view_h); @@ -1230,7 +1243,7 @@ continue; Point dest; - Point p = Utils::mapToScreen(hidden_entities[i]->map_pos.x, hidden_entities[i]->map_pos.y, shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(hidden_entities[i]->map_pos.x, hidden_entities[i]->map_pos.y, cam.shake.x, cam.shake.y); dest.x = p.x - marker_w / 2; dest.y = p.y - hidden_entities[i]->offset.y - marker_h; @@ -1264,6 +1277,9 @@ } void MapRenderer::checkHiddenEntities(const int_fast16_t x, const int_fast16_t y, const Map_Layer& layerdata, std::vector<Renderable> &r) { + if (!settings->entity_markers) + return; + Rect tile_bounds; Point tile_center; getTileBounds(x, y, layerdata, tile_bounds, tile_center); @@ -1297,7 +1313,7 @@ is_hidden = true; } else if (it->type != Renderable::TYPE_NORMAL) { - Point p = Utils::mapToScreen(it->map_pos.x, it->map_pos.y, shakycam.x, shakycam.y); + Point p = Utils::mapToScreen(it->map_pos.x, it->map_pos.y, cam.shake.x, cam.shake.y); p.x -= it->offset.x; if (Utils::isWithinRect(tile_bounds, p)) { is_hidden = true; @@ -1330,6 +1346,12 @@ ++it; } } + +void MapRenderer::setMapParallax(const std::string& mp_filename) { + map_parallax.load(mp_filename); + map_parallax.setMapCenter(w/2, h/2); +} + MapRenderer::~MapRenderer() { tip_buf.clear(); clearLayers(); diff --git a/src/MapRenderer.h b/src/MapRenderer.h index d6044b4..99d4482 100644 --- a/src/MapRenderer.h +++ b/src/MapRenderer.h @@ -28,6 +28,7 @@ #ifndef MAP_RENDERER_H #define MAP_RENDERER_H +#include "Camera.h" #include "CommonIncludes.h" #include "Map.h" #include "MapCollision.h" @@ -82,7 +83,6 @@ void checkHiddenEntities(const int_fast16_t x, const int_fast16_t y, const Map_Layer& layerdata, std::vector<Renderable> &r); - FPoint shakycam; TileSet tset; MapParallax map_parallax; @@ -115,13 +115,15 @@ void executeOnMapExitEvents(); // some events can trigger powers - void activatePower(int power_index, unsigned statblock_index, FPoint &target); + void activatePower(PowerID power_index, unsigned statblock_index, FPoint &target); bool isValidTile(const unsigned &tile); Point centerTile(const Point& p); - // cam(x,y) is where on the map the camera is pointing - FPoint cam; + void setMapParallax(const std::string& mp_filename); + + // cam is where on the map the camera is pointing + Camera cam; // indicates that the map was changed by an event, so the GameStatePlay // will tell the mini map to update. @@ -143,9 +145,6 @@ // cutscene handling bool cutscene; std::string cutscene_file; - - // shaky cam - Timer shaky_cam_timer; // stash handling bool stash; @@ -176,6 +175,9 @@ * before that are painted below objects; Layers after are painted on top. */ unsigned index_objectlayer; + + // flag used to prevent rendering when in maps/spawn.txt + bool is_spawn_map; }; diff --git a/src/MenuActionBar.cpp b/src/MenuActionBar.cpp index 30ac451..e2801d5 100644 --- a/src/MenuActionBar.cpp +++ b/src/MenuActionBar.cpp @@ -30,10 +30,12 @@ #include "EngineSettings.h" #include "FileParser.h" #include "FontEngine.h" +#include "MapRenderer.h" #include "Menu.h" #include "MenuActionBar.h" #include "MenuInventory.h" #include "MenuManager.h" +#include "MenuPowers.h" #include "MenuTouchControls.h" #include "MessageEngine.h" #include "Platform.h" @@ -56,6 +58,7 @@ , sprite_disabled(NULL) , sprite_attention(NULL) , sfx_unable_to_cast(0) + , tooltip_length(MenuPowers::TOOLTIP_LONG_MENU) , slots_count(0) , drag_prev_slot(-1) , updated(false) @@ -68,10 +71,8 @@ tablist.setInputs(Input::ACTIONBAR_BACK, Input::ACTIONBAR_FORWARD, Input::ACTIONBAR); for (unsigned i=0; i<MENU_COUNT; i++) { - if (i < MENU_LOOT_TIPS) - menus[i] = new WidgetSlot(-1, Input::ACTIONBAR, WidgetSlot::SIZE_NORMAL); - else - menus[i] = new WidgetSlot(-1, Input::ACTIONBAR, WidgetSlot::SIZE_SMALL); + menus[i] = new WidgetSlot(-1, Input::ACTIONBAR); + menus[i]->setHotkey(Input::CHARACTER + i); // NOTE: This prevents these buttons from being clickable unless they get defined in the config file. // However, it doesn't prevent them from being added to the tablist, so they can still be activated there despite being invisible @@ -84,10 +85,6 @@ menu_titles[MENU_INVENTORY] = msg->get("Inventory"); menu_titles[MENU_POWERS] = msg->get("Powers"); menu_titles[MENU_LOG] = msg->get("Log"); - menu_titles[MENU_LOOT_TIPS] = msg->get("Loot tooltip visibility"); - menu_titles[MENU_MINIMAP_MODE] = msg->get("Mini-map mode"); - menu_titles[MENU_STATBARS_LABELS] = msg->get("Always show stat bar labels"); - menu_titles[MENU_COMBAT_TEXT] = msg->get("Show combat text"); // Read data from config file FileParser infile; @@ -157,33 +154,16 @@ menus[MENU_LOG]->setBasePos(x, y, Utils::ALIGN_TOPLEFT); menus[MENU_LOG]->pos.w = menus[MENU_LOG]->pos.h = eset->resolutions.icon_size; } - // @ATTR loot_tip_toggle|point|Position for the button used to toggle loot tooltip visibility. - else if (infile.key == "loot_tip_toggle") { - int x = Parse::popFirstInt(infile.val); - int y = Parse::popFirstInt(infile.val); - menus[MENU_LOOT_TIPS]->setBasePos(x, y, Utils::ALIGN_TOPLEFT); - menus[MENU_LOOT_TIPS]->pos.w = menus[MENU_LOOT_TIPS]->pos.h = eset->resolutions.icon_size / 2; // small - } - // @ATTR minimap_mode_toggle|point|Position for the button used to toggle the mini-map mode. - else if (infile.key == "minimap_mode_toggle") { - int x = Parse::popFirstInt(infile.val); - int y = Parse::popFirstInt(infile.val); - menus[MENU_MINIMAP_MODE]->setBasePos(x, y, Utils::ALIGN_TOPLEFT); - menus[MENU_MINIMAP_MODE]->pos.w = menus[MENU_MINIMAP_MODE]->pos.h = eset->resolutions.icon_size / 2; // small - } - // @ATTR statbar_label_toggle|point|Position for the button used to toggle always showing the statbar labels. - else if (infile.key == "statbar_label_toggle") { - int x = Parse::popFirstInt(infile.val); - int y = Parse::popFirstInt(infile.val); - menus[MENU_STATBARS_LABELS]->setBasePos(x, y, Utils::ALIGN_TOPLEFT); - menus[MENU_STATBARS_LABELS]->pos.w = menus[MENU_STATBARS_LABELS]->pos.h = eset->resolutions.icon_size / 2; // small - } - // @ATTR combat_text_toggle|point|Position for the button used to toggle the display of combat text. - else if (infile.key == "combat_text_toggle") { - int x = Parse::popFirstInt(infile.val); - int y = Parse::popFirstInt(infile.val); - menus[MENU_COMBAT_TEXT]->setBasePos(x, y, Utils::ALIGN_TOPLEFT); - menus[MENU_COMBAT_TEXT]->pos.w = menus[MENU_COMBAT_TEXT]->pos.h = eset->resolutions.icon_size / 2; // small + // @ATTR tooltip_length|["short", "long_menu", "long_all"]|The length of power descriptions in tooltips. 'short' will display only the power name. 'long_menu' (the default setting) will display full tooltips, but only for powers that are in the Powers menu. 'long_all' will display full tooltips for all powers. + else if (infile.key == "tooltip_length") { + if (infile.val == "short") + tooltip_length = MenuPowers::TOOLTIP_SHORT; + else if (infile.val == "long_menu") + tooltip_length = MenuPowers::TOOLTIP_LONG_MENU; + else if (infile.val == "long_all") + tooltip_length = MenuPowers::TOOLTIP_LONG_ALL; + else + infile.error("MenuActionBar: '%s' is not a valid tooltip_length setting.", infile.val.c_str()); } else infile.error("MenuActionBar: '%s' is not a valid key.", infile.key.c_str()); @@ -207,7 +187,7 @@ slot_cooldown_size.resize(slots_count); slot_fail_cooldown.resize(slots_count); - clear(); + clear(!MenuActionBar::CLEAR_SKIP_ITEMS); loadGraphics(); @@ -225,10 +205,15 @@ slots.resize(index+1, NULL); } - slots[index] = new WidgetSlot(-1, Input::ACTIONBAR, WidgetSlot::SIZE_NORMAL); + slots[index] = new WidgetSlot(-1, Input::ACTIONBAR); slots[index]->setBasePos(x, y, Utils::ALIGN_TOPLEFT); slots[index]->pos.w = slots[index]->pos.h = eset->resolutions.icon_size; slots[index]->continuous = true; + + if (index < 10) + slots[index]->setHotkey(Input::BAR_1 + index); + else if (index < 12) + slots[index]->setHotkey(Input::MAIN1 + index - 10); prevent_changing.resize(slots.size()); prevent_changing[index] = is_locked; @@ -267,15 +252,22 @@ } for (unsigned i=0; i<menu_labels.size(); i++) { menus[i]->setPos(window_area.x, window_area.y); - if (i < MENU_LOOT_TIPS) { - menu_labels[i] = msg->get("Hotkey: %s", inpt->getBindingString(i + Input::CHARACTER)); - } - } -} - -void MenuActionBar::clear() { + menu_labels[i] = msg->get("Hotkey: %s", inpt->getBindingString(i + Input::CHARACTER)); + } +} + +void MenuActionBar::clear(bool skip_items) { // clear action bar for (unsigned i = 0; i < slots_count; i++) { + if (skip_items && powers) { + if (hotkeys[i] > 0) { + const Power &power = powers->powers[hotkeys_mod[i]]; + if (!power.required_items.empty()) { + continue; + } + } + } + hotkeys[i] = 0; hotkeys_temp[i] = 0; hotkeys_mod[i] = 0; @@ -333,7 +325,7 @@ for (unsigned i = 0; i < slots_count; i++) { if (!slots[i]) continue; - if (hotkeys[i] > 0 && static_cast<unsigned>(hotkeys_mod[i]) < powers->powers.size()) { + if (hotkeys[i] > 0) { const Power &power = powers->powers[hotkeys_mod[i]]; if (power.required_items.empty()) { @@ -469,35 +461,6 @@ else tip_data.addText(menu_titles[i]); - if (i == MENU_LOOT_TIPS) { - if (settings->loot_tooltips == Settings::LOOT_TIPS_DEFAULT) - menu_labels[i] = msg->get("Default. Temporarily show all loot tooltips with '%s'.", inpt->getBindingString(Input::ALT)); - else if (settings->loot_tooltips == Settings::LOOT_TIPS_SHOW_ALL) - menu_labels[i] = msg->get("Show All. Temporarily hide all loot tooltips with '%s'.", inpt->getBindingString(Input::ALT)); - else if (settings->loot_tooltips == Settings::LOOT_TIPS_HIDE_ALL) - menu_labels[i] = msg->get("Hide All. Temporarily show all loot tooltips with '%s'.", inpt->getBindingString(Input::ALT)); - } - else if (i == MENU_MINIMAP_MODE) { - if (settings->minimap_mode == Settings::MINIMAP_NORMAL) - menu_labels[i] = msg->get("Visible"); - else if (settings->minimap_mode == Settings::MINIMAP_2X) - menu_labels[i] = msg->get("Visible (2x zoom)"); - else if (settings->minimap_mode == Settings::MINIMAP_HIDDEN) - menu_labels[i] = msg->get("Hidden"); - } - else if (i == MENU_STATBARS_LABELS) { - if (settings->statbar_labels) - menu_labels[i] = msg->get("Enabled"); - else - menu_labels[i] = msg->get("Disabled"); - } - else if (i == MENU_COMBAT_TEXT) { - if (settings->combat_text) - menu_labels[i] = msg->get("Enabled"); - else - menu_labels[i] = msg->get("Disabled"); - } - if (!menu_labels[i].empty()) { tip_data.addText(menu_labels[i]); } @@ -511,7 +474,7 @@ for (unsigned i = 0; i < slots_count; i++) { if (slots[i] && Utils::isWithinRect(slots[i]->pos, position)) { if (hotkeys_mod[i] != 0) { - tip_data.addText(powers->powers[hotkeys_mod[i]].name); + menu->pow->createTooltipFromActionBar(&tip_data, i, tooltip_length); } tip_data.addText(labels[i]); } @@ -523,7 +486,7 @@ /** * After dragging a power or item onto the action bar, set as new hotkey */ -void MenuActionBar::drop(const Point& mouse, int power_index, bool rearranging) { +void MenuActionBar::drop(const Point& mouse, PowerID power_index, bool rearranging) { for (unsigned i = 0; i < slots_count; i++) { if (slots[i] && !powers->powers[power_index].no_actionbar && Utils::isWithinRect(slots[i]->pos, mouse)) { if (rearranging) { @@ -548,7 +511,7 @@ /** * Return the power to the last clicked on slot */ -void MenuActionBar::actionReturn(int power_index) { +void MenuActionBar::actionReturn(PowerID power_index) { drop(last_mouse, power_index, !REORDER); } @@ -650,7 +613,7 @@ } // a power slot was activated - if (action.power > 0 && static_cast<unsigned>(action.power) < powers->powers.size()) { + if (action.power > 0) { const Power& power = powers->powers[action.power]; if (pc->stats.mp < power.requires_mp && slot_fail_cooldown[i] == 0) { @@ -713,8 +676,8 @@ /** * If clicking while a menu is open, assume the player wants to rearrange the action bar */ -int MenuActionBar::checkDrag(const Point& mouse) { - int power_index; +PowerID MenuActionBar::checkDrag(const Point& mouse) { + PowerID power_index; for (unsigned i=0; i<slots_count; i++) { if (slots[i] && Utils::isWithinRect(slots[i]->pos, mouse)) { @@ -753,26 +716,6 @@ else if (menus[MENU_LOG]->checkClick()) { menu_l = true; menus[MENU_LOG]->deactivate(); - } - else if (menus[MENU_LOOT_TIPS]->checkClick()) { - settings->loot_tooltips++; - if (settings->loot_tooltips > Settings::LOOT_TIPS_HIDE_ALL) - settings->loot_tooltips = Settings::LOOT_TIPS_DEFAULT; - menus[MENU_LOOT_TIPS]->deactivate(); - } - else if (menus[MENU_MINIMAP_MODE]->checkClick()) { - settings->minimap_mode++; - if (settings->minimap_mode > Settings::MINIMAP_HIDDEN) - settings->minimap_mode = Settings::MINIMAP_NORMAL; - menus[MENU_MINIMAP_MODE]->deactivate(); - } - else if (menus[MENU_STATBARS_LABELS]->checkClick()) { - settings->statbar_labels = !settings->statbar_labels; - menus[MENU_STATBARS_LABELS]->deactivate(); - } - else if (menus[MENU_COMBAT_TEXT]->checkClick()) { - settings->combat_text = !settings->combat_text; - menus[MENU_COMBAT_TEXT]->deactivate(); } // also allow ACTIONBAR_USE to open menus @@ -789,40 +732,19 @@ menu_p = true; else if (cur_slot == tablist.size() - (MENU_COUNT - 3)) menu_l = true; - else if (cur_slot == tablist.size() - (MENU_COUNT - 4)) { - settings->loot_tooltips++; - if (settings->loot_tooltips > Settings::LOOT_TIPS_HIDE_ALL) - settings->loot_tooltips = Settings::LOOT_TIPS_DEFAULT; - } - else if (cur_slot == tablist.size() - (MENU_COUNT - 5)) { - settings->minimap_mode++; - if (settings->minimap_mode > Settings::MINIMAP_HIDDEN) - settings->minimap_mode = Settings::MINIMAP_NORMAL; - menus[MENU_MINIMAP_MODE]->deactivate(); - } - else if (cur_slot == tablist.size() - (MENU_COUNT - 6)) { - settings->statbar_labels = !settings->statbar_labels; - menus[MENU_STATBARS_LABELS]->deactivate(); - } - else if (cur_slot == tablist.size() - (MENU_COUNT - 7)) { - settings->combat_text = !settings->combat_text; - menus[MENU_COMBAT_TEXT]->deactivate(); - } } } /** * Set all hotkeys at once e.g. when loading a game */ -void MenuActionBar::set(std::vector<int> power_id) { +void MenuActionBar::set(std::vector<PowerID> power_id, bool skip_empty) { for (unsigned i = 0; i < slots_count; i++) { - if (static_cast<unsigned>(power_id[i]) >= powers->powers.size()) - continue; - if (powers->powers[power_id[i]].no_actionbar) continue; - hotkeys[i] = power_id[i]; + if (!skip_empty || hotkeys[i] == 0) + hotkeys[i] = power_id[i]; } updated = true; } @@ -843,9 +765,9 @@ if (have_aim && settings->mouse_aim) { FPoint map_pos; if (pow.aim_assist) - map_pos = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y + eset->misc.aim_assist, pc->stats.pos.x, pc->stats.pos.y); + map_pos = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y + eset->misc.aim_assist, mapr->cam.pos.x, mapr->cam.pos.y); else - map_pos = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, pc->stats.pos.x, pc->stats.pos.y); + map_pos = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, mapr->cam.pos.x, mapr->cam.pos.y); if (pow.target_nearest > 0) { if (!pow.requires_corpse && powers->checkNearestTargeting(pow, &pc->stats, false)) { @@ -905,10 +827,7 @@ * Replaces the power(s) in slots that match the target_id with the power of id * So a target_id of 0 will place the power in an empty slot, if available */ -void MenuActionBar::addPower(const int id, const int target_id) { - if (static_cast<unsigned>(id) >= powers->powers.size()) - return; - +void MenuActionBar::addPower(const PowerID id, const PowerID target_id) { // some powers are explicitly prevented from being placed on the actionbar if (powers->powers[id].no_actionbar) return; @@ -963,7 +882,7 @@ return Point(); } -int MenuActionBar::getSlotPower(int slot) { +PowerID MenuActionBar::getSlotPower(int slot) { if (static_cast<unsigned>(slot) < hotkeys.size()) { return hotkeys_mod[slot]; } diff --git a/src/MenuActionBar.h b/src/MenuActionBar.h index 899b114..0a6421e 100644 --- a/src/MenuActionBar.h +++ b/src/MenuActionBar.h @@ -60,18 +60,16 @@ SoundID sfx_unable_to_cast; + int tooltip_length; + public: enum { MENU_CHARACTER = 0, MENU_INVENTORY = 1, MENU_POWERS = 2, MENU_LOG = 3, - MENU_LOOT_TIPS = 4, - MENU_MINIMAP_MODE = 5, - MENU_STATBARS_LABELS = 6, - MENU_COMBAT_TEXT = 7 }; - static const unsigned MENU_COUNT = 8; + static const unsigned MENU_COUNT = 4; static const int SLOT_MAIN1 = 10; static const int SLOT_MAIN2 = 11; @@ -80,6 +78,8 @@ static const int USE_EMPTY_SLOT = 0; static const bool REORDER = true; + static const bool CLEAR_SKIP_ITEMS = true; + static const bool SET_SKIP_EMPTY = true; MenuActionBar(); ~MenuActionBar(); @@ -88,26 +88,26 @@ void logic(); void render(); void checkAction(std::vector<ActionData> &action_queue); - int checkDrag(const Point& mouse); + PowerID checkDrag(const Point& mouse); void checkMenu(bool &menu_c, bool &menu_i, bool &menu_p, bool &menu_l); - void drop(const Point& mouse, int power_index, bool rearranging); - void actionReturn(int power_index); + void drop(const Point& mouse, PowerID power_index, bool rearranging); + void actionReturn(PowerID power_index); void remove(const Point& mouse); - void set(std::vector<int> power_id); - void clear(); + void set(std::vector<PowerID> power_id, bool skip_empty); + void clear(bool skip_items); void resetSlots(); Point getSlotPos(int slot); - int getSlotPower(int slot); + PowerID getSlotPower(int slot); void renderTooltips(const Point& position); bool isWithinSlots(const Point& mouse); bool isWithinMenus(const Point& mouse); - void addPower(const int id, const int target_id); + void addPower(const PowerID id, const PowerID target_id); unsigned slots_count; - std::vector<int> hotkeys; // refer to power_index in PowerManager - std::vector<int> hotkeys_temp; // temp for shapeshifting - std::vector<int> hotkeys_mod; // hotkeys can be changed by items + std::vector<PowerID> hotkeys; // refer to power_index in PowerManager + std::vector<PowerID> hotkeys_temp; // temp for shapeshifting + std::vector<PowerID> hotkeys_mod; // hotkeys can be changed by items std::vector<bool> locked; // if slot is locked, you cannot drop it std::vector<bool> prevent_changing; std::vector<WidgetSlot *> slots; // hotkey slots diff --git a/src/MenuActiveEffects.cpp b/src/MenuActiveEffects.cpp index c036c72..f1bf269 100644 --- a/src/MenuActiveEffects.cpp +++ b/src/MenuActiveEffects.cpp @@ -90,7 +90,7 @@ if (pc->stats.effects.effect_list[i].icon == -1) continue; - const Effect &ed = pc->stats.effects.effect_list[i]; + Effect &ed = pc->stats.effects.effect_list[i]; size_t most_recent_id = effect_icons.size()-1; if(ed.group_stack){ @@ -105,13 +105,13 @@ }else if (ed.type == Effect::HEAL){ //No special behavior }else{ - if(ed.ticks < effect_icons[most_recent_id].current){ - if (ed.duration > 0) - effect_icons[most_recent_id].overlay.y = (eset->resolutions.icon_size * ed.ticks) / ed.duration; + if (ed.timer.getCurrent() < static_cast<unsigned>(effect_icons[most_recent_id].current)){ + if (ed.timer.getDuration() > 0) + effect_icons[most_recent_id].overlay.y = (eset->resolutions.icon_size * ed.timer.getCurrent()) / ed.timer.getDuration(); else effect_icons[most_recent_id].overlay.y = eset->resolutions.icon_size; - effect_icons[most_recent_id].current = ed.ticks; - effect_icons[most_recent_id].max = ed.duration; + effect_icons[most_recent_id].current = ed.timer.getCurrent(); + effect_icons[most_recent_id].max = ed.timer.getDuration(); } } @@ -158,12 +158,12 @@ // current and max are ignored } else { - if (ed.duration > 0) - ei.overlay.y = (eset->resolutions.icon_size * ed.ticks) / ed.duration; + if (ed.timer.getDuration() > 0) + ei.overlay.y = (eset->resolutions.icon_size * ed.timer.getCurrent()) / ed.timer.getDuration(); else ei.overlay.y = eset->resolutions.icon_size; - ei.current = ed.ticks; - ei.max = ed.duration; + ei.current = ed.timer.getCurrent(); + ei.max = ed.timer.getDuration(); } ei.overlay.h = eset->resolutions.icon_size - ei.overlay.y; diff --git a/src/MenuCharacter.cpp b/src/MenuCharacter.cpp index 40ad4d7..ef47d62 100644 --- a/src/MenuCharacter.cpp +++ b/src/MenuCharacter.cpp @@ -305,14 +305,12 @@ cstat[i+2].value->setColor(bonusColor(pc->stats.primary_additional[i])); } - ss.str(""); - if (skill_points == 1) { - ss << msg->get("%d unspent stat point", skill_points); - } - else if (skill_points > 1) { - ss << msg->get("%d unspent stat points", skill_points); - } - labelUnspent->setText(ss.str()); + if (skill_points >= 1) { + labelUnspent->setText(msg->get("Available stat points: %d", skill_points)); + } + else { + labelUnspent->setText(""); + } // scrolling stat list unsigned stat_index = 0; diff --git a/src/MenuConfig.cpp b/src/MenuConfig.cpp new file mode 100644 index 0000000..5aec3ee --- /dev/null +++ b/src/MenuConfig.cpp @@ -0,0 +1,1682 @@ +/* +Copyright © 2012 Clint Bellanger +Copyright © 2012 davidriod +Copyright © 2012 Igor Paliychuk +Copyright © 2012 Stefan Beller +Copyright © 2013 Kurt Rinnert +Copyright © 2014 Henrik Andersson +Copyright © 2014-2016 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/** + * MenuConfig + * + * Handle game Settings Menu + */ + +#include "Avatar.h" +#include "CombatText.h" +#include "CommonIncludes.h" +#include "DeviceList.h" +#include "EngineSettings.h" +#include "FileParser.h" +#include "FontEngine.h" +#include "GameStateTitle.h" +#include "InputState.h" +#include "MenuConfig.h" +#include "MenuConfirm.h" +#include "MessageEngine.h" +#include "ModManager.h" +#include "Platform.h" +#include "RenderDevice.h" +#include "Settings.h" +#include "SharedResources.h" +#include "SoundManager.h" +#include "Stats.h" +#include "TooltipManager.h" +#include "UtilsFileSystem.h" +#include "UtilsParsing.h" +#include "Version.h" +#include "WidgetButton.h" +#include "WidgetCheckBox.h" +#include "WidgetHorizontalList.h" +#include "WidgetListBox.h" +#include "WidgetSlider.h" +#include "WidgetScrollBox.h" +#include "WidgetTabControl.h" + +MenuConfig::ConfigOption::ConfigOption() + : enabled(false) + , label(NULL) + , widget(NULL) { +} + +MenuConfig::ConfigOption::~ConfigOption() { +} + +MenuConfig::ConfigTab::ConfigTab() + : scrollbox(NULL) + , enabled_count(0) { +} + +MenuConfig::ConfigTab::~ConfigTab() { +} + +void MenuConfig::ConfigTab::setOptionWidgets(int index, WidgetLabel* lb, Widget* w, const std::string& lb_text) { + if (!options[index].enabled) { + options[index].enabled = true; + enabled_count++; + } + options[index].label = lb; + options[index].label->setText(lb_text); + options[index].widget = w; + options[index].widget->tablist_nav_right = true; +} + +void MenuConfig::ConfigTab::setOptionEnabled(int index, bool enable) { + if (options[index].enabled && !enable) { + options[index].enabled = false; + if (enabled_count > 0) + enabled_count--; + } + else if (!options[index].enabled && enable) { + options[index].enabled = true; + enabled_count++; + } +} + +int MenuConfig::ConfigTab::getEnabledIndex(int option_index) { + int r = -1; + for (size_t i = 0; i < options.size(); ++i) { + if (options[i].enabled) + r++; + if (i == static_cast<size_t>(option_index)) + break; + } + return (r == -1 ? 0 : r); +} + +MenuConfig::MenuConfig (bool _is_game_state) + : is_game_state(_is_game_state) + , enable_gamestate_buttons(false) + , hero(NULL) + , child_widget() + , tab_control(new WidgetTabControl()) + , ok_button(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , defaults_button(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , cancel_button(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , background(NULL) + , input_confirm(new MenuConfirm(msg->get("Clear"),msg->get("Assign:"))) + , defaults_confirm(new MenuConfirm(msg->get("Defaults"), msg->get("Reset ALL settings?"))) + + , pause_continue_lb(new WidgetLabel()) + , pause_continue_btn(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , pause_exit_lb(new WidgetLabel()) + , pause_exit_btn(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , pause_save_lb(new WidgetLabel()) + , pause_save_btn(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , pause_time_lb(new WidgetLabel()) + , pause_time_text(new WidgetLabel()) + + , renderer_lstb(new WidgetHorizontalList()) + , renderer_lb(new WidgetLabel()) + , fullscreen_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , fullscreen_lb(new WidgetLabel()) + , hwsurface_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , hwsurface_lb(new WidgetLabel()) + , vsync_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , vsync_lb(new WidgetLabel()) + , texture_filter_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , texture_filter_lb(new WidgetLabel()) + , dpi_scaling_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , dpi_scaling_lb(new WidgetLabel()) + , parallax_layers_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , parallax_layers_lb(new WidgetLabel()) + , change_gamma_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , change_gamma_lb(new WidgetLabel()) + , gamma_sl(new WidgetSlider(WidgetSlider::DEFAULT_FILE)) + , gamma_lb(new WidgetLabel()) + + , music_volume_sl(new WidgetSlider(WidgetSlider::DEFAULT_FILE)) + , music_volume_lb(new WidgetLabel()) + , sound_volume_sl(new WidgetSlider(WidgetSlider::DEFAULT_FILE)) + , sound_volume_lb(new WidgetLabel()) + + , show_fps_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , show_fps_lb(new WidgetLabel()) + , hardware_cursor_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , hardware_cursor_lb(new WidgetLabel()) + , colorblind_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , colorblind_lb(new WidgetLabel()) + , dev_mode_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , dev_mode_lb(new WidgetLabel()) + , subtitles_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , subtitles_lb(new WidgetLabel()) + , loot_tooltip_lstb(new WidgetHorizontalList()) + , loot_tooltip_lb(new WidgetLabel()) + , minimap_lstb(new WidgetHorizontalList()) + , minimap_lb(new WidgetLabel()) + , statbar_labels_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , statbar_labels_lb(new WidgetLabel()) + , statbar_autohide_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , statbar_autohide_lb(new WidgetLabel()) + , combat_text_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , combat_text_lb(new WidgetLabel()) + , auto_equip_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , auto_equip_lb(new WidgetLabel()) + , entity_markers_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , entity_markers_lb(new WidgetLabel()) + , low_hp_warning_lstb(new WidgetHorizontalList()) + , low_hp_warning_lb(new WidgetLabel()) + , low_hp_threshold_lstb(new WidgetHorizontalList()) + , low_hp_threshold_lb(new WidgetLabel()) + , item_compare_tips_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , item_compare_tips_lb(new WidgetLabel()) + + , joystick_device_lstb(new WidgetHorizontalList()) + , joystick_device_lb(new WidgetLabel()) + , mouse_move_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , mouse_move_lb(new WidgetLabel()) + , mouse_aim_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , mouse_aim_lb(new WidgetLabel()) + , no_mouse_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , no_mouse_lb(new WidgetLabel()) + , mouse_move_swap_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , mouse_move_swap_lb(new WidgetLabel()) + , mouse_move_attack_cb(new WidgetCheckBox(WidgetCheckBox::DEFAULT_FILE)) + , mouse_move_attack_lb(new WidgetLabel()) + , joystick_deadzone_sl(new WidgetSlider(WidgetSlider::DEFAULT_FILE)) + , joystick_deadzone_lb(new WidgetLabel()) + + , activemods_lstb(new WidgetListBox(10, WidgetListBox::DEFAULT_FILE)) + , activemods_lb(new WidgetLabel()) + , inactivemods_lstb(new WidgetListBox(10, WidgetListBox::DEFAULT_FILE)) + , inactivemods_lb(new WidgetLabel()) + , language_lstb(new WidgetHorizontalList()) + , language_lb(new WidgetLabel()) + , activemods_shiftup_btn(new WidgetButton("images/menus/buttons/up.png")) + , activemods_shiftdown_btn(new WidgetButton("images/menus/buttons/down.png")) + , activemods_deactivate_btn(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , inactivemods_activate_btn(new WidgetButton(WidgetButton::DEFAULT_FILE)) + + , active_tab(0) + , frame(0,0) + , frame_offset(11,8) + , tab_offset(3,0) + , scrollpane_color(0,0,0,0) + , scrollpane_padding(8, 40) // appropriate defaults for fantasycore widget sizes + , scrollpane_separator_color(font->getColor(FontEngine::COLOR_WIDGET_DISABLED)) + , new_render_device(settings->render_device_name) + , input_confirm_timer(settings->max_frames_per_sec * 10) // 10 seconds + , input_key(0) + , key_count(0) + , keybind_tip_timer(settings->max_frames_per_sec * 5) // 5 seconds + , keybind_tip(new WidgetTooltip()) + , clicked_accept(false) + , clicked_cancel(false) + , force_refresh_background(false) + , reload_music(false) + , clicked_pause_continue(false) + , clicked_pause_exit(false) + , clicked_pause_save(false) +{ + + Image *graphics; + graphics = render_device->loadImage("images/menus/config.png", RenderDevice::ERROR_NORMAL); + if (graphics) { + background = graphics->createSprite(); + graphics->unref(); + } + + ok_button->setLabel(msg->get("OK")); + defaults_button->setLabel(msg->get("Defaults")); + cancel_button->setLabel(msg->get("Cancel")); + + pause_continue_btn->setLabel(msg->get("Continue")); + setPauseExitText(MenuConfig::ENABLE_SAVE_GAME); + pause_save_btn->setLabel(msg->get("Save Game")); + setPauseSaveEnabled(MenuConfig::ENABLE_SAVE_GAME); + pause_time_text->setText(Utils::getTimeString(0)); + pause_time_text->setJustify(FontEngine::JUSTIFY_RIGHT); + pause_time_text->setVAlign(LabelInfo::VALIGN_CENTER); + + // Finish Mods ListBoxes setup + activemods_lstb->multi_select = true; + for (unsigned int i = 0; i < mods->mod_list.size() ; i++) { + if (mods->mod_list[i].name != mods->FALLBACK_MOD) + activemods_lstb->append(mods->mod_list[i].name,createModTooltip(&mods->mod_list[i])); + } + + inactivemods_lstb->multi_select = true; + for (unsigned int i = 0; i<mods->mod_dirs.size(); i++) { + bool skip_mod = false; + for (unsigned int j = 0; j<mods->mod_list.size(); j++) { + if (mods->mod_dirs[i] == mods->mod_list[j].name) { + skip_mod = true; + break; + } + } + if (!skip_mod && mods->mod_dirs[i] != mods->FALLBACK_MOD) { + Mod temp_mod = mods->loadMod(mods->mod_dirs[i]); + inactivemods_lstb->append(mods->mod_dirs[i],createModTooltip(&temp_mod)); + } + } + inactivemods_lstb->sort(); + + refreshJoysticks(); + + // Allocate KeyBindings + for (int i = 0; i < inpt->KEY_COUNT_USER * 3; i++) { + keybinds_lb.push_back(new WidgetLabel()); + keybinds_btn.push_back(new WidgetButton(WidgetButton::DEFAULT_FILE)); + } + + key_count = static_cast<unsigned>(keybinds_btn.size()/3); + + // don't allow remapping the primary Main1 binding + keybinds_btn[Input::MAIN1 * 3]->enabled = false; + + // set up loot tooltip setting + loot_tooltip_lstb->append(msg->get("Default"), msg->get("Show all loot tooltips, except for those that would be obscured by the player or an enemy. Temporarily show all loot tooltips with 'Alt'.")); + loot_tooltip_lstb->append(msg->get("Show all"), msg->get("Always show loot tooltips. Temporarily hide all loot tooltips with 'Alt'.")); + loot_tooltip_lstb->append(msg->get("Hidden"), msg->get("Always hide loot tooltips, except for when a piece of loot is hovered with the mouse cursor. Temporarily show all loot tooltips with 'Alt'.")); + + // set up minimap setting + minimap_lstb->append(msg->get("Visible"), ""); + minimap_lstb->append(msg->get("Visible (2x zoom)"), ""); + minimap_lstb->append(msg->get("Hidden"), ""); + + // set up low hp notification type combinantions + std::string lhpw_prefix = msg->get("Controls the type of warning to be activated when the player is below the low health threshold."); + std::string lhpw_warning1 = msg->get("- Display a message"); + std::string lhpw_warning2 = msg->get("- Play a sound"); + std::string lhpw_warning3 = msg->get("- Change the cursor"); + + low_hp_warning_lstb->append(msg->get("Disabled"), lhpw_prefix); + low_hp_warning_lstb->append(msg->get("All"), lhpw_prefix + "\n\n" + lhpw_warning1 + '\n' + lhpw_warning2 + '\n' + lhpw_warning3); + low_hp_warning_lstb->append(msg->get("Message & Cursor"), lhpw_prefix + "\n\n" + lhpw_warning1 + '\n' + lhpw_warning3); + low_hp_warning_lstb->append(msg->get("Message & Sound"), lhpw_prefix + "\n\n" + lhpw_warning1 + '\n' + lhpw_warning2); + low_hp_warning_lstb->append(msg->get("Sound & Cursor"), lhpw_prefix + "\n\n" + lhpw_warning2 + '\n' + lhpw_warning3); + low_hp_warning_lstb->append(msg->get("Message"), lhpw_prefix + "\n\n" + lhpw_warning1); + low_hp_warning_lstb->append(msg->get("Cursor"), lhpw_prefix + "\n\n" + lhpw_warning3); + low_hp_warning_lstb->append(msg->get("Sound"), lhpw_prefix + "\n\n" + lhpw_warning2); + + // set up low hp threshold combo + for (unsigned int i = 1; i <= 10 ; ++i) { + std::stringstream ss; + ss << i * 5; + low_hp_threshold_lstb->append(ss.str() + "%", msg->get("When the player's health drops below the given threshold, the low health notifications are triggered if one or more of them is enabled.")); + } + + init(); + + render_device->setBackgroundColor(Color(0,0,0,0)); +} + +MenuConfig::~MenuConfig() { + cleanup(); +} + +void MenuConfig::init() { + tab_control->setTabTitle(EXIT_TAB, msg->get("Exit")); + tab_control->setTabTitle(VIDEO_TAB, msg->get("Video")); + tab_control->setTabTitle(AUDIO_TAB, msg->get("Audio")); + tab_control->setTabTitle(INTERFACE_TAB, msg->get("Interface")); + tab_control->setTabTitle(INPUT_TAB, msg->get("Input")); + tab_control->setTabTitle(KEYBINDS_TAB, msg->get("Keybindings")); + tab_control->setTabTitle(MODS_TAB, msg->get("Mods")); + + readConfig(); + + cfg_tabs.resize(6); + cfg_tabs[EXIT_TAB].options.resize(4); + cfg_tabs[VIDEO_TAB].options.resize(Platform::Video::COUNT); + cfg_tabs[AUDIO_TAB].options.resize(Platform::Audio::COUNT); + cfg_tabs[INTERFACE_TAB].options.resize(Platform::Interface::COUNT); + cfg_tabs[INPUT_TAB].options.resize(Platform::Input::COUNT); + cfg_tabs[KEYBINDS_TAB].options.resize(inpt->KEY_COUNT_USER * 3); + + cfg_tabs[EXIT_TAB].setOptionWidgets(EXIT_OPTION_CONTINUE, pause_continue_lb, pause_continue_btn, msg->get("Paused")); + cfg_tabs[EXIT_TAB].setOptionWidgets(EXIT_OPTION_SAVE, pause_save_lb, pause_save_btn, ""); + cfg_tabs[EXIT_TAB].setOptionWidgets(EXIT_OPTION_EXIT, pause_exit_lb, pause_exit_btn, ""); + cfg_tabs[EXIT_TAB].setOptionWidgets(EXIT_OPTION_TIME_PLAYED, pause_time_lb, pause_time_text, msg->get("Time Played")); + + if (!(MenuConfig::ENABLE_SAVE_GAME && eset->misc.save_anywhere)) { + cfg_tabs[EXIT_TAB].setOptionEnabled(EXIT_OPTION_SAVE, false); + } + + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::RENDERER, renderer_lb, renderer_lstb, msg->get("Renderer")); + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::FULLSCREEN, fullscreen_lb, fullscreen_cb, msg->get("Full Screen Mode")); + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::HWSURFACE, hwsurface_lb, hwsurface_cb, msg->get("Hardware surfaces")); + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::VSYNC, vsync_lb, vsync_cb, msg->get("V-Sync")); + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::TEXTURE_FILTER, texture_filter_lb, texture_filter_cb, msg->get("Texture Filtering")); + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::DPI_SCALING, dpi_scaling_lb, dpi_scaling_cb, msg->get("DPI scaling")); + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::PARALLAX_LAYERS, parallax_layers_lb, parallax_layers_cb, msg->get("Parallax Layers")); + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::ENABLE_GAMMA, change_gamma_lb, change_gamma_cb, msg->get("Allow changing gamma")); + cfg_tabs[VIDEO_TAB].setOptionWidgets(Platform::Video::GAMMA, gamma_lb, gamma_sl, msg->get("Gamma")); + + cfg_tabs[AUDIO_TAB].setOptionWidgets(Platform::Audio::SFX, sound_volume_lb, sound_volume_sl, msg->get("Sound Volume")); + cfg_tabs[AUDIO_TAB].setOptionWidgets(Platform::Audio::MUSIC, music_volume_lb, music_volume_sl, msg->get("Music Volume")); + + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::LANGUAGE, language_lb, language_lstb, msg->get("Language")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::SHOW_FPS, show_fps_lb, show_fps_cb, msg->get("Show FPS")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::HARDWARE_CURSOR, hardware_cursor_lb, hardware_cursor_cb, msg->get("Hardware mouse cursor")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::COLORBLIND, colorblind_lb, colorblind_cb, msg->get("Colorblind Mode")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::DEV_MODE, dev_mode_lb, dev_mode_cb, msg->get("Developer Mode")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::SUBTITLES, subtitles_lb, subtitles_cb, msg->get("Subtitles")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::LOOT_TOOLTIPS, loot_tooltip_lb, loot_tooltip_lstb, msg->get("Loot tooltip visibility")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::MINIMAP_MODE, minimap_lb, minimap_lstb, msg->get("Mini-map mode")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::STATBAR_LABELS, statbar_labels_lb, statbar_labels_cb, msg->get("Always show stat bar labels")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::STATBAR_AUTOHIDE, statbar_autohide_lb, statbar_autohide_cb, msg->get("Allow stat bar auto-hiding")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::COMBAT_TEXT, combat_text_lb, combat_text_cb, msg->get("Show combat text")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::AUTO_EQUIP, auto_equip_lb, auto_equip_cb, msg->get("Automatically equip items")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::ENTITY_MARKERS, entity_markers_lb, entity_markers_cb, msg->get("Show hidden entity markers")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::LOW_HP_WARNING_TYPE, low_hp_warning_lb, low_hp_warning_lstb, msg->get("Low health notification")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::LOW_HP_THRESHOLD, low_hp_threshold_lb, low_hp_threshold_lstb, msg->get("Low health threshold")); + cfg_tabs[INTERFACE_TAB].setOptionWidgets(Platform::Interface::ITEM_COMPARE_TIPS, item_compare_tips_lb, item_compare_tips_cb, msg->get("Show item comparison tooltips")); + + + cfg_tabs[INPUT_TAB].setOptionWidgets(Platform::Input::JOYSTICK, joystick_device_lb, joystick_device_lstb, msg->get("Joystick")); + cfg_tabs[INPUT_TAB].setOptionWidgets(Platform::Input::MOUSE_MOVE, mouse_move_lb, mouse_move_cb, msg->get("Move hero using mouse")); + cfg_tabs[INPUT_TAB].setOptionWidgets(Platform::Input::MOUSE_AIM, mouse_aim_lb, mouse_aim_cb, msg->get("Mouse aim")); + cfg_tabs[INPUT_TAB].setOptionWidgets(Platform::Input::NO_MOUSE, no_mouse_lb, no_mouse_cb, msg->get("Do not use mouse")); + cfg_tabs[INPUT_TAB].setOptionWidgets(Platform::Input::MOUSE_MOVE_SWAP, mouse_move_swap_lb, mouse_move_swap_cb, msg->get("Swap mouse movement button")); + cfg_tabs[INPUT_TAB].setOptionWidgets(Platform::Input::MOUSE_MOVE_ATTACK, mouse_move_attack_lb, mouse_move_attack_cb, msg->get("Attack with mouse movement")); + cfg_tabs[INPUT_TAB].setOptionWidgets(Platform::Input::JOYSTICK_DEADZONE, joystick_deadzone_lb, joystick_deadzone_sl, msg->get("Joystick Deadzone")); + + + for (size_t i = 0; i < keybinds_btn.size(); ++i) { + if (i % 3 == 0) { + cfg_tabs[KEYBINDS_TAB].setOptionWidgets(static_cast<int>(i), keybinds_lb[i], keybinds_btn[i], inpt->binding_name[i/3]); + // TODO since these are blank, don't allocate? + cfg_tabs[KEYBINDS_TAB].setOptionWidgets(static_cast<int>(i+1), keybinds_lb[i+1], keybinds_btn[i+1], ""); + cfg_tabs[KEYBINDS_TAB].setOptionWidgets(static_cast<int>(i+2), keybinds_lb[i+2], keybinds_btn[i+2], ""); + + keybinds_btn[i]->tooltip = msg->get("Primary binding: %s", inpt->binding_name[i/3].c_str()); + keybinds_btn[i+1]->tooltip = msg->get("Alternate binding: %s", inpt->binding_name[i/3].c_str()); + keybinds_btn[i+2]->tooltip = msg->get("Joystick binding: %s", inpt->binding_name[i/3].c_str()); + } + } + + // disable some options + if (!is_game_state) { + cfg_tabs[VIDEO_TAB].setOptionEnabled(Platform::Video::RENDERER, false); + cfg_tabs[VIDEO_TAB].setOptionEnabled(Platform::Video::HWSURFACE, false); + cfg_tabs[VIDEO_TAB].setOptionEnabled(Platform::Video::VSYNC, false); + cfg_tabs[VIDEO_TAB].setOptionEnabled(Platform::Video::TEXTURE_FILTER, false); + + cfg_tabs[INTERFACE_TAB].setOptionEnabled(Platform::Interface::LANGUAGE, false); + cfg_tabs[INTERFACE_TAB].setOptionEnabled(Platform::Interface::DEV_MODE, false); + + tab_control->setEnabled(static_cast<unsigned>(MODS_TAB), false); + tab_control->setEnabled(static_cast<unsigned>(EXIT_TAB), true); + enable_gamestate_buttons = false; + } + else { + cfg_tabs[EXIT_TAB].setOptionEnabled(EXIT_OPTION_CONTINUE, false); + cfg_tabs[EXIT_TAB].setOptionEnabled(EXIT_OPTION_SAVE, false); + cfg_tabs[EXIT_TAB].setOptionEnabled(EXIT_OPTION_EXIT, false); + cfg_tabs[EXIT_TAB].setOptionEnabled(EXIT_OPTION_TIME_PLAYED, false); + tab_control->setEnabled(static_cast<unsigned>(EXIT_TAB), false); + enable_gamestate_buttons = true; + } + + // disable platform-specific options + for (int i = 0; i < Platform::Video::COUNT; ++i) { + if (!platform.config_video[i]) + cfg_tabs[VIDEO_TAB].setOptionEnabled(i, false); + } + for (int i = 0; i < Platform::Audio::COUNT; ++i) { + if (!platform.config_audio[i]) + cfg_tabs[AUDIO_TAB].setOptionEnabled(i, false); + } + for (int i = 0; i < Platform::Interface::COUNT; ++i) { + if (!platform.config_interface[i]) + cfg_tabs[INTERFACE_TAB].setOptionEnabled(i, false); + } + for (int i = 0; i < Platform::Input::COUNT; ++i) { + if (!platform.config_input[i]) + cfg_tabs[INPUT_TAB].setOptionEnabled(i, false); + } + if (!platform.config_misc[Platform::Misc::KEYBINDS]) { + for (size_t i = 0; i < keybinds_btn.size(); ++i) { + cfg_tabs[KEYBINDS_TAB].setOptionEnabled(static_cast<int>(i), false); + } + } + if (!platform.config_misc[Platform::Misc::MODS]) { + tab_control->setEnabled(static_cast<unsigned>(MODS_TAB), false); + } + + // place widgets + for (size_t i = 0; i < cfg_tabs.size(); ++i) { + if (cfg_tabs[i].enabled_count == 0) { + tab_control->setEnabled(static_cast<unsigned>(i), false); + } + + // set up scrollbox + cfg_tabs[i].scrollbox = new WidgetScrollBox(scrollpane.w, scrollpane.h); + cfg_tabs[i].scrollbox->setBasePos(scrollpane.x, scrollpane.y, Utils::ALIGN_TOPLEFT); + cfg_tabs[i].scrollbox->bg = scrollpane_color; + cfg_tabs[i].scrollbox->resize(scrollpane.w, cfg_tabs[i].enabled_count * scrollpane_padding.y); + + for (size_t j = 0; j < cfg_tabs[i].options.size(); ++j) { + placeLabeledWidgetAuto(static_cast<int>(i), static_cast<int>(j)); + } + } + + addChildWidgets(); + setupTabList(); + + refreshWidgets(); + + update(); +} + +void MenuConfig::readConfig() { + //Load the menu configuration from file + + FileParser infile; + if (infile.open("menus/config.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { + while (infile.next()) { + if (parseKeyButtons(infile)) + continue; + + int x1 = Parse::popFirstInt(infile.val); + int y1 = Parse::popFirstInt(infile.val); + int x2 = Parse::popFirstInt(infile.val); + int y2 = Parse::popFirstInt(infile.val); + + if (parseKey(infile, x1, y1, x2, y2)) + continue; + else + infile.error("MenuConfig: '%s' is not a valid key.", infile.key.c_str()); + } + infile.close(); + } + + // add description tooltips + hwsurface_cb->tooltip = msg->get("Will try to store surfaces in video memory versus system memory. The effect this has on performance depends on the renderer."); + vsync_cb->tooltip = msg->get("Prevents screen tearing. Disable if you experience \"stuttering\" in windowed mode or input lag."); + dpi_scaling_cb->tooltip = msg->get("When enabled, this uses the screen DPI in addition to the window dimensions to scale the rendering resolution. Otherwise, only the window dimensions are used."); + parallax_layers_cb->tooltip = msg->get("This enables parallax (non-tile) layers. Disabling this setting can improve performance in some cases."); + change_gamma_cb->tooltip = msg->get("Enables the below setting that controls the screen gamma level. The behavior of the gamma setting can vary between platforms."); + colorblind_cb->tooltip = msg->get("Provides additional text for information that is primarily conveyed through color."); + statbar_autohide_cb->tooltip = msg->get("Some mods will automatically hide the stat bars when they are inactive. Disabling this option will keep them displayed at all times."); + auto_equip_cb->tooltip = msg->get("When enabled, empty equipment slots will be filled with applicable items when they are obtained."); + entity_markers_cb->tooltip = msg->get("Shows a marker above enemies, allies, and the player when they are obscured by tall objects."); + item_compare_tips_cb->tooltip = msg->get("When enabled, tooltips for equipped items of the same type are shown next to standard item tooltips."); + no_mouse_cb->tooltip = msg->get("This allows the game to be controlled entirely with the keyboard (or joystick)."); + mouse_move_swap_cb->tooltip = msg->get("When 'Move hero using mouse' is enabled, this setting controls if 'Main1' or 'Main2' is used to move the hero. If enabled, 'Main2' will move the hero instead of 'Main1'."); + mouse_move_attack_cb->tooltip = msg->get("When 'Move hero using mouse' is enabled, this setting controls if the Power assigned to the movement button can be used by targeting an enemy. If this setting is disabled, it is required to use 'Shift' to access the Power assigned to the movement button."); + mouse_aim_cb->tooltip = msg->get("The player's attacks will be aimed in the direction of the mouse cursor when this is enabled."); +} + +bool MenuConfig::parseKeyButtons(FileParser &infile) { + // @CLASS MenuConfig|Description of menus/config.txt + + if (infile.key == "button_ok") { + // @ATTR button_ok|int, int, alignment : X, Y, Alignment|Position of the "OK" button. Not used in the pause menu. + int x = Parse::popFirstInt(infile.val); + int y = Parse::popFirstInt(infile.val); + int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + ok_button->setBasePos(x, y, a); + } + else if (infile.key == "button_defaults") { + // @ATTR button_defaults|int, int, alignment : X, Y, Alignment|Position of the "Defaults" button. Not used in the pause menu. + int x = Parse::popFirstInt(infile.val); + int y = Parse::popFirstInt(infile.val); + int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + defaults_button->setBasePos(x, y, a); + } + else if (infile.key == "button_cancel") { + // @ATTR button_cancel|int, int, alignment : X, Y, Alignment|Position of the "Cancel" button. Not used in the pause menu. + int x = Parse::popFirstInt(infile.val); + int y = Parse::popFirstInt(infile.val); + int a = Parse::toAlignment(Parse::popFirstString(infile.val)); + cancel_button->setBasePos(x, y, a); + } + else { + return false; + } + + return true; +} +bool MenuConfig::parseKey(FileParser &infile, int &x1, int &y1, int &x2, int &y2) { + if (infile.key == "listbox_scrollbar_offset") { + // @ATTR listbox_scrollbar_offset|int|Horizontal offset from the right of listboxes (mods, languages, etc) to place the scrollbar. + activemods_lstb->scrollbar_offset = x1; + inactivemods_lstb->scrollbar_offset = x1; + } + else if (infile.key == "frame_offset") { + // @ATTR frame_offset|point|Offset for all the widgets contained under each tab. + frame_offset.x = x1; + frame_offset.y = y1; + } + else if (infile.key == "tab_offset") { + // @ATTR tab_offset|point|Offset for the row of tabs. + tab_offset.x = x1; + tab_offset.y = y1; + } + else if (infile.key == "activemods") { + // @ATTR activemods|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Active Mods" list box relative to the frame. + placeLabeledWidget(activemods_lb, activemods_lstb, x1, y1, x2, y2, msg->get("Active Mods")); + activemods_lb->setJustify(FontEngine::JUSTIFY_CENTER); + } + else if (infile.key == "activemods_height") { + // @ATTR activemods_height|int|Number of visible rows for the "Active Mods" list box. + activemods_lstb->setHeight(x1); + } + else if (infile.key == "inactivemods") { + // @ATTR inactivemods|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Available Mods" list box relative to the frame. + placeLabeledWidget(inactivemods_lb, inactivemods_lstb, x1, y1, x2, y2, msg->get("Available Mods")); + inactivemods_lb->setJustify(FontEngine::JUSTIFY_CENTER); + } + else if (infile.key == "inactivemods_height") { + // @ATTR inactivemods_height|int|Number of visible rows for the "Available Mods" list box. + inactivemods_lstb->setHeight(x1); + } + else if (infile.key == "activemods_shiftup") { + // @ATTR activemods_shiftup|point|Position of the button to shift mods up in "Active Mods" relative to the frame. + activemods_shiftup_btn->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); + activemods_shiftup_btn->refresh(); + } + else if (infile.key == "activemods_shiftdown") { + // @ATTR activemods_shiftdown|point|Position of the button to shift mods down in "Active Mods" relative to the frame. + activemods_shiftdown_btn->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); + activemods_shiftdown_btn->refresh(); + } + else if (infile.key == "activemods_deactivate") { + // @ATTR activemods_deactivate|point|Position of the "Disable" button relative to the frame. + activemods_deactivate_btn->setLabel(msg->get("<< Disable")); + activemods_deactivate_btn->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); + activemods_deactivate_btn->refresh(); + } + else if (infile.key == "inactivemods_activate") { + // @ATTR inactivemods_activate|point|Position of the "Enable" button relative to the frame. + inactivemods_activate_btn->setLabel(msg->get("Enable >>")); + inactivemods_activate_btn->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); + inactivemods_activate_btn->refresh(); + } + else if (infile.key == "scrollpane") { + // @ATTR scrollpane|rectangle|Position of the keybinding scrollbox relative to the frame. + scrollpane.x = x1; + scrollpane.y = y1; + scrollpane.w = x2; + scrollpane.h = y2; + } + else if (infile.key == "scrollpane_padding") { + // @ATTR scrollpane_padding|int, int : Horizontal padding, Vertical padding|Pixel padding for each item listed in a tab's scroll box. + scrollpane_padding.x = x1; + scrollpane_padding.y = y1; + } + else if (infile.key == "scrollpane_separator_color") { + // @ATTR scrollpane_separator_color|color|Color of the separator line in between scroll box items. + scrollpane_separator_color.r = static_cast<Uint8>(x1); + scrollpane_separator_color.g = static_cast<Uint8>(y1); + scrollpane_separator_color.b = static_cast<Uint8>(x2); + } + else if (infile.key == "scrollpane_bg_color") { + // @ATTR keybinds_bg_color|color, int: Color, Alpha|Background color and alpha for the keybindings scrollbox. + scrollpane_color.r = static_cast<Uint8>(x1); + scrollpane_color.g = static_cast<Uint8>(y1); + scrollpane_color.b = static_cast<Uint8>(x2); + scrollpane_color.a = static_cast<Uint8>(y2); + } + + else return false; + + return true; +} + +void MenuConfig::addChildWidgets() { + for (size_t i = 0; i < cfg_tabs.size(); ++i) { + for (size_t j = 0; j < cfg_tabs[i].options.size(); ++j) { + if (cfg_tabs[i].options[j].enabled) { + cfg_tabs[i].scrollbox->addChildWidget(cfg_tabs[i].options[j].widget); + cfg_tabs[i].scrollbox->addChildWidget(cfg_tabs[i].options[j].label); + } + + // only for memory management + addChildWidget(cfg_tabs[i].options[j].widget, NO_TAB); + addChildWidget(cfg_tabs[i].options[j].label, NO_TAB); + } + } + + addChildWidget(activemods_lstb, MODS_TAB); + addChildWidget(activemods_lb, MODS_TAB); + addChildWidget(inactivemods_lstb, MODS_TAB); + addChildWidget(inactivemods_lb, MODS_TAB); + addChildWidget(activemods_shiftup_btn, MODS_TAB); + addChildWidget(activemods_shiftdown_btn, MODS_TAB); + addChildWidget(activemods_deactivate_btn, MODS_TAB); + addChildWidget(inactivemods_activate_btn, MODS_TAB); +} + +void MenuConfig::setupTabList() { + tablist.add(tab_control); + tablist.setPrevTabList(&tablist_main); + + if (enable_gamestate_buttons) { + tablist_main.add(ok_button); + tablist_main.add(defaults_button); + tablist_main.add(cancel_button); + } + tablist_main.setPrevTabList(&tablist); + tablist_main.setNextTabList(&tablist); + tablist_main.lock(); + + tablist_exit.setScrollType(Widget::SCROLL_VERTICAL); + tablist_exit.add(cfg_tabs[EXIT_TAB].scrollbox); + tablist_exit.setPrevTabList(&tablist); + tablist_exit.setNextTabList(&tablist_main); + tablist_exit.lock(); + + tablist_video.setScrollType(Widget::SCROLL_VERTICAL); + tablist_video.add(cfg_tabs[VIDEO_TAB].scrollbox); + tablist_video.setPrevTabList(&tablist); + tablist_video.setNextTabList(&tablist_main); + tablist_video.lock(); + + tablist_audio.setScrollType(Widget::SCROLL_VERTICAL); + tablist_audio.add(cfg_tabs[AUDIO_TAB].scrollbox); + tablist_audio.setPrevTabList(&tablist); + tablist_audio.setNextTabList(&tablist_main); + tablist_audio.lock(); + + tablist_interface.setScrollType(Widget::SCROLL_VERTICAL); + tablist_interface.add(cfg_tabs[INTERFACE_TAB].scrollbox); + tablist_interface.setPrevTabList(&tablist); + tablist_interface.setNextTabList(&tablist_main); + tablist_interface.lock(); + + tablist_input.setScrollType(Widget::SCROLL_VERTICAL); + tablist_input.add(cfg_tabs[INPUT_TAB].scrollbox); + tablist_input.setPrevTabList(&tablist); + tablist_input.setNextTabList(&tablist_main); + tablist_input.lock(); + + tablist_keybinds.setScrollType(Widget::SCROLL_VERTICAL); + tablist_keybinds.add(cfg_tabs[KEYBINDS_TAB].scrollbox); + tablist_keybinds.setPrevTabList(&tablist); + tablist_keybinds.setNextTabList(&tablist_main); + tablist_keybinds.lock(); + + tablist_mods.add(inactivemods_lstb); + tablist_mods.add(activemods_lstb); + tablist_mods.add(inactivemods_activate_btn); + tablist_mods.add(activemods_deactivate_btn); + tablist_mods.add(activemods_shiftup_btn); + tablist_mods.add(activemods_shiftdown_btn); + tablist_mods.setPrevTabList(&tablist); + tablist_mods.setNextTabList(&tablist_main); + tablist_mods.lock(); +} + +void MenuConfig::update() { + updateVideo(); + updateAudio(); + updateInterface(); + updateInput(); + updateKeybinds(); + updateMods(); +} + +void MenuConfig::updateVideo() { + fullscreen_cb->setChecked(settings->fullscreen); + hwsurface_cb->setChecked(settings->hwsurface); + vsync_cb->setChecked(settings->vsync); + texture_filter_cb->setChecked(settings->texture_filter); + dpi_scaling_cb->setChecked(settings->dpi_scaling); + parallax_layers_cb->setChecked(settings->parallax_layers); + change_gamma_cb->setChecked(settings->change_gamma); + + if (settings->change_gamma) { + render_device->setGamma(settings->gamma); + } + else { + settings->gamma = 1.0; + gamma_sl->enabled = false; + render_device->resetGamma(); + } + gamma_sl->set(GAMMA_MIN, GAMMA_MAX, static_cast<int>(settings->gamma * 10.0)); + + refreshRenderers(); + + cfg_tabs[VIDEO_TAB].scrollbox->refresh(); +} + +void MenuConfig::updateAudio() { + if (settings->audio) { + music_volume_sl->set(0, 128, settings->music_volume); + snd->setVolumeMusic(settings->music_volume); + sound_volume_sl->set(0, 128, settings->sound_volume); + snd->setVolumeSFX(settings->sound_volume); + } + else { + music_volume_sl->set(0,128,0); + sound_volume_sl->set(0,128,0); + } + + cfg_tabs[AUDIO_TAB].scrollbox->refresh(); +} + +void MenuConfig::updateInterface() { + show_fps_cb->setChecked(settings->show_fps); + colorblind_cb->setChecked(settings->colorblind); + hardware_cursor_cb->setChecked(settings->hardware_cursor); + dev_mode_cb->setChecked(settings->dev_mode); + subtitles_cb->setChecked(settings->subtitles); + statbar_labels_cb->setChecked(settings->statbar_labels); + statbar_autohide_cb->setChecked(settings->statbar_autohide); + combat_text_cb->setChecked(settings->combat_text); + auto_equip_cb->setChecked(settings->auto_equip); + entity_markers_cb->setChecked(settings->entity_markers); + low_hp_warning_lstb->select(settings->low_hp_warning_type); + low_hp_threshold_lstb->select((settings->low_hp_threshold/5)-1); + item_compare_tips_cb->setChecked(settings->item_compare_tips); + + loot_tooltip_lstb->select(settings->loot_tooltips); + minimap_lstb->select(settings->minimap_mode); + + refreshLanguages(); + + cfg_tabs[INTERFACE_TAB].scrollbox->refresh(); +} + +void MenuConfig::updateInput() { + mouse_aim_cb->setChecked(settings->mouse_aim); + no_mouse_cb->setChecked(settings->no_mouse); + mouse_move_cb->setChecked(settings->mouse_move); + mouse_move_swap_cb->setChecked(settings->mouse_move_swap); + mouse_move_attack_cb->setChecked(settings->mouse_move_attack); + + if (settings->enable_joystick && inpt->getNumJoysticks() > 0) { + inpt->initJoystick(); + joystick_device_lstb->select(settings->joystick_device + 1); + } + + joystick_deadzone_sl->set(0, 32768, settings->joy_deadzone); + + cfg_tabs[INPUT_TAB].scrollbox->refresh(); +} + +void MenuConfig::updateKeybinds() { + // now do labels for keybinds that are set + for (unsigned int i = 0; i < keybinds_btn.size(); i++) { + if (i % 3 == 0) { + keybinds_btn[i]->setLabel(inpt->getBindingString(i/3)); + keybinds_btn[i+1]->setLabel(inpt->getBindingString(i/3, InputState::BINDING_ALT)); + keybinds_btn[i+2]->setLabel(inpt->getBindingString(i/3, InputState::BINDING_JOYSTICK)); + + keybinds_btn[i]->refresh(); + keybinds_btn[i+1]->refresh(); + keybinds_btn[i+2]->refresh(); + } + } + cfg_tabs[KEYBINDS_TAB].scrollbox->refresh(); +} + +void MenuConfig::updateMods() { + activemods_lstb->refresh(); + inactivemods_lstb->refresh(); +} + +void MenuConfig::logic() { + if (inpt->window_resized) + refreshWidgets(); + + if (defaults_confirm->visible) { + // reset defaults confirmation + logicDefaults(); + return; + } + else if (input_confirm->visible) { + // assign a keybind + input_confirm->logic(); + scanKey(input_key); + input_confirm_timer.tick(); + if (input_confirm_timer.isEnd()) + input_confirm->visible = false; + return; + } + else { + if (!logicMain()) + return; + } + + // tab contents + active_tab = tab_control->getActiveTab(); + + if (active_tab == EXIT_TAB) { + if (hero) { + pause_time_text->setText(Utils::getTimeString(hero->time_played)); + } + tablist.setNextTabList(&tablist_exit); + logicExit(); + } + if (active_tab == VIDEO_TAB) { + tablist.setNextTabList(&tablist_video); + logicVideo(); + } + else if (active_tab == AUDIO_TAB) { + tablist.setNextTabList(&tablist_audio); + logicAudio(); + } + else if (active_tab == INTERFACE_TAB) { + tablist.setNextTabList(&tablist_interface); + logicInterface(); + + // TODO remove this? + if (platform.force_hardware_cursor) { + // for some platforms, hardware mouse cursor can not be turned off + settings->hardware_cursor = true; + hardware_cursor_cb->setChecked(settings->hardware_cursor); + } + } + else if (active_tab == INPUT_TAB) { + tablist.setNextTabList(&tablist_input); + logicInput(); + } + else if (active_tab == KEYBINDS_TAB) { + tablist.setNextTabList(&tablist_keybinds); + logicKeybinds(); + } + else if (active_tab == MODS_TAB) { + tablist.setNextTabList(&tablist_mods); + logicMods(); + } +} + +bool MenuConfig::logicMain() { + for (unsigned int i = 0; i < child_widget.size(); i++) { + if (child_widget[i]->in_focus && optiontab[i] != NO_TAB) { + tab_control->setActiveTab(optiontab[i]); + break; + } + } + + // tabs & the bottom 3 main buttons + tab_control->logic(); + tablist.logic(); + tablist_main.logic(); + tablist_exit.logic(); + tablist_video.logic(); + tablist_audio.logic(); + tablist_interface.logic(); + tablist_input.logic(); + tablist_keybinds.logic(); + tablist_mods.logic(); + + if (enable_gamestate_buttons) { + // Ok/Cancel Buttons + if (ok_button->checkClick()) { + clicked_accept = true; + + // MenuConfig deconstructed, proceed with caution + return false; + } + else if (defaults_button->checkClick()) { + defaults_confirm->visible = true; + return true; + } + else if (cancel_button->checkClick() || (inpt->pressing[Input::CANCEL] && !inpt->lock[Input::CANCEL])) { + clicked_cancel = true; + + // MenuConfig deconstructed, proceed with caution + return false; + } + } + + return true; +} + +void MenuConfig::logicDefaults() { + defaults_confirm->logic(); + if (defaults_confirm->confirmClicked) { + settings->fullscreen = false; + settings->loadDefaults(); + eset->load(); + inpt->defaultQwertyKeyBindings(); + inpt->defaultJoystickBindings(); + update(); + render_device->windowResize(); + defaults_confirm->visible = false; + defaults_confirm->confirmClicked = false; + } +} + +void MenuConfig::logicExit() { + cfg_tabs[EXIT_TAB].scrollbox->logic(); + Point mouse = cfg_tabs[EXIT_TAB].scrollbox->input_assist(inpt->mouse); + + if (cfg_tabs[EXIT_TAB].options[EXIT_OPTION_CONTINUE].enabled && pause_continue_btn->checkClickAt(mouse.x, mouse.y)) { + clicked_pause_continue = true; + } + else if (cfg_tabs[EXIT_TAB].options[EXIT_OPTION_SAVE].enabled && pause_save_btn->checkClickAt(mouse.x, mouse.y)) { + clicked_pause_save = true; + } + else if (cfg_tabs[EXIT_TAB].options[EXIT_OPTION_EXIT].enabled && pause_exit_btn->checkClickAt(mouse.x, mouse.y)) { + clicked_pause_exit = true; + } +} + +void MenuConfig::logicVideo() { + cfg_tabs[VIDEO_TAB].scrollbox->logic(); + Point mouse = cfg_tabs[VIDEO_TAB].scrollbox->input_assist(inpt->mouse); + + if (cfg_tabs[VIDEO_TAB].options[Platform::Video::FULLSCREEN].enabled && fullscreen_cb->checkClickAt(mouse.x, mouse.y)) { + settings->fullscreen = fullscreen_cb->isChecked(); + render_device->setFullscreen(settings->fullscreen); + inpt->window_resized = true; + refreshWidgets(); + } + else if (cfg_tabs[VIDEO_TAB].options[Platform::Video::HWSURFACE].enabled && hwsurface_cb->checkClickAt(mouse.x, mouse.y)) { + settings->hwsurface = hwsurface_cb->isChecked(); + } + else if (cfg_tabs[VIDEO_TAB].options[Platform::Video::VSYNC].enabled && vsync_cb->checkClickAt(mouse.x, mouse.y)) { + settings->vsync = vsync_cb->isChecked(); + } + else if (cfg_tabs[VIDEO_TAB].options[Platform::Video::TEXTURE_FILTER].enabled && texture_filter_cb->checkClickAt(mouse.x, mouse.y)) { + settings->texture_filter = texture_filter_cb->isChecked(); + } + else if (cfg_tabs[VIDEO_TAB].options[Platform::Video::DPI_SCALING].enabled && dpi_scaling_cb->checkClickAt(mouse.x, mouse.y)) { + settings->dpi_scaling = dpi_scaling_cb->isChecked(); + render_device->windowResize(); + inpt->window_resized = true; + refreshWidgets(); + force_refresh_background = true; + } + else if (cfg_tabs[VIDEO_TAB].options[Platform::Video::PARALLAX_LAYERS].enabled && parallax_layers_cb->checkClickAt(mouse.x, mouse.y)) { + settings->parallax_layers = parallax_layers_cb->isChecked(); + } + else if (cfg_tabs[VIDEO_TAB].options[Platform::Video::ENABLE_GAMMA].enabled && change_gamma_cb->checkClickAt(mouse.x, mouse.y)) { + settings->change_gamma = change_gamma_cb->isChecked(); + if (settings->change_gamma) { + gamma_sl->enabled = true; + } + else { + settings->gamma = 1.0; + gamma_sl->enabled = false; + gamma_sl->set(GAMMA_MIN, GAMMA_MAX, static_cast<int>(settings->gamma * 10.0)); + render_device->resetGamma(); + } + } + else if (cfg_tabs[VIDEO_TAB].options[Platform::Video::GAMMA].enabled && gamma_sl->checkClickAt(mouse.x, mouse.y)) { + settings->gamma = static_cast<float>(gamma_sl->getValue()) * 0.1f; + render_device->setGamma(settings->gamma); + } + else if (cfg_tabs[VIDEO_TAB].options[Platform::Video::RENDERER].enabled && renderer_lstb->checkClickAt(mouse.x, mouse.y)) { + new_render_device = renderer_lstb->getValue(); + } +} + +void MenuConfig::logicAudio() { + cfg_tabs[AUDIO_TAB].scrollbox->logic(); + Point mouse = cfg_tabs[AUDIO_TAB].scrollbox->input_assist(inpt->mouse); + + if (settings->audio) { + if (cfg_tabs[AUDIO_TAB].options[Platform::Audio::MUSIC].enabled && music_volume_sl->checkClickAt(mouse.x, mouse.y)) { + if (settings->music_volume == 0) + reload_music = true; + settings->music_volume = static_cast<short>(music_volume_sl->getValue()); + snd->setVolumeMusic(settings->music_volume); + } + else if (cfg_tabs[AUDIO_TAB].options[Platform::Audio::SFX].enabled && sound_volume_sl->checkClickAt(mouse.x, mouse.y)) { + settings->sound_volume = static_cast<short>(sound_volume_sl->getValue()); + snd->setVolumeSFX(settings->sound_volume); + } + } +} + +void MenuConfig::logicInterface() { + cfg_tabs[INTERFACE_TAB].scrollbox->logic(); + Point mouse = cfg_tabs[INTERFACE_TAB].scrollbox->input_assist(inpt->mouse); + + if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::LANGUAGE].enabled && language_lstb->checkClickAt(mouse.x, mouse.y)) { + unsigned lang_id = language_lstb->getSelected(); + if (lang_id != language_lstb->getSize()) + settings->language = language_ISO[lang_id]; + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::SHOW_FPS].enabled && show_fps_cb->checkClickAt(mouse.x, mouse.y)) { + settings->show_fps = show_fps_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::COLORBLIND].enabled && colorblind_cb->checkClickAt(mouse.x, mouse.y)) { + settings->colorblind = colorblind_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::HARDWARE_CURSOR].enabled && hardware_cursor_cb->checkClickAt(mouse.x, mouse.y)) { + settings->hardware_cursor = hardware_cursor_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::DEV_MODE].enabled && dev_mode_cb->checkClickAt(mouse.x, mouse.y)) { + settings->dev_mode = dev_mode_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::SUBTITLES].enabled && subtitles_cb->checkClickAt(mouse.x, mouse.y)) { + settings->subtitles = subtitles_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::LOOT_TOOLTIPS].enabled && loot_tooltip_lstb->checkClickAt(mouse.x, mouse.y)) { + settings->loot_tooltips = static_cast<int>(loot_tooltip_lstb->getSelected()); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::MINIMAP_MODE].enabled && minimap_lstb->checkClickAt(mouse.x, mouse.y)) { + settings->minimap_mode = static_cast<int>(minimap_lstb->getSelected()); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::STATBAR_LABELS].enabled && statbar_labels_cb->checkClickAt(mouse.x, mouse.y)) { + settings->statbar_labels = statbar_labels_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::STATBAR_AUTOHIDE].enabled && statbar_autohide_cb->checkClickAt(mouse.x, mouse.y)) { + settings->statbar_autohide = statbar_autohide_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::COMBAT_TEXT].enabled && combat_text_cb->checkClickAt(mouse.x, mouse.y)) { + settings->combat_text = combat_text_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::AUTO_EQUIP].enabled && auto_equip_cb->checkClickAt(mouse.x, mouse.y)) { + settings->auto_equip = auto_equip_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::ENTITY_MARKERS].enabled && entity_markers_cb->checkClickAt(mouse.x, mouse.y)) { + settings->entity_markers = entity_markers_cb->isChecked(); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::LOW_HP_WARNING_TYPE].enabled && low_hp_warning_lstb->checkClickAt(mouse.x, mouse.y)) { + settings->low_hp_warning_type = (static_cast<int>(low_hp_warning_lstb->getSelected())); + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::LOW_HP_THRESHOLD].enabled && low_hp_threshold_lstb->checkClickAt(mouse.x, mouse.y)) { + settings->low_hp_threshold = (static_cast<int>(low_hp_threshold_lstb->getSelected())+1)*5; + } + else if (cfg_tabs[INTERFACE_TAB].options[Platform::Interface::ITEM_COMPARE_TIPS].enabled && item_compare_tips_cb->checkClickAt(mouse.x, mouse.y)) { + settings->item_compare_tips = item_compare_tips_cb->isChecked(); + } +} + +void MenuConfig::logicInput() { + cfg_tabs[INPUT_TAB].scrollbox->logic(); + Point mouse = cfg_tabs[INPUT_TAB].scrollbox->input_assist(inpt->mouse); + + if (inpt->joysticks_changed) { + disableJoystickOptions(); + refreshJoysticks(); + inpt->joysticks_changed = false; + } + + if (cfg_tabs[INPUT_TAB].options[Platform::Input::MOUSE_MOVE].enabled && mouse_move_cb->checkClickAt(mouse.x, mouse.y)) { + if (mouse_move_cb->isChecked()) { + settings->mouse_move = true; + enableMouseOptions(); + } + else settings->mouse_move=false; + } + else if (cfg_tabs[INPUT_TAB].options[Platform::Input::MOUSE_AIM].enabled && mouse_aim_cb->checkClickAt(mouse.x, mouse.y)) { + if (mouse_aim_cb->isChecked()) { + settings->mouse_aim = true; + enableMouseOptions(); + } + else settings->mouse_aim=false; + } + else if (cfg_tabs[INPUT_TAB].options[Platform::Input::NO_MOUSE].enabled && no_mouse_cb->checkClickAt(mouse.x, mouse.y)) { + if (no_mouse_cb->isChecked()) { + settings->no_mouse = true; + disableMouseOptions(); + } + else settings->no_mouse = false; + } + else if (cfg_tabs[INPUT_TAB].options[Platform::Input::MOUSE_MOVE_SWAP].enabled && mouse_move_swap_cb->checkClickAt(mouse.x, mouse.y)) { + settings->mouse_move_swap = mouse_move_swap_cb->isChecked(); + } + else if (cfg_tabs[INPUT_TAB].options[Platform::Input::MOUSE_MOVE_ATTACK].enabled && mouse_move_attack_cb->checkClickAt(mouse.x, mouse.y)) { + settings->mouse_move_attack = mouse_move_attack_cb->isChecked(); + } + else if (cfg_tabs[INPUT_TAB].options[Platform::Input::JOYSTICK_DEADZONE].enabled && joystick_deadzone_sl->checkClickAt(mouse.x, mouse.y)) { + settings->joy_deadzone = joystick_deadzone_sl->getValue(); + } + else if (cfg_tabs[INPUT_TAB].options[Platform::Input::JOYSTICK].enabled && joystick_device_lstb->checkClickAt(mouse.x, mouse.y)) { + settings->joystick_device = static_cast<int>(joystick_device_lstb->getSelected()) - 1; + if (settings->joystick_device != -1) { + settings->enable_joystick = true; + if (inpt->getNumJoysticks() > 0) { + inpt->initJoystick(); + } + } + else { + settings->enable_joystick = false; + } + } +} + +void MenuConfig::logicKeybinds() { + cfg_tabs[KEYBINDS_TAB].scrollbox->logic(); + Point mouse = cfg_tabs[KEYBINDS_TAB].scrollbox->input_assist(inpt->mouse); + + for (unsigned int i = 0; i < keybinds_btn.size(); i++) { + if ((i+1) % 3 == 0) { + keybinds_btn[i]->enabled = settings->enable_joystick; + keybinds_btn[i]->refresh(); + } + + if (!cfg_tabs[KEYBINDS_TAB].options[i].enabled) + continue; + + if (keybinds_btn[i]->checkClickAt(mouse.x,mouse.y)) { + std::string confirm_msg; + confirm_msg = msg->get("Assign:") + ' ' + inpt->binding_name[i/3]; + delete input_confirm; + input_confirm = new MenuConfirm(msg->get("Clear"),confirm_msg); + input_confirm_timer.reset(Timer::BEGIN); + input_confirm->visible = true; + input_key = i; + inpt->last_button = -1; + inpt->last_key = -1; + inpt->last_joybutton = -1; + } + } +} + +void MenuConfig::logicMods() { + if (activemods_lstb->checkClick()) { + //do nothing + } + else if (inactivemods_lstb->checkClick()) { + //do nothing + } + else if (activemods_shiftup_btn->checkClick()) { + activemods_lstb->shiftUp(); + } + else if (activemods_shiftdown_btn->checkClick()) { + activemods_lstb->shiftDown(); + } + else if (activemods_deactivate_btn->checkClick()) { + disableMods(); + } + else if (inactivemods_activate_btn->checkClick()) { + enableMods(); + } +} + +void MenuConfig::render() { + int tabheight = tab_control->getTabHeight(); + Rect pos; + pos.x = (settings->view_w - eset->resolutions.frame_w)/2; + pos.y = (settings->view_h - eset->resolutions.frame_h)/2 + tabheight - tabheight/16; + + if (background) { + background->setDestFromRect(pos); + render_device->render(background); + } + + tab_control->render(); + + if (enable_gamestate_buttons) { + // render OK/Defaults/Cancel buttons + ok_button->render(); + cancel_button->render(); + defaults_button->render(); + } + + renderTabContents(); + renderDialogs(); +} + +void MenuConfig::renderTabContents() { + if (active_tab == EXIT_TAB) { + if (cfg_tabs[active_tab].scrollbox->update) { + cfg_tabs[active_tab].scrollbox->refresh(); + + // only draw a separator between the buttons and the time played text + Image* render_target = cfg_tabs[active_tab].scrollbox->contents->getGraphics(); + int offset = (MenuConfig::ENABLE_SAVE_GAME && eset->misc.save_anywhere) ? 3 : 2; + render_target->drawLine(scrollpane_padding.x, offset * scrollpane_padding.y, scrollpane.w - scrollpane_padding.x - 1, offset * scrollpane_padding.y, scrollpane_separator_color); + } + cfg_tabs[active_tab].scrollbox->render(); + } + else if (active_tab <= KEYBINDS_TAB) { + if (cfg_tabs[active_tab].scrollbox->update) { + cfg_tabs[active_tab].scrollbox->refresh(); + + Image* render_target = cfg_tabs[active_tab].scrollbox->contents->getGraphics(); + + for (int i = 1; i < cfg_tabs[active_tab].enabled_count; ++i) { + if (active_tab == KEYBINDS_TAB) { + if (i % 3 != 0) + continue; + } + render_target->drawLine(scrollpane_padding.x, i * scrollpane_padding.y, scrollpane.w - scrollpane_padding.x - 1, i * scrollpane_padding.y, scrollpane_separator_color); + } + } + cfg_tabs[active_tab].scrollbox->render(); + } + + for (unsigned int i = 0; i < child_widget.size(); i++) { + if (optiontab[i] == active_tab && optiontab[i] != NO_TAB) + child_widget[i]->render(); + } + +} + +void MenuConfig::renderDialogs() { + if (defaults_confirm->visible) + defaults_confirm->render(); + + if (input_confirm->visible) + input_confirm->render(); + + if (active_tab == KEYBINDS_TAB && !keybind_msg.empty()) { + TooltipData keybind_tip_data; + keybind_tip_data.addText(keybind_msg); + + if (keybind_tip_timer.isEnd()) + keybind_tip_timer.reset(Timer::BEGIN); + + keybind_tip_timer.tick(); + + if (!keybind_tip_timer.isEnd()) { + keybind_tip->render(keybind_tip_data, Point(settings->view_w, 0), TooltipData::STYLE_FLOAT); + } + else { + keybind_msg.clear(); + } + } + else { + keybind_msg.clear(); + keybind_tip_timer.reset(Timer::END); + } +} + +void MenuConfig::placeLabeledWidget(WidgetLabel *lb, Widget *w, int x1, int y1, int x2, int y2, std::string const& str, int justify) { + if (w) { + w->setBasePos(x2, y2, Utils::ALIGN_TOPLEFT); + } + + if (lb) { + lb->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); + lb->setText(str); + lb->setJustify(justify); + } +} + +void MenuConfig::placeLabeledWidgetAuto(int tab, int cfg_index) { + WidgetLabel *lb = cfg_tabs[tab].options[cfg_index].label; + Widget *w = cfg_tabs[tab].options[cfg_index].widget; + int enabled_index = cfg_tabs[tab].getEnabledIndex(cfg_index); + + if (w) { + int y_offset = std::max(scrollpane_padding.y - w->pos.h, 0) / 2; + w->setBasePos(scrollpane.w - w->pos.w - scrollpane_padding.x, (enabled_index * scrollpane_padding.y) + y_offset, Utils::ALIGN_TOPLEFT); + w->setPos(0,0); + } + + if (lb) { + lb->setBasePos(scrollpane_padding.x, (enabled_index * scrollpane_padding.y) + scrollpane_padding.y / 2, Utils::ALIGN_TOPLEFT); + lb->setPos(0, 0); + lb->setVAlign(LabelInfo::VALIGN_CENTER); + } +} + +void MenuConfig::refreshWidgets() { + tab_control->setMainArea(((settings->view_w - eset->resolutions.frame_w)/2) + tab_offset.x, ((settings->view_h - eset->resolutions.frame_h)/2) + tab_offset.y); + + frame.x = ((settings->view_w - eset->resolutions.frame_w)/2) + frame_offset.x; + frame.y = ((settings->view_h - eset->resolutions.frame_h)/2) + tab_control->getTabHeight() + frame_offset.y; + + for (unsigned i=0; i<child_widget.size(); ++i) { + if (optiontab[i] != NO_TAB) + child_widget[i]->setPos(frame.x, frame.y); + } + + ok_button->setPos(0, 0); + defaults_button->setPos(0, 0); + cancel_button->setPos(0, 0); + + defaults_confirm->align(); + + for (size_t i = 0; i < cfg_tabs.size(); ++i) { + cfg_tabs[i].scrollbox->setPos(frame.x, frame.y); + } + + input_confirm->align(); +} + +void MenuConfig::addChildWidget(Widget *w, int tab) { + child_widget.push_back(w); + optiontab.push_back(tab); +} + +void MenuConfig::refreshLanguages() { + language_ISO.clear(); + language_lstb->clear(); + + FileParser infile; + if (infile.open("engine/languages.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { + int i = 0; + while (infile.next()) { + std::string key = infile.key; + if (key != "") { + language_ISO.push_back(key); + language_lstb->append(infile.val, infile.val + " [" + infile.key + "]"); + + if (language_ISO.back() == settings->language) { + language_lstb->select(i); + } + + i++; + } + } + infile.close(); + } +} + +void MenuConfig::refreshFont() { + delete font; + font = getFontEngine(); + delete comb; + comb = new CombatText(); +} + +void MenuConfig::enableMods() { + for (int i=0; i<inactivemods_lstb->getSize(); i++) { + if (inactivemods_lstb->isSelected(i)) { + activemods_lstb->append(inactivemods_lstb->getValue(i),inactivemods_lstb->getTooltip(i)); + inactivemods_lstb->remove(i); + i--; + } + } +} + +void MenuConfig::disableMods() { + for (int i=0; i<activemods_lstb->getSize(); i++) { + if (activemods_lstb->isSelected(i) && activemods_lstb->getValue(i) != mods->FALLBACK_MOD) { + inactivemods_lstb->append(activemods_lstb->getValue(i),activemods_lstb->getTooltip(i)); + activemods_lstb->remove(i); + i--; + } + } + inactivemods_lstb->sort(); +} + +bool MenuConfig::setMods() { + // Save new mods list and return true if modlist was changed. Else return false + + std::vector<Mod> temp_list = mods->mod_list; + mods->mod_list.clear(); + mods->mod_list.push_back(mods->loadMod(mods->FALLBACK_MOD)); + + for (int i=0; i<activemods_lstb->getSize(); i++) { + if (activemods_lstb->getValue(i) != "") + mods->mod_list.push_back(mods->loadMod(activemods_lstb->getValue(i))); + } + + mods->applyDepends(); + + if (mods->mod_list != temp_list) { + mods->saveMods(); + return true; + } + else { + return false; + } +} + +std::string MenuConfig::createModTooltip(Mod *mod) { + std::string ret = ""; + if (mod) { + std::string mod_ver = (*mod->version == VersionInfo::MIN) ? "" : mod->version->getString(); + std::string engine_ver = VersionInfo::createVersionReqString(*mod->engine_min_version, *mod->engine_max_version); + + ret = mod->name + '\n'; + + std::string mod_description = mod->getLocaleDescription(settings->language); + if (!mod_description.empty()) { + ret += '\n'; + ret += mod_description + '\n'; + } + + bool middle_section = false; + if (!mod_ver.empty()) { + middle_section = true; + ret += '\n'; + ret += msg->get("Version:") + ' ' + mod_ver; + } + if (!mod->game.empty() && mod->game != mods->FALLBACK_GAME) { + middle_section = true; + ret += '\n'; + ret += msg->get("Game:") + ' ' + mod->game; + } + if (!engine_ver.empty()) { + middle_section = true; + ret += '\n'; + ret += msg->get("Engine version:") + ' ' + engine_ver; + } + + if (middle_section) + ret += '\n'; + + if (!mod->depends.empty()) { + ret += '\n'; + ret += msg->get("Requires mods:") + '\n'; + for (size_t i=0; i<mod->depends.size(); ++i) { + ret += "- " + mod->depends[i]; + std::string depend_ver = VersionInfo::createVersionReqString(*mod->depends_min[i], *mod->depends_max[i]); + if (depend_ver != "") + ret += " (" + depend_ver + ")"; + if (i < mod->depends.size()-1) + ret += '\n'; + } + } + + if (!ret.empty() && ret[ret.size() - 1] == '\n') + ret.erase(ret.begin() + ret.size() - 1); + } + return ret; +} + +void MenuConfig::confirmKey(int button) { + inpt->pressing[button] = false; + inpt->lock[button] = false; + + input_confirm->visible = false; + input_confirm_timer.reset(Timer::END); + keybind_tip_timer.reset(Timer::END); + + inpt->refresh_hotkeys = true; + + updateKeybinds(); +} + +void MenuConfig::scanKey(int button) { + int column = button % 3; + int real_button = button / 3; + + // clear the keybind if the user clicks "Clear" in the dialog + if (input_confirm->visible && input_confirm->confirmClicked) { + inpt->setKeybind(-1, real_button, column, keybind_msg); + confirmKey(real_button); + return; + } + + if (input_confirm->visible && !input_confirm->isWithinButtons) { + // keyboard & mouse + if (column == InputState::BINDING_DEFAULT || column == InputState::BINDING_ALT) { + if (inpt->last_button != -1) { + // mouse + inpt->setKeybind(inpt->last_button, real_button, column, keybind_msg); + confirmKey(real_button); + } + else if (inpt->last_key != -1) { + // keyboard + inpt->setKeybind(inpt->last_key, real_button, column, keybind_msg); + confirmKey(real_button); + } + } + // joystick + else if (column == InputState::BINDING_JOYSTICK && inpt->last_joybutton != -1) { + inpt->setKeybind(inpt->last_joybutton, real_button, column, keybind_msg); + confirmKey(real_button); + } + else if (column == InputState::BINDING_JOYSTICK && inpt->last_joyaxis != -1) { + inpt->setKeybind(inpt->last_joyaxis, real_button, column, keybind_msg); + confirmKey(real_button); + } + } +} + +void MenuConfig::enableMouseOptions() { + settings->no_mouse = false; + no_mouse_cb->setChecked(settings->no_mouse); +} + +void MenuConfig::disableMouseOptions() { + settings->mouse_aim = false; + mouse_aim_cb->setChecked(settings->mouse_aim); + + settings->mouse_move = false; + mouse_move_cb->setChecked(settings->mouse_move); + + settings->no_mouse = true; + no_mouse_cb->setChecked(settings->no_mouse); +} + +void MenuConfig::disableJoystickOptions() { + settings->enable_joystick = false; + + joystick_device_lstb->select(0); + + if (inpt->getNumJoysticks() > 0) + joystick_device_lstb->refresh(); +} + +void MenuConfig::refreshRenderers() { + renderer_lstb->clear(); + + std::vector<std::string> rd_name, rd_desc; + createRenderDeviceList(msg, rd_name, rd_desc); + + for (size_t i = 0; i < rd_name.size(); ++i) { + renderer_lstb->append(rd_name[i], rd_desc[i]); + if (rd_name[i] == settings->render_device_name) { + renderer_lstb->select(static_cast<int>(i)); + } + } +} + +void MenuConfig::refreshJoysticks() { + joystick_device_lstb->clear(); + joystick_device_lstb->append(msg->get("(none)"), ""); + joystick_device_lstb->enabled = inpt->getNumJoysticks() > 0; + + for (int i = 0; i < inpt->getNumJoysticks(); ++i) { + std::string joystick_name = inpt->getJoystickName(i); + if (joystick_name != "") + joystick_device_lstb->append(joystick_name, joystick_name); + } + + joystick_device_lstb->refresh(); +} + +std::string MenuConfig::getRenderDevice() { + return renderer_lstb->getValue(); +} + +void MenuConfig::setPauseExitText(bool enable_save) { + pause_exit_btn->setLabel((eset->misc.save_onexit && enable_save) ? msg->get("Save & Exit") : msg->get("Exit")); +} + +void MenuConfig::setPauseSaveEnabled(bool enable_save) { + pause_save_btn->enabled = enable_save && eset->misc.save_anywhere; +} + +void MenuConfig::resetSelectedTab() { + update(); + + tab_control->setActiveTab(0); + + for (size_t i = 0; i < cfg_tabs.size(); ++i) { + cfg_tabs[i].scrollbox->scrollToTop(); + } + + tablist.defocus(); + tablist_main.defocus(); + tablist_exit.defocus(); + tablist_video.defocus(); + tablist_audio.defocus(); + tablist_interface.defocus(); + tablist_input.defocus(); + tablist_keybinds.defocus(); + tablist_mods.defocus(); + + input_confirm->visible = false; + input_confirm_timer.reset(Timer::END); + keybind_tip_timer.reset(Timer::END); +} + +void MenuConfig::cleanup() { + if (background) { + delete background; + background = NULL; + } + + if (tab_control != NULL) { + delete tab_control; + tab_control = NULL; + } + + if (ok_button != NULL) { + delete ok_button; + ok_button = NULL; + } + if (defaults_button != NULL) { + delete defaults_button; + defaults_button = NULL; + } + if (cancel_button != NULL) { + delete cancel_button; + cancel_button = NULL; + } + + cleanupTabContents(); + cleanupDialogs(); + + language_ISO.clear(); +} + +void MenuConfig::cleanupTabContents() { + for (std::vector<Widget*>::iterator iter = child_widget.begin(); iter != child_widget.end(); ++iter) { + if (*iter != NULL) { + delete (*iter); + *iter = NULL; + } + } + child_widget.clear(); + + for (size_t i = 0; i < cfg_tabs.size(); ++i) { + if (cfg_tabs[i].scrollbox != NULL) { + delete cfg_tabs[i].scrollbox; + cfg_tabs[i].scrollbox = NULL; + } + } +} + +void MenuConfig::cleanupDialogs() { + if (defaults_confirm != NULL) { + delete defaults_confirm; + defaults_confirm = NULL; + } + if (input_confirm != NULL) { + delete input_confirm; + input_confirm = NULL; + } + if (keybind_tip != NULL) { + delete keybind_tip; + keybind_tip = NULL; + } +} + +void MenuConfig::setHero(Avatar* _hero) { + hero = _hero; +} diff --git a/src/MenuConfig.h b/src/MenuConfig.h new file mode 100644 index 0000000..203a406 --- /dev/null +++ b/src/MenuConfig.h @@ -0,0 +1,321 @@ +/* +Copyright © 2012 Clint Bellanger +Copyright © 2012 davidriod +Copyright © 2012 Igor Paliychuk +Copyright © 2013 Kurt Rinnert +Copyright © 2014-2016 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/** + * MenuConfig + * + * Handle game Settings Menu + */ + +#ifndef MENUCONFIG_H +#define MENUCONFIG_H + +#include "CommonIncludes.h" +#include "TooltipData.h" +#include "Widget.h" + +class Avatar; +class FileParser; +class MenuConfirm; +class Mod; +class Widget; +class WidgetButton; +class WidgetCheckBox; +class WidgetHorizontalList; +class WidgetLabel; +class WidgetListBox; +class WidgetScrollBox; +class WidgetSlider; +class WidgetTabControl; +class WidgetTooltip; + +class MenuConfig { +private: + class ConfigOption { + public: + ConfigOption(); + ~ConfigOption(); + + bool enabled; + WidgetLabel* label; + Widget* widget; + }; + + class ConfigTab { + public: + ConfigTab(); + ~ConfigTab(); + void setOptionWidgets(int index, WidgetLabel* lb, Widget* w, const std::string& lb_text); + void setOptionEnabled(int index, bool enable); + int getEnabledIndex(int option_index); + + WidgetScrollBox* scrollbox; + int enabled_count; + std::vector<ConfigOption> options; + }; + + static const int GAMMA_MIN = 5; + static const int GAMMA_MAX = 15; + + std::vector<ConfigTab> cfg_tabs; + + bool is_game_state; + bool enable_gamestate_buttons; + Avatar *hero; + +public: + static const bool IS_GAME_STATE = true; + static const bool ENABLE_SAVE_GAME = true; + + static const short TAB_COUNT = 7; + enum { + EXIT_TAB = 0, + VIDEO_TAB = 1, + AUDIO_TAB = 2, + INTERFACE_TAB = 3, + INPUT_TAB = 4, + KEYBINDS_TAB = 5, + MODS_TAB = 6 + }; + static const short NO_TAB = -1; + + enum { + EXIT_OPTION_CONTINUE = 0, + EXIT_OPTION_SAVE = 1, + EXIT_OPTION_EXIT = 2, + EXIT_OPTION_TIME_PLAYED = 3, + }; + + explicit MenuConfig(bool _is_game_state); + ~MenuConfig(); + + void init(); + void readConfig(); + bool parseKeyButtons(FileParser &infile); + bool parseKey(FileParser &infile, int &x1, int &y1, int &x2, int &y2); + void addChildWidgets(); + void setupTabList(); + + void update(); + void updateVideo(); + void updateAudio(); + void updateInterface(); + void updateInput(); + void updateKeybinds(); + void updateMods(); + + void logic(); + bool logicMain(); + void logicDefaults(); + void logicExit(); + void logicVideo(); + void logicAudio(); + void logicInterface(); + void logicInput(); + void logicKeybinds(); + void logicMods(); + + void render(); + void renderTabContents(); + void renderDialogs(); + + void placeLabeledWidget(WidgetLabel* lb, Widget* w, int x1, int y1, int x2, int y2, std::string const& str, int justify = 0); + void placeLabeledWidgetAuto(int tab, int cfg_index); + void refreshWidgets(); + void addChildWidget(Widget *w, int tab); + void refreshRenderers(); + void refreshJoysticks(); + void refreshLanguages(); + void refreshFont(); + std::string getRenderDevice(); + void setPauseExitText(bool enable_save); + void setPauseSaveEnabled(bool enable_save); + void resetSelectedTab(); + + void confirmKey(int button); + void scanKey(int button); + + void enableMouseOptions(); + void disableMouseOptions(); + void disableJoystickOptions(); + + void enableMods(); + void disableMods(); + bool setMods(); + std::string createModTooltip(Mod *mod); + + void cleanup(); + void cleanupTabContents(); + void cleanupDialogs(); + + void setHero(Avatar* _hero); + + TabList tablist; + TabList tablist_main; + TabList tablist_exit; + TabList tablist_video; + TabList tablist_audio; + TabList tablist_interface; + TabList tablist_input; + TabList tablist_keybinds; + TabList tablist_mods; + + std::vector<int> optiontab; + std::vector<Widget*> child_widget; + + WidgetTabControl * tab_control; + WidgetButton * ok_button; + WidgetButton * defaults_button; + WidgetButton * cancel_button; + Sprite * background; + MenuConfirm * input_confirm; + MenuConfirm * defaults_confirm; + + WidgetLabel * pause_continue_lb; + WidgetButton * pause_continue_btn; + WidgetLabel * pause_exit_lb; + WidgetButton * pause_exit_btn; + WidgetLabel * pause_save_lb; + WidgetButton * pause_save_btn; + WidgetLabel * pause_time_lb; + WidgetLabel * pause_time_text; + + WidgetHorizontalList * renderer_lstb; + WidgetLabel * renderer_lb; + WidgetCheckBox * fullscreen_cb; + WidgetLabel * fullscreen_lb; + WidgetCheckBox * hwsurface_cb; + WidgetLabel * hwsurface_lb; + WidgetCheckBox * vsync_cb; + WidgetLabel * vsync_lb; + WidgetCheckBox * texture_filter_cb; + WidgetLabel * texture_filter_lb; + WidgetCheckBox * dpi_scaling_cb; + WidgetLabel * dpi_scaling_lb; + WidgetCheckBox * parallax_layers_cb; + WidgetLabel * parallax_layers_lb; + WidgetCheckBox * change_gamma_cb; + WidgetLabel * change_gamma_lb; + WidgetSlider * gamma_sl; + WidgetLabel * gamma_lb; + + WidgetSlider * music_volume_sl; + WidgetLabel * music_volume_lb; + WidgetSlider * sound_volume_sl; + WidgetLabel * sound_volume_lb; + + WidgetCheckBox * show_fps_cb; + WidgetLabel * show_fps_lb; + WidgetCheckBox * hardware_cursor_cb; + WidgetLabel * hardware_cursor_lb; + WidgetCheckBox * colorblind_cb; + WidgetLabel * colorblind_lb; + WidgetCheckBox * dev_mode_cb; + WidgetLabel * dev_mode_lb; + WidgetCheckBox * subtitles_cb; + WidgetLabel * subtitles_lb; + WidgetHorizontalList * loot_tooltip_lstb; + WidgetLabel * loot_tooltip_lb; + WidgetHorizontalList * minimap_lstb; + WidgetLabel * minimap_lb; + WidgetCheckBox * statbar_labels_cb; + WidgetLabel * statbar_labels_lb; + WidgetCheckBox * statbar_autohide_cb; + WidgetLabel * statbar_autohide_lb; + WidgetCheckBox * combat_text_cb; + WidgetLabel * combat_text_lb; + WidgetCheckBox * auto_equip_cb; + WidgetLabel * auto_equip_lb; + WidgetCheckBox * entity_markers_cb; + WidgetLabel * entity_markers_lb; + WidgetHorizontalList * low_hp_warning_lstb; + WidgetLabel * low_hp_warning_lb; + WidgetHorizontalList * low_hp_threshold_lstb; + WidgetLabel * low_hp_threshold_lb; + WidgetCheckBox * item_compare_tips_cb; + WidgetLabel * item_compare_tips_lb; + + + WidgetHorizontalList * joystick_device_lstb; + WidgetLabel * joystick_device_lb; + WidgetCheckBox * mouse_move_cb; + WidgetLabel * mouse_move_lb; + WidgetCheckBox * mouse_aim_cb; + WidgetLabel * mouse_aim_lb; + WidgetCheckBox * no_mouse_cb; + WidgetLabel * no_mouse_lb; + WidgetCheckBox * mouse_move_swap_cb; + WidgetLabel * mouse_move_swap_lb; + WidgetCheckBox * mouse_move_attack_cb; + WidgetLabel * mouse_move_attack_lb; + WidgetSlider * joystick_deadzone_sl; + WidgetLabel * joystick_deadzone_lb; + + WidgetListBox * activemods_lstb; + WidgetLabel * activemods_lb; + WidgetListBox * inactivemods_lstb; + WidgetLabel * inactivemods_lb; + WidgetHorizontalList * language_lstb; + WidgetLabel * language_lb; + WidgetButton * activemods_shiftup_btn; + WidgetButton * activemods_shiftdown_btn; + WidgetButton * activemods_deactivate_btn; + WidgetButton * inactivemods_activate_btn; + + int active_tab; + + Point frame; + Point frame_offset; + Point tab_offset; + Rect scrollpane; + Color scrollpane_color; + Point scrollpane_padding; + Color scrollpane_separator_color; + Point secondary_offset; + + std::vector<std::string> language_ISO; + + std::string new_render_device; + std::vector<Rect> video_modes; + + std::vector<WidgetLabel *> keybinds_lb; + std::vector<WidgetButton *> keybinds_btn; + + Timer input_confirm_timer; + int input_key; + unsigned key_count; + + std::string keybind_msg; + Timer keybind_tip_timer; + WidgetTooltip* keybind_tip; + + // flags for GameState* + bool clicked_accept; + bool clicked_cancel; + bool force_refresh_background; + bool reload_music; + bool clicked_pause_continue; + bool clicked_pause_exit; + bool clicked_pause_save; +}; + +#endif + diff --git a/src/MenuDevConsole.cpp b/src/MenuDevConsole.cpp index 4377ad7..1a7a166 100644 --- a/src/MenuDevConsole.cpp +++ b/src/MenuDevConsole.cpp @@ -21,8 +21,8 @@ #include "Avatar.h" #include "CampaignManager.h" -#include "Enemy.h" -#include "EnemyManager.h" +#include "Entity.h" +#include "EntityManager.h" #include "EventManager.h" #include "FileParser.h" #include "FontEngine.h" @@ -33,6 +33,8 @@ #include "MenuManager.h" #include "MessageEngine.h" #include "ModManager.h" +#include "NPC.h" +#include "NPCManager.h" #include "PowerManager.h" #include "Settings.h" #include "SharedGameResources.h" @@ -194,7 +196,7 @@ if (inpt->pressing[Input::MAIN2] && !inpt->lock[Input::MAIN2]) { inpt->lock[Input::MAIN2] = true; - target = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, pc->stats.pos.x, pc->stats.pos.y); + target = Utils::screenToMap(inpt->mouse.x, inpt->mouse.y, mapr->cam.pos.x, mapr->cam.pos.y); log_history->addSeparator(); @@ -202,7 +204,7 @@ std::stringstream ss; if (!mapr->collider.isOutsideMap(floorf(target.x), floorf(target.y))) { getTileInfo(); - getEnemyInfo(); + getEntityInfo(); getPlayerInfo(); ss << "X=" << target.x << ", Y=" << target.y; @@ -275,10 +277,11 @@ log_history->add(ss.str(), WidgetLog::MSG_NORMAL); } -void MenuDevConsole::getEnemyInfo() { +void MenuDevConsole::getEntityInfo() { std::stringstream ss; - for (size_t i = 0; i < enemym->enemies.size(); ++i) { - const Enemy* e = enemym->enemies[i]; + // enemies & ally creatures + for (size_t i = 0; i < entitym->entities.size(); ++i) { + const Entity* e = entitym->entities[i]; if (!(static_cast<int>(target.x) == static_cast<int>(e->stats.pos.x) && static_cast<int>(target.y) == static_cast<int>(e->stats.pos.y))) continue; @@ -287,7 +290,21 @@ log_history->setNextColor(font->getColor(FontEngine::COLOR_MENU_BONUS)); log_history->add(ss.str(), WidgetLog::MSG_NORMAL); - // TODO print more enemy data + // TODO print more entity data + } + + // non-ally NPCs + for (size_t i = 0; i < npcs->npcs.size(); ++i) { + const Entity* e = npcs->npcs[i]; + if (!(static_cast<int>(target.x) == static_cast<int>(e->stats.pos.x) && static_cast<int>(target.y) == static_cast<int>(e->stats.pos.y))) + continue; + + ss.str(""); + ss << msg->get("Entity") << ": " << e->stats.name << " | X=" << e->stats.pos.x << ", Y=" << e->stats.pos.y; + log_history->setNextColor(font->getColor(FontEngine::COLOR_MENU_BONUS)); + log_history->add(ss.str(), WidgetLog::MSG_NORMAL); + + // TODO print more entity data } } @@ -426,15 +443,16 @@ std::vector<size_t> matching_ids; - for (size_t i=1; i<items->items.size(); ++i) { - if (!items->items[i].has_name) - continue; - - std::string item_name = items->getItemName(static_cast<int>(i)); + std::map<size_t, Item>::iterator item_it; + for (item_it = items->items.begin(); item_it != items->items.end(); ++item_it) { + if (!item_it->second.has_name) + continue; + + std::string item_name = items->getItemName(static_cast<int>(item_it->first)); if (!search_terms.empty() && Utils::stringFindCaseInsensitive(item_name, search_terms) == std::string::npos) continue; - matching_ids.push_back(i); + matching_ids.push_back(item_it->first); } if (!matching_ids.empty()) { @@ -503,15 +521,15 @@ std::vector<size_t> matching_ids; - for (size_t i=1; i<powers->powers.size(); ++i) { - if (powers->powers[i].is_empty) - continue; - - std::string item_name = powers->powers[i].name; - if (!search_terms.empty() && Utils::stringFindCaseInsensitive(item_name, search_terms) == std::string::npos) - continue; - - matching_ids.push_back(i); + std::map<size_t, Power>::iterator power_it; + for (power_it = powers->powers.begin(); power_it != powers->powers.end(); ++power_it) { + if (power_it->second.is_empty) + continue; + + if (!search_terms.empty() && Utils::stringFindCaseInsensitive(power_it->second.name, search_terms) == std::string::npos) + continue; + + matching_ids.push_back(power_it->first); } if (!matching_ids.empty()) { diff --git a/src/MenuDevConsole.h b/src/MenuDevConsole.h index 87ae691..8705569 100644 --- a/src/MenuDevConsole.h +++ b/src/MenuDevConsole.h @@ -37,7 +37,7 @@ void execute(); void getPlayerInfo(); void getTileInfo(); - void getEnemyInfo(); + void getEntityInfo(); void reset(); WidgetButton *button_close; diff --git a/src/MenuEnemy.cpp b/src/MenuEnemy.cpp index ee755f6..afd378a 100644 --- a/src/MenuEnemy.cpp +++ b/src/MenuEnemy.cpp @@ -25,7 +25,7 @@ */ #include "CommonIncludes.h" -#include "Enemy.h" +#include "Entity.h" #include "FileParser.h" #include "FontEngine.h" #include "Menu.h" @@ -41,6 +41,8 @@ MenuEnemy::MenuEnemy() : bar_hp(NULL) , custom_text_pos(false) + , bar_fill_offset() + , bar_fill_size(-1, -1) , enemy(NULL) { // disappear after 10 seconds @@ -65,11 +67,25 @@ custom_text_pos = true; text_pos = Parse::popLabelInfo(infile.val); } + // @ATTR bar_fill_offset|point|Offset of the bar's fill graphics relative to the bar_pos X/Y. + else if (infile.key == "bar_fill_offset") { + bar_fill_offset = Parse::toPoint(infile.val); + } + // @ATTR bar_fill_size|int, int : Width, Height|Size of the bar's fill graphics. If not defined, the width/height of bar_pos is used. + else if (infile.key == "bar_fill_size") { + bar_fill_size = Parse::toPoint(infile.val); + } else { infile.error("MenuEnemy: '%s' is not a valid key.", infile.key.c_str()); } } infile.close(); + } + + // default to bar_pos size if bar_fill_size is undefined + if (bar_fill_size.x == -1 || bar_fill_size.y == -1) { + bar_fill_size.x = bar_pos.w; + bar_fill_size.y = bar_pos.h; } loadGraphics(); @@ -116,8 +132,11 @@ int hp_bar_length = 0; if (enemy->stats.get(Stats::HP_MAX) == 0) hp_bar_length = 0; - else if (bar_hp) - hp_bar_length = (enemy->stats.hp * bar_hp->getGraphics()->getWidth()) / enemy->stats.get(Stats::HP_MAX); + else if (bar_hp) { + hp_bar_length = (enemy->stats.hp * bar_fill_size.x) / enemy->stats.get(Stats::HP_MAX); + if (hp_bar_length == 0 && enemy->stats.hp > 0) + hp_bar_length = 1; + } // draw hp bar background setBackgroundClip(src); @@ -127,9 +146,14 @@ // draw hp bar fill if (bar_hp) { src.w = hp_bar_length; - src.h = bar_pos.h; + src.h = bar_fill_size.y; + + dest.x += bar_fill_offset.x; + dest.y += bar_fill_offset.y; + bar_hp->setClipFromRect(src); bar_hp->setDestFromRect(dest); + render_device->render(bar_hp); } diff --git a/src/MenuEnemy.h b/src/MenuEnemy.h index 4af2cec..2302bc8 100644 --- a/src/MenuEnemy.h +++ b/src/MenuEnemy.h @@ -30,7 +30,7 @@ #include "Utils.h" #include "WidgetLabel.h" -class Enemy; +class Entity; class MenuEnemy : public Menu { private: @@ -38,12 +38,15 @@ Rect bar_pos; LabelInfo text_pos; bool custom_text_pos; + Point bar_fill_offset; + Point bar_fill_size; + WidgetLabel label_text; WidgetLabel label_stats; public: MenuEnemy(); ~MenuEnemy(); - Enemy *enemy; + Entity *enemy; void loadGraphics(); void handleNewMap(); void logic(); diff --git a/src/MenuExit.cpp b/src/MenuExit.cpp index 75a1c62..19a2453 100644 --- a/src/MenuExit.cpp +++ b/src/MenuExit.cpp @@ -23,140 +23,54 @@ */ #include "Avatar.h" -#include "EngineSettings.h" -#include "FileParser.h" -#include "FontEngine.h" +#include "MapRenderer.h" +#include "MenuConfig.h" +#include "MenuConfirm.h" #include "MenuExit.h" -#include "MessageEngine.h" +#include "SaveLoad.h" +#include "SharedGameResources.h" #include "SharedResources.h" -#include "SharedGameResources.h" -#include "Settings.h" -#include "SoundManager.h" -#include "UtilsParsing.h" -#include "WidgetButton.h" -#include "WidgetSlider.h" -MenuExit::MenuExit() : Menu() { - - buttonExit = new WidgetButton(WidgetButton::DEFAULT_FILE); - buttonClose = new WidgetButton(WidgetButton::DEFAULT_FILE); - - // widgets for game options - music_volume_sl = new WidgetSlider(WidgetSlider::DEFAULT_FILE); - sound_volume_sl = new WidgetSlider(WidgetSlider::DEFAULT_FILE); - - // Load config settings - FileParser infile; - // @CLASS MenuExit|Description of menus/exit.txt - if(infile.open("menus/exit.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { - while(infile.next()) { - if (parseMenuKey(infile.key, infile.val)) - continue; - else if (infile.key == "title") { - // @ATTR title|label|Position of the "Paused" text. - title_lb.setFromLabelInfo(Parse::popLabelInfo(infile.val)); - } - else if (infile.key == "exit") { - // @ATTR exit|point|Position of the "Save and Exit" button. - Point p = Parse::toPoint(infile.val); - buttonExit->setBasePos(p.x, p.y, Utils::ALIGN_TOPLEFT); - } - else if (infile.key == "continue") { - // @ATTR continue|point|Position of the "Continue" button. - Point p = Parse::toPoint(infile.val); - buttonClose->setBasePos(p.x, p.y, Utils::ALIGN_TOPLEFT); - } - else if (infile.key == "music_volume") { - // @ATTR music_volume|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Music Volume" slider relative to the frame. - Rect r = Parse::toRect(infile.val); - placeOptionWidgets(&music_volume_lb, music_volume_sl, r.x, r.y, r.w, r.h, msg->get("Music Volume")); - } - else if (infile.key == "sound_volume") { - // @ATTR sound_volume|int, int, int, int : Label X, Label Y, Widget X, Widget Y|Position of the "Sound Volume" slider relative to the frame. - Rect r = Parse::toRect(infile.val); - placeOptionWidgets(&sound_volume_lb, sound_volume_sl, r.x, r.y, r.w, r.h, msg->get("Sound Volume")); - } - else - infile.error("MenuExit: '%s' is not a valid key.", infile.key.c_str()); - } - infile.close(); - } - - title_lb.setText(msg->get("Paused")); - title_lb.setColor(font->getColor(FontEngine::COLOR_MENU_NORMAL)); - - exitClicked = false; - reload_music = false; - - exit_msg1 = msg->get("Save & Exit"); - exit_msg2 = msg->get("Exit"); - - buttonExit->setLabel(eset->misc.save_onexit ? exit_msg1 : exit_msg2); - - buttonClose->setLabel(msg->get("Continue")); - - setBackground("images/menus/pause_menu.png"); - - if (settings->audio) { - music_volume_sl->set(0, 128, settings->music_volume); - sound_volume_sl->set(0, 128, settings->sound_volume); - } - else { - music_volume_sl->set(0, 128, 0); - sound_volume_sl->set(0, 128, 0); - } - - tablist.add(buttonClose); - tablist.add(buttonExit); - tablist.add(music_volume_sl); - tablist.add(sound_volume_sl); - +MenuExit::MenuExit() + : Menu() + , menu_config(new MenuConfig(!MenuConfig::IS_GAME_STATE)) + , exitClicked(false) + , reload_music(false) +{ + menu_config->setHero(pc); align(); } void MenuExit::align() { Menu::align(); - - title_lb.setPos(window_area.x, window_area.y); - - buttonExit->setPos(window_area.x, window_area.y); - buttonExit->refresh(); - - buttonClose->setPos(window_area.x, window_area.y); - buttonClose->refresh(); - - for (size_t i=0; i<option_labels.size(); ++i) { - option_labels[i]->setPos(window_area.x, window_area.y); - } - - for (size_t i=0; i<option_widgets.size(); ++i) { - option_widgets[i]->setPos(window_area.x, window_area.y); - } + menu_config->refreshWidgets(); } void MenuExit::logic() { if (visible) { - std::string title_str = msg->get("Paused") + " [" + Utils::getTimeString(pc->time_played) + "]"; - title_lb.setText(title_str); + menu_config->logic(); + } - tablist.logic(); + if (menu_config->reload_music) { + reload_music = true; + menu_config->reload_music = false; + } - if (buttonExit->checkClick()) { - exitClicked = true; - } - else if (buttonClose->checkClick()) { - visible = false; - } - else if (settings->audio && music_volume_sl->checkClick()) { - if (settings->music_volume == 0) - reload_music = true; - settings->music_volume = static_cast<short>(music_volume_sl->getValue()); - snd->setVolumeMusic(settings->music_volume); - } - else if (settings->audio && sound_volume_sl->checkClick()) { - settings->sound_volume = static_cast<short>(sound_volume_sl->getValue()); - snd->setVolumeSFX(settings->sound_volume); - } + if (menu_config->clicked_pause_continue) { + visible = false; + menu_config->clicked_pause_continue = false; + } + else if (menu_config->clicked_pause_exit) { + exitClicked = true; + menu_config->clicked_pause_exit = false; + } + + else if (menu_config->clicked_pause_save) { + visible = false; + menu_config->clicked_pause_save = false; + + mapr->respawn_point = pc->stats.pos; + save_load->saveGame(); } } @@ -165,47 +79,28 @@ // background Menu::render(); - title_lb.render(); + menu_config->render(); + } +} - buttonExit->render(); - buttonClose->render(); +void MenuExit::disableSave() { + menu_config->setPauseExitText(!MenuConfig::ENABLE_SAVE_GAME); + menu_config->setPauseSaveEnabled(!MenuConfig::ENABLE_SAVE_GAME); +} - for (size_t i=0; i<option_labels.size(); ++i) { - option_labels[i]->render(); - } - - for (size_t i=0; i<option_widgets.size(); ++i) { - option_widgets[i]->render(); +void MenuExit::handleCancel() { + if (!visible) { + menu_config->resetSelectedTab(); + visible = true; + } + else { + if (!menu_config->input_confirm->visible) { + visible = false; } } } -void MenuExit::placeOptionWidgets(WidgetLabel *lb, Widget *w, int x1, int y1, int x2, int y2, std::string const& str) { - if (w) { - w->setBasePos(x2, y2, Utils::ALIGN_TOPLEFT); - option_widgets.push_back(w); - } - - if (lb) { - lb->setBasePos(x1, y1, Utils::ALIGN_TOPLEFT); - lb->setText(str); - lb->setJustify(FontEngine::JUSTIFY_CENTER); - option_labels.push_back(lb); - } +MenuExit::~MenuExit() { + delete menu_config; } -void MenuExit::disableSave() { - if (buttonExit) { - buttonExit->setLabel(exit_msg2); - buttonExit->refresh(); - } -} - -MenuExit::~MenuExit() { - delete buttonExit; - delete buttonClose; - - delete music_volume_sl; - delete sound_volume_sl; -} - diff --git a/src/MenuExit.h b/src/MenuExit.h index 1b2b945..10d8253 100644 --- a/src/MenuExit.h +++ b/src/MenuExit.h @@ -26,38 +26,18 @@ #include "CommonIncludes.h" #include "Menu.h" -#include "WidgetLabel.h" -class WidgetButton; -class WidgetSlider; +class MenuConfig; class MenuExit : public Menu { protected: - void placeOptionWidgets(WidgetLabel *lb, Widget *w, int x1, int y1, int x2, int y2, std::string const& str); - - WidgetButton *buttonExit; - WidgetButton *buttonClose; - WidgetLabel title_lb; - - WidgetSlider *music_volume_sl; - WidgetSlider *sound_volume_sl; - - WidgetLabel music_volume_lb; - WidgetLabel sound_volume_lb; - + MenuConfig* menu_config; bool exitClicked; - - std::vector<WidgetLabel*> option_labels; - std::vector<Widget*> option_widgets; - - std::string exit_msg1; - std::string exit_msg2; public: MenuExit(); ~MenuExit(); void align(); - void logic(); virtual void render(); @@ -66,6 +46,7 @@ } void disableSave(); + void handleCancel(); bool reload_music; }; diff --git a/src/MenuGameOver.cpp b/src/MenuGameOver.cpp new file mode 100644 index 0000000..e7e8fcb --- /dev/null +++ b/src/MenuGameOver.cpp @@ -0,0 +1,136 @@ +/* +Copyright © 2020 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +#include "FileParser.h" +#include "FontEngine.h" +#include "InputState.h" +#include "MenuGameOver.h" +#include "MessageEngine.h" +#include "SharedResources.h" +#include "UtilsParsing.h" +#include "WidgetButton.h" + +#include <string> + +MenuGameOver::MenuGameOver() + : Menu() + , button_continue(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , button_exit(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , continue_clicked(false) + , exit_clicked(false) +{ + // default layout + window_area = Rect(0,0,192,100); + alignment = Utils::ALIGN_CENTER; + button_continue->setBasePos(window_area.w/2 - button_continue->pos.w/2, window_area.h/2 - button_continue->pos.h/2, Utils::ALIGN_TOPLEFT); + button_exit->setBasePos(window_area.w/2 - button_exit->pos.w/2, window_area.h/2 + button_exit->pos.h/2, Utils::ALIGN_TOPLEFT); + label.setJustify(FontEngine::JUSTIFY_CENTER); + label.setBasePos(window_area.w/2, 8, Utils::ALIGN_TOPLEFT); + + // Load config settings + FileParser infile; + // @CLASS MenuGameOver|Description of menus/game_over.txt + if(infile.open("menus/game_over.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { + while(infile.next()) { + if (parseMenuKey(infile.key, infile.val)) + continue; + else if (infile.key == "label_title") { + // @ATTR label_title|label|Position of the "Game Over" text. + label.setFromLabelInfo(Parse::popLabelInfo(infile.val)); + } + else if (infile.key == "button_continue") { + // @ATTR button_continue|point|Position of the "Continue" button. + Point pos = Parse::toPoint(infile.val); + button_continue->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); + } + else if (infile.key == "button_exit") { + // @ATTR button_exit|point|Position of the "Exit" button. + Point pos = Parse::toPoint(infile.val); + button_exit->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); + } + } + infile.close(); + } + + label.setText(msg->get("Game Over")); + label.setColor(font->getColor(FontEngine::COLOR_MENU_NORMAL)); + + button_continue->setLabel(msg->get("Continue")); + button_exit->setLabel(msg->get("Save & Exit")); + + tablist.add(button_continue); + tablist.add(button_exit); + + setBackground("images/menus/game_over.png"); + + align(); + + visible = false; +} + +void MenuGameOver::align() { + Menu::align(); + + button_continue->setPos(window_area.x, window_area.y); + button_exit->setPos(window_area.x, window_area.y); + label.setPos(window_area.x, window_area.y); +} + +void MenuGameOver::logic() { + if (!visible) + return; + + tablist.logic(); + + if (button_continue->checkClick()) { + continue_clicked = true; + } + else if (button_exit->checkClick()) { + exit_clicked = true; + } +} + +void MenuGameOver::close() { + visible = false; + continue_clicked = false; + exit_clicked = false; + tablist.defocus(); +} + +void MenuGameOver::disableSave() { + button_continue->enabled = false; + button_exit->setLabel(msg->get("Exit")); +} + +void MenuGameOver::render() { + if (!visible) + return; + + // background + Menu::render(); + + label.render(); + + button_continue->render(); + button_exit->render(); +} + +MenuGameOver::~MenuGameOver() { + delete button_continue; + delete button_exit; +} + diff --git a/src/MenuGameOver.h b/src/MenuGameOver.h new file mode 100644 index 0000000..57d29e0 --- /dev/null +++ b/src/MenuGameOver.h @@ -0,0 +1,47 @@ +/* +Copyright © 2020 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +#ifndef MENU_GAMEOVER_H +#define MENU_GAMEOVER_H + +#include "CommonIncludes.h" +#include "Menu.h" +#include "WidgetLabel.h" + +class WidgetButton; + +class MenuGameOver : public Menu { +protected: + WidgetButton *button_continue; + WidgetButton *button_exit; + WidgetLabel label; + +public: + MenuGameOver(); + ~MenuGameOver(); + + void logic(); + void align(); + void close(); + void disableSave(); + virtual void render(); + + bool continue_clicked; + bool exit_clicked; +}; + +#endif diff --git a/src/MenuHUDLog.cpp b/src/MenuHUDLog.cpp index 35363c8..8020671 100644 --- a/src/MenuHUDLog.cpp +++ b/src/MenuHUDLog.cpp @@ -46,6 +46,7 @@ // Load config settings FileParser infile; + // @CLASS MenuHUDLog|Description of menus/hudlog.txt if(infile.open("menus/hudlog.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { while(infile.next()) { if (parseMenuKey(infile.key, infile.val)) diff --git a/src/MenuInventory.cpp b/src/MenuInventory.cpp index 5b4bc88..b927f9f 100644 --- a/src/MenuInventory.cpp +++ b/src/MenuInventory.cpp @@ -28,6 +28,7 @@ #include "CommonIncludes.h" #include "EffectManager.h" #include "EngineSettings.h" +#include "EventManager.h" #include "FileParser.h" #include "FontEngine.h" #include "Hazard.h" @@ -47,7 +48,6 @@ #include "TooltipManager.h" #include "UtilsParsing.h" #include "WidgetButton.h" -#include "WidgetCheckBox.h" #include "WidgetSlot.h" MenuInventory::MenuInventory() @@ -69,10 +69,6 @@ setBackground("images/menus/inventory.png"); closeButton = new WidgetButton("images/menus/buttons/button_x.png"); - autoEquipCheckBox = new WidgetCheckBox("images/menus/buttons/auto_equip.png"); - - autoEquipCheckBox->setChecked(settings->auto_equip); - autoEquipCheckBox->tooltip = msg->get("Automatically equip items"); // Load config settings FileParser infile; @@ -87,11 +83,6 @@ Point pos = Parse::toPoint(infile.val); closeButton->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); } - // @ATTR auto_equip|point|Position of the auto-equip toggle switch. - else if (infile.key == "auto_equip") { - Point pos = Parse::toPoint(infile.val); - autoEquipCheckBox->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); - } // @ATTR equipment_slot|repeatable(int, int, string) : X, Y, Slot Type|Position and item type of an equipment slot. else if(infile.key == "equipment_slot") { Rect area; @@ -151,8 +142,6 @@ tablist.add(inventory[CARRIED].slots[i]); } - tablist.add(autoEquipCheckBox); - align(); } @@ -171,7 +160,6 @@ inventory[CARRIED].setPos(window_area.x, window_area.y); closeButton->setPos(window_area.x, window_area.y); - autoEquipCheckBox->setPos(window_area.x, window_area.y); label_inventory.setPos(window_area.x, window_area.y); label_currency.setPos(window_area.x, window_area.y); @@ -208,7 +196,7 @@ // remove a random carried item if (eset->death_penalty.item) { - std::vector<int> removable_items; + std::vector<ItemID> removable_items; removable_items.clear(); for (int i=0; i < MAX_EQUIPPED; i++) { if (!inventory[EQUIPMENT][i].empty()) { @@ -224,7 +212,7 @@ } if (!removable_items.empty()) { size_t random_item = static_cast<size_t>(rand()) % removable_items.size(); - remove(removable_items[random_item]); + remove(removable_items[random_item], 1); death_message += msg->get("Lost %s.",items->getItemName(removable_items[random_item])); } } @@ -245,9 +233,6 @@ visible = false; snd->play(sfx_close, snd->DEFAULT_CHANNEL, snd->NO_POS, !snd->LOOP); } - else if (autoEquipCheckBox->checkClick()) { - settings->auto_equip = !settings->auto_equip; - } if (drag_prev_src == -1) { clearHighlight(); @@ -265,9 +250,6 @@ // close button closeButton->render(); - - // auto-equip toggle - autoEquipCheckBox->render(); // text overlay label_inventory.render(); @@ -562,24 +544,25 @@ if (inventory[CARRIED][slot].empty()) return; + // run the item's script if it has one + if (!items->items[inventory[CARRIED][slot].item].script.empty()) { + EventManager::executeScript(items->items[inventory[CARRIED][slot].item].script, pc->stats.pos.x, pc->stats.pos.y); + } // if the item is a book, open it - if (!items->items[inventory[CARRIED][slot].item].book.empty()) { + else if (!items->items[inventory[CARRIED][slot].item].book.empty()) { show_book = items->items[inventory[CARRIED][slot].item].book; } - // use a consumable item - else if (!items->items[inventory[CARRIED][slot].item].quest_item && - items->items[inventory[CARRIED][slot].item].type == "consumable" && - items->items[inventory[CARRIED][slot].item].power > 0) { - - int power_id = items->items[inventory[CARRIED][slot].item].power; + // use a power attached to a non-equipment item + else if (items->items[inventory[CARRIED][slot].item].power > 0 && getEquipSlotFromItem(inventory[CARRIED][slot].item, !ONLY_EMPTY_SLOTS) == -1) { + PowerID power_id = items->items[inventory[CARRIED][slot].item].power; // equipment might want to replace powers, so do it here for (int i = 0; i < inventory[EQUIPMENT].getSlotNumber(); ++i) { - int id = inventory[EQUIPMENT][i].item; + ItemID id = inventory[EQUIPMENT][i].item; for (size_t j = 0; j < items->items[id].replace_power.size(); ++j) { - if (power_id == items->items[id].replace_power[j].x) { - power_id = items->items[id].replace_power[j].y; + if (power_id == items->items[id].replace_power[j].first) { + power_id = items->items[id].replace_power[j].second; break; } } @@ -780,14 +763,14 @@ /** * Remove one given item from the player's inventory. */ -bool MenuInventory::remove(int item) { +bool MenuInventory::remove(ItemID item, int quantity) { if (activated_item != 0 && activated_slot != -1 && item == activated_item) { inventory[CARRIED].subtract(activated_slot, 1); activated_item = 0; activated_slot = -1; } - else if(!inventory[CARRIED].remove(item, 1)) { - if (!inventory[EQUIPMENT].remove(item, 1)) { + else if(!inventory[CARRIED].remove(item, quantity)) { + if (!inventory[EQUIPMENT].remove(item, quantity)) { return false; } else { @@ -914,7 +897,7 @@ if (items->items.empty()) return; - int item_id; + ItemID item_id; // calculate bonuses to basic stats, added by items bool checkRequired = true; @@ -940,9 +923,9 @@ } // calculate bonuses. added by item sets - std::vector<int> set; + std::vector<ItemSetID> set; + std::vector<ItemSetID>::iterator it; std::vector<int> quantity; - std::vector<int>::iterator it; for (int i=0; i<MAX_EQUIPPED; i++) { item_id = inventory[EQUIPMENT].storage[i].item; @@ -980,7 +963,7 @@ // defaults for (unsigned i=0; i<pc->stats.powers_list_items.size(); ++i) { - int id = pc->stats.powers_list_items[i]; + PowerID id = pc->stats.powers_list_items[i]; // pc->stats.hp > 0 is hack to keep on_death revive passives working if (powers->powers[id].passive && pc->stats.hp > 0) pc->stats.effects.removeEffectPassive(id); @@ -1006,21 +989,32 @@ } // disable any incompatible slots, unequipping items if neccessary for (int i=0; i<MAX_EQUIPPED; ++i) { - int id = inventory[EQUIPMENT][i].item; + ItemID id = inventory[EQUIPMENT][i].item; for (unsigned j=0; j<items->items[id].disable_slots.size(); ++j) { - for (int k=0; k<MAX_EQUIPPED; ++k) { - if (slot_type[k] == items->items[id].disable_slots[j]) { - if (!inventory[EQUIPMENT].storage[k].empty()) { - add(inventory[EQUIPMENT].storage[k], CARRIED, ItemStorage::NO_SLOT, ADD_PLAY_SOUND, !ADD_AUTO_EQUIP); - inventory[EQUIPMENT].storage[k].clear(); - updateEquipment(k); - applyEquipment(); - } - inventory[EQUIPMENT].slots[k]->enabled = false; - } - } - } - } + disableEquipmentSlot(items->items[id].disable_slots[j]); + } + } + + // disable equipment slots via passive powers + for (size_t i=0; i<pc->stats.powers_passive.size(); ++i) { + PowerID id = pc->stats.powers_passive[i]; + if (!powers->powers[id].passive) + continue; + + for (size_t j=0; j<powers->powers[id].disable_equip_slots.size(); ++j) { + disableEquipmentSlot(powers->powers[id].disable_equip_slots[j]); + } + } + for (size_t i=0; i<pc->stats.powers_list_items.size(); ++i) { + PowerID id = pc->stats.powers_list_items[i]; + if (!powers->powers[id].passive) + continue; + + for (size_t j=0; j<powers->powers[id].disable_equip_slots.size(); ++j) { + disableEquipmentSlot(powers->powers[id].disable_equip_slots[j]); + } + } + // update stat display pc->stats.refresh_stats = true; } @@ -1037,7 +1031,7 @@ // apply stats from all items for (int i=0; i<MAX_EQUIPPED; i++) { - int item_id = inventory[EQUIPMENT].storage[i].item; + ItemID item_id = inventory[EQUIPMENT].storage[i].item; const Item &item = items->items[item_id]; // apply base stats @@ -1073,12 +1067,12 @@ void MenuInventory::applyItemSetBonuses() { // calculate bonuses. added by item sets - std::vector<int> set; + std::vector<ItemSetID> set; + std::vector<ItemSetID>::iterator it; std::vector<int> quantity; - std::vector<int>::iterator it; for (int i=0; i<MAX_EQUIPPED; i++) { - int item_id = inventory[EQUIPMENT].storage[i].item; + ItemID item_id = inventory[EQUIPMENT].storage[i].item; it = std::find(set.begin(), set.end(), items->items[item_id].set); if (items->items[item_id].set > 0 && it != set.end()) { quantity[std::distance(set.begin(), it)] += 1; @@ -1103,31 +1097,33 @@ EffectDef ed; if (bdata->is_speed) { - ed.id = ed.type = "speed"; + ed.id = "speed"; } else if (bdata->is_attack_speed) { - ed.id = ed.type = "attack_speed"; + ed.id = "attack_speed"; } else if (bdata->stat_index != -1) { - ed.id = ed.type = Stats::KEY[bdata->stat_index]; + ed.id = Stats::KEY[bdata->stat_index]; } else if (bdata->damage_index_min != -1) { - ed.id = ed.type = eset->damage_types.list[bdata->damage_index_min].min; + ed.id = eset->damage_types.list[bdata->damage_index_min].min; } else if (bdata->damage_index_max != -1) { - ed.id = ed.type = eset->damage_types.list[bdata->damage_index_max].max; + ed.id = eset->damage_types.list[bdata->damage_index_max].max; } else if (bdata->resist_index != -1) { - ed.id = ed.type = eset->elements.list[bdata->resist_index].id + "_resist"; + ed.id = eset->elements.list[bdata->resist_index].id + "_resist"; } else if (bdata->base_index > -1 && static_cast<size_t>(bdata->base_index) < eset->primary_stats.list.size()) { - ed.id = ed.type = eset->primary_stats.list[bdata->base_index].id; + ed.id = eset->primary_stats.list[bdata->base_index].id; } else if (bdata->power_id > 0) { menu->pow->addBonusLevels(bdata->power_id, bdata->value); return; // don't add item effect } + ed.type = Effect::getTypeFromString(ed.id); + pc->stats.effects.addItemEffect(ed, 0, bdata->value); } @@ -1150,7 +1146,7 @@ void MenuInventory::fillEquipmentSlots() { // create temporary arrays int slot_number = MAX_EQUIPPED; - int *equip_item = new int[slot_number]; + ItemID *equip_item = new ItemID[slot_number]; int *equip_quantity = new int[slot_number];; // initialize arrays @@ -1198,7 +1194,7 @@ return 0; } -int MenuInventory::getEquipSlotFromItem(int item, bool only_empty_slots) { +int MenuInventory::getEquipSlotFromItem(ItemID item, bool only_empty_slots) { if (!items->requirementsMet(&pc->stats, item)) return -2; @@ -1222,21 +1218,45 @@ return equip_slot; } -int MenuInventory::getPowerMod(int meta_power) { +PowerID MenuInventory::getPowerMod(PowerID meta_power) { for (int i = 0; i < inventory[EQUIPMENT].getSlotNumber(); ++i) { - int id = inventory[EQUIPMENT][i].item; + ItemID id = inventory[EQUIPMENT][i].item; for (size_t j=0; j<items->items[id].replace_power.size(); j++) { - if (items->items[id].replace_power[j].x == meta_power && items->items[id].replace_power[j].y != meta_power) { - return items->items[id].replace_power[j].y; + if (items->items[id].replace_power[j].first == meta_power && items->items[id].replace_power[j].second != meta_power) { + return items->items[id].replace_power[j].second; } } } return 0; +} + +void MenuInventory::disableEquipmentSlot(const std::string& disable_slot_type) { + for (int i=0; i<MAX_EQUIPPED; ++i) { + if (slot_type[i] == disable_slot_type) { + if (!inventory[EQUIPMENT].storage[i].empty()) { + add(inventory[EQUIPMENT].storage[i], CARRIED, ItemStorage::NO_SLOT, ADD_PLAY_SOUND, !ADD_AUTO_EQUIP); + inventory[EQUIPMENT].storage[i].clear(); + updateEquipment(i); + applyEquipment(); + } + inventory[EQUIPMENT].slots[i]->enabled = false; + } + } +} + +bool MenuInventory::canActivateItem(ItemID item) { + if (!items->items[item].script.empty()) + return true; + if (!items->items[item].book.empty()) + return true; + if (items->items[item].power > 0 && getEquipSlotFromItem(item, !ONLY_EMPTY_SLOTS) == -1) + return true; + + return false; } MenuInventory::~MenuInventory() { delete closeButton; - delete autoEquipCheckBox; -} +} diff --git a/src/MenuInventory.h b/src/MenuInventory.h index 55c48aa..77cdf84 100644 --- a/src/MenuInventory.h +++ b/src/MenuInventory.h @@ -27,6 +27,7 @@ #define MENU_INVENTORY_H #include "CommonIncludes.h" +#include "Menu.h" #include "MenuItemStorage.h" #include "Utils.h" #include "WidgetLabel.h" @@ -34,7 +35,6 @@ class BonusData; class StatBlock; class WidgetButton; -class WidgetCheckBox; class MenuInventory : public Menu { private: @@ -42,12 +42,11 @@ void loadGraphics(); void updateEquipment(int slot); - int getEquipSlotFromItem(int item, bool only_empty_slots); + int getEquipSlotFromItem(ItemID item, bool only_empty_slots); WidgetLabel label_inventory; WidgetLabel label_currency; WidgetButton *closeButton; - WidgetCheckBox *autoEquipCheckBox; int MAX_EQUIPPED; int MAX_CARRIED; @@ -62,7 +61,7 @@ Timer tap_to_activate_timer; int activated_slot; - int activated_item; + ItemID activated_item; public: enum { @@ -94,14 +93,14 @@ void activate(const Point& position); bool add(ItemStack stack, int area, int slot, bool play_sound, bool auto_equip); - bool remove(int item); + bool remove(ItemID item, int quantity); void removeFromPrevSlot(int quantity); void addCurrency(int count); void removeCurrency(int count); bool buy(ItemStack stack, int tab, bool dragging); bool sell(ItemStack stack); - bool requirementsMet(int item); + bool requirementsMet(ItemID item); void applyEquipment(); void applyItemStats(); @@ -117,7 +116,11 @@ int getMaxPurchasable(ItemStack item, int vendor_tab); - int getPowerMod(int meta_power); + PowerID getPowerMod(PowerID meta_power); + + void disableEquipmentSlot(const std::string& slot_type); + + bool canActivateItem(ItemID item); Rect carried_area; std::vector<Rect> equipped_area; diff --git a/src/MenuItemStorage.cpp b/src/MenuItemStorage.cpp index abf6084..0f2c5ef 100644 --- a/src/MenuItemStorage.cpp +++ b/src/MenuItemStorage.cpp @@ -40,7 +40,7 @@ , drag_prev_slot(-1) , slots() , current_slot(NULL) - , highlight(NULL) + , highlight() , highlight_image(NULL) , overlay_disabled(NULL) { } @@ -51,11 +51,11 @@ grid_pos.x = _area.x; grid_pos.y = _area.y; for (int i = 0; i < _slot_number; i++) { - WidgetSlot *slot = new WidgetSlot(WidgetSlot::NO_ICON, Input::ACCEPT, WidgetSlot::SIZE_NORMAL); + WidgetSlot *slot = new WidgetSlot(WidgetSlot::NO_ICON, Input::ACCEPT); slots.push_back(slot); } nb_cols = _nb_cols; - highlight = new bool[_slot_number]; + highlight.resize(_slot_number); for (int i=0; i<_slot_number; i++) { highlight[i] = false; slots[i]->pos.x = grid_area.x + (i % nb_cols * eset->resolutions.icon_size); @@ -69,14 +69,14 @@ void MenuItemStorage::initFromList(int _slot_number, const std::vector<Rect>& _area, const std::vector<std::string>& _slot_type) { ItemStorage::init( _slot_number); for (int i = 0; i < _slot_number; i++) { - WidgetSlot *slot = new WidgetSlot(WidgetSlot::NO_ICON, Input::ACCEPT, WidgetSlot::SIZE_NORMAL); + WidgetSlot *slot = new WidgetSlot(WidgetSlot::NO_ICON, Input::ACCEPT); slot->pos = _area[i]; slot->setBasePos(slot->pos.x, slot->pos.y, Utils::ALIGN_TOPLEFT); slots.push_back(slot); } nb_cols = 0; slot_type = _slot_type; - highlight = new bool[_slot_number]; + highlight.resize(_slot_number); for (int i=0; i<_slot_number; i++) { highlight[i] = false; } @@ -232,12 +232,18 @@ } } +ItemStack MenuItemStorage::getItemStackAtPos(const Point& position) { + int slot_over = slotOver(position); + if (slot_over > -1) { + return storage[slot_over]; + } + return ItemStack(); +} + MenuItemStorage::~MenuItemStorage() { if (highlight_image) delete highlight_image; - delete[] highlight; - if (overlay_disabled) delete overlay_disabled; diff --git a/src/MenuItemStorage.h b/src/MenuItemStorage.h index 9037b15..0f5dd4a 100644 --- a/src/MenuItemStorage.h +++ b/src/MenuItemStorage.h @@ -56,13 +56,14 @@ void highlightMatching(const std::string& type); void highlightClear(); void setPos(int x, int y); + ItemStack getItemStackAtPos(const Point& position); std::vector<std::string> slot_type; int drag_prev_slot; std::vector<WidgetSlot*> slots; WidgetSlot *current_slot; - bool * highlight; + std::vector<bool> highlight; Sprite *highlight_image; Sprite *overlay_disabled; }; diff --git a/src/MenuManager.cpp b/src/MenuManager.cpp index 60bf989..86e286e 100644 --- a/src/MenuManager.cpp +++ b/src/MenuManager.cpp @@ -35,6 +35,7 @@ #include "MenuDevConsole.h" #include "MenuEnemy.h" #include "MenuExit.h" +#include "MenuGameOver.h" #include "MenuHUDLog.h" #include "MenuInventory.h" #include "MenuLog.h" @@ -60,6 +61,8 @@ #include "UtilsFileSystem.h" #include "UtilsParsing.h" #include "WidgetSlot.h" +#include "WidgetTooltip.h" +#include "TooltipManager.h" MenuManager::MenuManager() : key_lock(false) @@ -69,11 +72,10 @@ , drag_stack() , drag_power(0) , drag_src(DRAG_SRC_NONE) - , drag_icon(new WidgetSlot(WidgetSlot::NO_ICON, Input::ACCEPT, WidgetSlot::SIZE_NORMAL)) + , drag_icon(new WidgetSlot(WidgetSlot::NO_ICON, Input::ACCEPT)) , done(false) , act_drag_hover(false) , keydrag_pos(Point()) -/*std::vector<Menu*> menus;*/ , inv(NULL) , pow(NULL) , chr(NULL) @@ -92,15 +94,16 @@ , exit(NULL) , effects(NULL) , stash(NULL) + , game_over(NULL) , devconsole(NULL) , touch_controls(NULL) , subtitles(NULL) , pause(false) , menus_open(false) { - hp = new MenuStatBar("hp"); - mp = new MenuStatBar("mp"); - xp = new MenuStatBar("xp"); + hp = new MenuStatBar(MenuStatBar::TYPE_HP); + mp = new MenuStatBar(MenuStatBar::TYPE_MP); + xp = new MenuStatBar(MenuStatBar::TYPE_XP); effects = new MenuActiveEffects(); hudlog = new MenuHUDLog(); act = new MenuActionBar(); @@ -116,6 +119,7 @@ stash = new MenuStash(); book = new MenuBook(); num_picker = new MenuNumPicker(); + game_over = new MenuGameOver(); menus.push_back(hp); // menus[0] menus.push_back(mp); // menus[1] @@ -135,6 +139,7 @@ menus.push_back(stash); // menus[15] menus.push_back(book); // menus[16] menus.push_back(num_picker); // menus[17] + menus.push_back(game_over); // menus[18] if (settings->dev_mode) { devconsole = new MenuDevConsole(); @@ -188,7 +193,9 @@ void MenuManager::handleKeyboardNavigation() { - stash->tablist.setNextTabList(NULL); + for (size_t i = 0; i < stash->tabs.size(); ++i) { + stash->tabs[i].tablist.setNextTabList(NULL); + } vendor->tablist_buy.setNextTabList(NULL); vendor->tablist_sell.setNextTabList(NULL); chr->tablist.setNextTabList(NULL); @@ -213,7 +220,9 @@ if (drag_src == DRAG_SRC_NONE) { if (inv->visible) { - stash->tablist.setNextTabList(&inv->tablist); + for (size_t i = 0; i < stash->tabs.size(); ++i) { + stash->tabs[i].tablist.setNextTabList(&inv->tablist); + } vendor->tablist_buy.setNextTabList(&inv->tablist); vendor->tablist_sell.setNextTabList(&inv->tablist); chr->tablist.setNextTabList(&inv->tablist); @@ -233,7 +242,9 @@ } } else if (pow->visible) { - stash->tablist.setNextTabList(&pow->tablist); + for (size_t i = 0; i < stash->tabs.size(); ++i) { + stash->tabs[i].tablist.setNextTabList(&pow->tablist); + } vendor->tablist_buy.setNextTabList(&pow->tablist); vendor->tablist_sell.setNextTabList(&pow->tablist); chr->tablist.setNextTabList(&pow->tablist); @@ -250,7 +261,12 @@ } // stash and vendor always start locked - if (!stash->visible) stash->tablist.lock(); + if (!stash->visible) { + stash->tablist.lock(); + for (size_t i = 0; i < stash->tabs.size(); ++i) { + stash->tabs[i].tablist.lock(); + } + } if (!vendor->visible) { vendor->tablist.lock(); vendor->tablist_buy.lock(); @@ -271,11 +287,13 @@ inpt->lock[Input::ACCEPT] = true; } } + void MenuManager::logic() { ItemStack stack; subtitles->logic(snd->getLastPlayedSID()); + // refresh statbar values from player statblock hp->update(0, pc->stats.hp, pc->stats.get(Stats::HP_MAX)); mp->update(0, pc->stats.mp, pc->stats.get(Stats::MP_MAX)); @@ -283,9 +301,18 @@ xp->setCustomString(msg->get("XP: %d", pc->stats.xp)); } else { - xp->setCustomString(msg->get("XP: %d/%d", pc->stats.xp, eset->xp.getLevelXP(pc->stats.level + 1))); - } - xp->update(eset->xp.getLevelXP(pc->stats.level), pc->stats.xp, eset->xp.getLevelXP(pc->stats.level + 1)); + // displays xp relative to current pc level + xp->setCustomString(msg->get("XP: %d/%d", pc->stats.xp - eset->xp.getLevelXP(pc->stats.level), eset->xp.getLevelXP(pc->stats.level + 1) - eset->xp.getLevelXP(pc->stats.level))); + } + // xp relative to current level (from 0 to ammount need for next level) + xp->update(0, pc->stats.xp - eset->xp.getLevelXP(pc->stats.level), eset->xp.getLevelXP(pc->stats.level + 1) - eset->xp.getLevelXP(pc->stats.level)); + + // close talker/vendor menu if player is attacked + if (pc->stats.abort_npc_interact && eset->misc.combat_aborts_npc_interact) { + talker->setNPC(NULL); + vendor->setNPC(NULL); + } + pc->stats.abort_npc_interact = false; // when selecting item quantities, don't process other menus if (num_picker->visible) { @@ -331,22 +358,26 @@ if (!inpt->usingMouse()) handleKeyboardNavigation(); + // Check if the mouse is within any of the visible windows. Excludes the minimap and the exit/pause menu + bool is_within_menus = (Utils::isWithinRect(act->window_area, inpt->mouse) || + (book->visible && Utils::isWithinRect(book->window_area, inpt->mouse)) || + (chr->visible && Utils::isWithinRect(chr->window_area, inpt->mouse)) || + (inv->visible && Utils::isWithinRect(inv->window_area, inpt->mouse)) || + (vendor->visible && Utils::isWithinRect(vendor->window_area, inpt->mouse)) || + (pow->visible && Utils::isWithinRect(pow->window_area, inpt->mouse)) || + (questlog->visible && Utils::isWithinRect(questlog->window_area, inpt->mouse)) || + (talker->visible && Utils::isWithinRect(talker->window_area, inpt->mouse)) || + (stash->visible && Utils::isWithinRect(stash->window_area, inpt->mouse)) || + (settings->dev_mode && devconsole->visible && Utils::isWithinRect(devconsole->window_area, inpt->mouse))); + // Stop attacking if the cursor is inside an interactable menu - if (pc->using_main1 || pc->using_main2) { - if (Utils::isWithinRect(act->window_area, inpt->mouse) || - (book->visible && Utils::isWithinRect(book->window_area, inpt->mouse)) || - (chr->visible && Utils::isWithinRect(chr->window_area, inpt->mouse)) || - (inv->visible && Utils::isWithinRect(inv->window_area, inpt->mouse)) || - (vendor->visible && Utils::isWithinRect(vendor->window_area, inpt->mouse)) || - (pow->visible && Utils::isWithinRect(pow->window_area, inpt->mouse)) || - (questlog->visible && Utils::isWithinRect(questlog->window_area, inpt->mouse)) || - (talker->visible && Utils::isWithinRect(talker->window_area, inpt->mouse)) || - (stash->visible && Utils::isWithinRect(stash->window_area, inpt->mouse))) - { - inpt->pressing[Input::MAIN1] = false; - inpt->pressing[Input::MAIN2] = false; - } - } + if ((pc->using_main1 || pc->using_main2) && is_within_menus) { + inpt->pressing[Input::MAIN1] = false; + inpt->pressing[Input::MAIN2] = false; + } + + if (!exit->visible && !is_within_menus) + mini->logic(); book->logic(); effects->logic(); @@ -360,6 +391,7 @@ questlog->logic(); talker->logic(); stash->logic(); + game_over->logic(); if (settings->dev_mode) { devconsole->logic(); @@ -434,15 +466,29 @@ else if (menus_open) { closeAll(); } - else { - exit->visible = !exit->visible; - } - } + else if (!game_over->visible) { + exit->handleCancel(); + } + } + } + if (mini->clicked_config) { + mini->clicked_config = false; + showExitMenu(); } if (exit->visible) { exit->logic(); if (exit->isExitRequested()) { + done = true; + } + // if dpi scaling is changed, we need to realign the menus + if (inpt->window_resized) { + alignAll(); + } + } + else if (game_over->visible) { + if (game_over->exit_clicked) { + game_over->close(); done = true; } } @@ -660,7 +706,7 @@ stash->itemReturn(inv->drop_stack.front()); inv->drop_stack.pop(); } - stash->updated = true; + stash->tabs[stash->getTab()].updated = true; } else { // start dragging a stash item @@ -730,7 +776,7 @@ } } // action bar - if (!inpt->touch_locked && (act->isWithinSlots(inpt->mouse) || act->isWithinMenus(inpt->mouse))) { + if (!exit->visible && !inpt->touch_locked && (act->isWithinSlots(inpt->mouse) || act->isWithinMenus(inpt->mouse))) { inpt->lock[Input::MAIN1] = true; // ctrl-click action bar to clear that slot @@ -810,7 +856,9 @@ } } else if (stash->visible && Utils::isWithinRect(stash->window_area, inpt->mouse)) { - stash->stock.drag_prev_slot = -1; + for (size_t i = 0; i < stash->tabs.size(); ++i) { + stash->tabs[i].stock.drag_prev_slot = -1; + } if (!stash->drop(inpt->mouse, drag_stack)) { inv->itemReturn(stash->drop_stack.front()); stash->drop_stack.pop(); @@ -855,7 +903,7 @@ stash->itemReturn(inv->drop_stack.front()); inv->drop_stack.pop(); } - stash->updated = true; + stash->tabs[stash->getTab()].updated = true; } else if (stash->visible && Utils::isWithinRect(stash->window_area, inpt->mouse)) { if (!stash->drop(inpt->mouse,drag_stack)) { @@ -865,7 +913,7 @@ } else { drop_stack.push(drag_stack); - stash->updated = true; + stash->tabs[stash->getTab()].updated = true; } } @@ -1023,8 +1071,9 @@ // stash menu if (stash->visible && stash->getCurrentTabList() && drag_src != DRAG_SRC_ACTIONBAR) { int slot_index = stash->getCurrentTabList()->getCurrent(); - WidgetSlot::CLICK_TYPE slotClick = stash->stock.slots[slot_index]->checkClick(); - Point src_slot(stash->stock.slots[slot_index]->pos.x, stash->stock.slots[slot_index]->pos.y); + size_t tab = stash->getTab(); + WidgetSlot::CLICK_TYPE slotClick = stash->tabs[tab].stock.slots[slot_index]->checkClick(); + Point src_slot(stash->tabs[tab].stock.slots[slot_index]->pos.x, stash->tabs[tab].stock.slots[slot_index]->pos.y); // pick up item if (slotClick == WidgetSlot::CHECKED && drag_stack.empty()) { @@ -1040,7 +1089,7 @@ } // rearrange item else if (slotClick == WidgetSlot::CHECKED && !drag_stack.empty()) { - stash->stock.slots[slot_index]->checked = false; + stash->tabs[tab].stock.slots[slot_index]->checked = false; if (!stash->drop(src_slot, drag_stack)) { drop_stack.push(stash->drop_stack.front()); stash->drop_stack.pop(); @@ -1060,7 +1109,7 @@ drag_stack.clear(); keyboard_dragging = false; sticky_dragging = false; - stash->updated = true; + stash->tabs[stash->getTab()].updated = true; } } @@ -1168,7 +1217,9 @@ vendor->stock[ItemManager::VENDOR_BUY].drag_prev_slot = -1; vendor->stock[ItemManager::VENDOR_SELL].drag_prev_slot = -1; - stash->stock.drag_prev_slot = -1; + for (size_t i = 0; i < stash->tabs.size(); ++i) { + stash->tabs[i].stock.drag_prev_slot = -1; + } inv->drag_prev_src = -1; inv->inventory[MenuInventory::EQUIPMENT].drag_prev_slot = -1; inv->inventory[MenuInventory::CARRIED].drag_prev_slot = -1; @@ -1237,14 +1288,18 @@ else { // Find tooltips depending on mouse position if (!book->visible) { + pushMatchingItemsOf(inpt->mouse); + chr->renderTooltips(inpt->mouse); vendor->renderTooltips(inpt->mouse); stash->renderTooltips(inpt->mouse); pow->renderTooltips(inpt->mouse); inv->renderTooltips(inpt->mouse); } - effects->renderTooltips(inpt->mouse); - act->renderTooltips(inpt->mouse); + if (!exit->visible) { + effects->renderTooltips(inpt->mouse); + act->renderTooltips(inpt->mouse); + } } } @@ -1276,6 +1331,9 @@ } void MenuManager::handleKeyboardTooltips() { + if (book->visible) + return; + if (vendor->visible && vendor->getCurrentTabList() && vendor->getCurrentTabList() != (&vendor->tablist)) { int slot_index = vendor->getCurrentTabList()->getCurrent(); @@ -1288,15 +1346,18 @@ keydrag_pos.y = vendor->stock[ItemManager::VENDOR_SELL].slots[slot_index]->pos.y; } + pushMatchingItemsOf(keydrag_pos); vendor->renderTooltips(keydrag_pos); } if (stash->visible && stash->getCurrentTabList()) { int slot_index = stash->getCurrentTabList()->getCurrent(); - - keydrag_pos.x = stash->stock.slots[slot_index]->pos.x; - keydrag_pos.y = stash->stock.slots[slot_index]->pos.y; - + size_t tab = stash->getTab(); + + keydrag_pos.x = stash->tabs[tab].stock.slots[slot_index]->pos.x; + keydrag_pos.y = stash->tabs[tab].stock.slots[slot_index]->pos.y; + + pushMatchingItemsOf(keydrag_pos); stash->renderTooltips(keydrag_pos); } @@ -1326,6 +1387,7 @@ keydrag_pos.y = temp_widget->pos.y; } + pushMatchingItemsOf(keydrag_pos); inv->renderTooltips(keydrag_pos); } @@ -1386,10 +1448,64 @@ } void MenuManager::showExitMenu() { + if (game_over->visible) + return; + pause = true; closeAll(); - if (exit) - exit->visible = true; + if (exit) { + // handleCancel() will show the menu, but only if it is already hidden + // we use handleCancel() here because it will reset the menu to the "Exit" tab + exit->visible = false; + exit->handleCancel(); + } +} + +void MenuManager::pushMatchingItemsOf(const Point& hov_pos) { + if (!settings->item_compare_tips) + return; + + int area = -1; + ItemStack hov_stack; + + if (inv->visible && Utils::isWithinRect(inv->window_area, hov_pos)) { + area = inv->areaOver(hov_pos); + if (area == MenuInventory::CARRIED) + hov_stack = inv->inventory[area].getItemStackAtPos(hov_pos); + } + else if (vendor->visible && Utils::isWithinRect(vendor->window_area, hov_pos)) { + area = vendor->getTab(); + if (area >= 0) + hov_stack = vendor->stock[area].getItemStackAtPos(hov_pos); + } + else if (stash->visible && Utils::isWithinRect(stash->window_area, hov_pos)) { + area = static_cast<int>(stash->getTab()); + if (area >= 0) + hov_stack = stash->tabs[area].stock.getItemStackAtPos(hov_pos); + } + + // we assume that a non-empty item type means that there is a primary tooltip + if (hov_stack.item > 0 && !items->items[hov_stack.item].type.empty()) { + size_t tip_index = 1; + + //get equipped items of the same type + for (size_t i = 0; i < inv->equipped_area.size(); i++) { + if (tip_index >= TooltipManager::TOOLTIP_COUNT) + break; // can't show any more tooltips + + if (inv->slot_type[i] == items->items[hov_stack.item].type) { + if (!inv->inventory[MenuInventory::EQUIPMENT].storage[i].empty()) { + Point match_pos(inv->equipped_area[i].x, inv->equipped_area[i].y); + + TooltipData match = inv->inventory[MenuInventory::EQUIPMENT].checkTooltip(match_pos, &pc->stats, ItemManager::PLAYER_INV); + match.addColoredText(msg->get("Equipped"), font->getColor(FontEngine::COLOR_ITEM_FLAVOR)); + + tooltipm->push(match, hov_pos, TooltipData::STYLE_FLOAT, tip_index); + tip_index++; + } + } + } + } } MenuManager::~MenuManager() { @@ -1412,6 +1528,7 @@ delete stash; delete book; delete num_picker; + delete game_over; if (settings->dev_mode) { delete devconsole; diff --git a/src/MenuManager.h b/src/MenuManager.h index c05db15..1d28df7 100644 --- a/src/MenuManager.h +++ b/src/MenuManager.h @@ -29,24 +29,25 @@ #include "ItemManager.h" class Menu; +class MenuActionBar; +class MenuActiveEffects; +class MenuBook; +class MenuCharacter; +class MenuDevConsole; +class MenuEnemy; +class MenuExit; +class MenuGameOver; +class MenuHUDLog; class MenuInventory; -class MenuPowers; -class MenuCharacter; class MenuLog; -class MenuHUDLog; -class MenuActionBar; -class MenuBook; -class MenuStatBar; class MenuMiniMap; class MenuNumPicker; -class MenuEnemy; +class MenuPowers; +class MenuStash; +class MenuStatBar; +class MenuTalker; +class MenuTouchControls; class MenuVendor; -class MenuTalker; -class MenuExit; -class MenuActiveEffects; -class MenuStash; -class MenuDevConsole; -class MenuTouchControls; class StatBlock; class Subtitles; class WidgetSlot; @@ -70,7 +71,7 @@ bool keyboard_dragging; bool sticky_dragging; ItemStack drag_stack; - int drag_power; + PowerID drag_power; int drag_src; WidgetSlot *drag_icon; @@ -85,6 +86,7 @@ void handleKeyboardNavigation(); void dragAndDropWithKeyboard(); + void pushMatchingItemsOf(const Point& hov_pos); public: explicit MenuManager(); @@ -117,6 +119,7 @@ MenuExit *exit; MenuActiveEffects *effects; MenuStash *stash; + MenuGameOver *game_over; MenuDevConsole *devconsole; MenuTouchControls *touch_controls; diff --git a/src/MenuMiniMap.cpp b/src/MenuMiniMap.cpp index 3075273..f61a72d 100644 --- a/src/MenuMiniMap.cpp +++ b/src/MenuMiniMap.cpp @@ -23,30 +23,47 @@ * class MenuMiniMap */ +#include "Avatar.h" #include "CommonIncludes.h" +#include "Entity.h" +#include "EntityManager.h" #include "EngineSettings.h" #include "FileParser.h" #include "FontEngine.h" +#include "InputState.h" #include "MapCollision.h" +#include "MapRenderer.h" #include "Menu.h" #include "MenuMiniMap.h" +#include "MessageEngine.h" #include "RenderDevice.h" #include "Settings.h" #include "SharedResources.h" +#include "SharedGameResources.h" #include "UtilsParsing.h" +#include "WidgetButton.h" #include "WidgetLabel.h" #include <cmath> MenuMiniMap::MenuMiniMap() - : color_wall(128,128,128,255) - , color_obst(64,64,64,255) - , color_hero(255,255,255,255) + : color_wall(128,128,128) + , color_obst(64,64,64) + , color_hero(255,255,255) + , color_enemy(255,0,0) + , color_ally(255,255,0) + , color_npc(0,255,0) + , color_teleport(0,191,255) , map_surface(NULL) , map_surface_2x(NULL) + , map_surface_entities(NULL) + , map_surface_entities_2x(NULL) , label(new WidgetLabel()) , compass(NULL) + , button_config(NULL) , current_zoom(1) + , lock_zoom_change(false) + , clicked_config(false) { std::string bg_filename; @@ -70,6 +87,42 @@ else if (infile.key == "background") { bg_filename = infile.val; } + // @ATTR color_wall|color, int : Color, Alpha|Color used for walls. + else if (infile.key == "color_wall") { + color_wall = Parse::toRGBA(infile.val); + } + // @ATTR color_obst|color, int : Color, Alpha|Color used for small obstacles and pits. + else if (infile.key == "color_obst") { + color_obst = Parse::toRGBA(infile.val); + } + // @ATTR color_hero|color, int : Color, Alpha|Color used for the player character. + else if (infile.key == "color_hero") { + color_hero = Parse::toRGBA(infile.val); + } + // @ATTR color_enemy|color, int : Color, Alpha|Color used for enemies engaged in combat. + else if (infile.key == "color_enemy") { + color_enemy = Parse::toRGBA(infile.val); + } + // @ATTR color_ally|color, int : Color, Alpha|Color used for allies. + else if (infile.key == "color_ally") { + color_ally = Parse::toRGBA(infile.val); + } + // @ATTR color_npc|color, int : Color, Alpha|Color used for NPCs. + else if (infile.key == "color_npc") { + color_npc = Parse::toRGBA(infile.val); + } + // @ATTR color_teleport|color, int : Color, Alpha|Color used for intermap teleports. + else if (infile.key == "color_teleport") { + color_teleport = Parse::toRGBA(infile.val); + } + // @ATTR button_config|point|Position of the 'Configuration' button. The button will be hidden if not defined. + else if (infile.key == "button_config") { + if (!button_config) { + button_config = new WidgetButton("images/menus/buttons/button_config.png"); + } + Point p = Parse::toPoint(infile.val); + button_config->setBasePos(p.x, p.y, Utils::ALIGN_TOPLEFT); + } else { infile.error("MenuMiniMap: '%s' is not a valid key.", infile.key.c_str()); } @@ -95,12 +148,23 @@ gfx->unref(); } + if (button_config) + button_config->tooltip = msg->get("Configuration"); + align(); } void MenuMiniMap::align() { Menu::align(); label->setPos(window_area.x, window_area.y); + + if (button_config) + button_config->setPos(window_area.x, window_area.y); + + map_area.x = window_area.x + pos.x; + map_area.y = window_area.y + pos.y; + map_area.w = pos.w; + map_area.h = pos.h; // compass Point compass_pos(window_area.x + pos.x + pos.w - compass->getGraphicsWidth(), pos.y + window_area.y); @@ -129,6 +193,35 @@ } } +void MenuMiniMap::logic() { + if (!settings->show_hud || settings->minimap_mode == Settings::MINIMAP_HIDDEN) + return; + + if (inpt->usingMouse()) { + bool is_within_maparea = Utils::isWithinRect(map_area, inpt->mouse); + + if (!lock_zoom_change) + lock_zoom_change = inpt->pressing[Input::MAIN1] && !is_within_maparea; + else if (!inpt->pressing[Input::MAIN1]) + lock_zoom_change = false; + + if (is_within_maparea && inpt->pressing[Input::MAIN1] && !inpt->lock[Input::MAIN1] && !lock_zoom_change) { + inpt->lock[Input::MAIN1] = true; + if (settings->minimap_mode == Settings::MINIMAP_NORMAL) + settings->minimap_mode = Settings::MINIMAP_2X; + else if (settings->minimap_mode == Settings::MINIMAP_2X) + settings->minimap_mode = Settings::MINIMAP_NORMAL; + } + } + + if (button_config) { + button_config->enabled = !pc->stats.corpse; + if (button_config->checkClick()) { + clicked_config = true; + } + } +} + void MenuMiniMap::render() { } @@ -150,20 +243,25 @@ if (compass) { render_device->render(compass); } + + if (button_config) + button_config->render(); } void MenuMiniMap::prerender(MapCollision *collider, int map_w, int map_h) { map_size.x = map_w; map_size.y = map_h; + clearEntities(); + if (eset->tileset.orientation == eset->tileset.TILESET_ISOMETRIC) { - prerenderIso(collider, &map_surface, 1); - prerenderIso(collider, &map_surface_2x, 2); + prerenderIso(collider, &map_surface, &map_surface_entities, 1); + prerenderIso(collider, &map_surface_2x, &map_surface_entities_2x, 2); } else { // eset->tileset.TILESET_ORTHOGONAL - prerenderOrtho(collider, &map_surface, 1); - prerenderOrtho(collider, &map_surface_2x, 2); + prerenderOrtho(collider, &map_surface, &map_surface_entities, 1); + prerenderOrtho(collider, &map_surface_2x, &map_surface_entities_2x, 2); } } @@ -186,51 +284,49 @@ clip.w = pos.w; clip.h = pos.h; - Rect map_area; - map_area.x = window_area.x + pos.x; - map_area.y = window_area.y + pos.y; - map_area.w = pos.w; - map_area.h = pos.h; - Sprite* target_surface = NULL; + Sprite* target_surface_entities = NULL; if (settings->minimap_mode == Settings::MINIMAP_NORMAL && map_surface) { target_surface = map_surface; + target_surface_entities = map_surface_entities; } else if (settings->minimap_mode == Settings::MINIMAP_2X && map_surface_2x) { target_surface = map_surface_2x; + target_surface_entities = map_surface_entities_2x; } if (target_surface) { - // ensure the clip doesn't exceed the surface dimensions - // TODO should this be in RenderDevice? - const int target_w = target_surface->getGraphicsWidth(); - const int target_h = target_surface->getGraphicsHeight(); - if (clip.x + clip.w > target_w) - clip.w = target_w - clip.x; - if (clip.y + clip.h > target_h) - clip.h = target_h - clip.y; - target_surface->setClipFromRect(clip); target_surface->setDestFromRect(map_area); render_device->render(target_surface); } - // draw the player cursor - Point center(window_area.x + pos.x + pos.w/2, window_area.y + pos.y + pos.h/2); - render_device->drawLine(center.x - current_zoom, center.y, center.x + current_zoom, center.y, color_hero); - render_device->drawLine(center.x, center.y - current_zoom, center.x, center.y + current_zoom, color_hero); -} - -void MenuMiniMap::prerenderOrtho(MapCollision *collider, Sprite** target_surface, int zoom) { + if (target_surface_entities) { + if (eset->tileset.orientation == eset->tileset.TILESET_ISOMETRIC) { + renderEntitiesIso(target_surface_entities, current_zoom); + } + else { + // eset->tileset.TILESET_ORTHOGONAL + renderEntitiesOrtho(target_surface_entities, current_zoom); + } + + target_surface_entities->setClipFromRect(clip); + target_surface_entities->setDestFromRect(map_area); + render_device->render(target_surface_entities); + } +} + +void MenuMiniMap::prerenderOrtho(MapCollision *collider, Sprite** tile_surface, Sprite** entity_surface, int zoom) { int surface_size = std::max(map_size.x + zoom, map_size.y + zoom) * zoom; - createMapSurface(target_surface, surface_size, surface_size); - - if (!(*target_surface)) + createMapSurface(tile_surface, surface_size, surface_size); + createMapSurface(entity_surface, surface_size, surface_size); + + if (!(*tile_surface)) return; - Image* target_img = (*target_surface)->getGraphics(); - const int target_w = (*target_surface)->getGraphicsWidth(); - const int target_h = (*target_surface)->getGraphicsHeight(); + Image* target_img = (*tile_surface)->getGraphics(); + const int target_w = (*tile_surface)->getGraphicsWidth(); + const int target_h = (*tile_surface)->getGraphicsHeight(); Color draw_color; @@ -245,7 +341,7 @@ else if (tile_type == 2 || tile_type == 6) draw_color = color_obst; else draw_tile = false; - if (draw_tile) { + if (draw_tile && draw_color.a != 0) { for (int l = 0; l < zoom; l++) { for (int k =0; k < zoom; k++) { target_img->drawPixel((zoom*i)+k, (zoom*j)+l, draw_color); @@ -258,11 +354,12 @@ target_img->endPixelBatch(); } -void MenuMiniMap::prerenderIso(MapCollision *collider, Sprite** target_surface, int zoom) { +void MenuMiniMap::prerenderIso(MapCollision *collider, Sprite** tile_surface, Sprite** entity_surface, int zoom) { int surface_size = std::max(map_size.x + zoom, map_size.y + zoom) * 2 * zoom; - createMapSurface(target_surface, surface_size, surface_size); - - if (!(*target_surface)) + createMapSurface(tile_surface, surface_size, surface_size); + createMapSurface(entity_surface, surface_size, surface_size); + + if (!(*tile_surface)) return; // a 2x1 pixel area correlates to a tile, so we can traverse tiles using pixel counting @@ -275,9 +372,9 @@ bool odd_row = false; - Image* target_img = (*target_surface)->getGraphics(); - const int target_w = (*target_surface)->getGraphicsWidth(); - const int target_h = (*target_surface)->getGraphicsHeight(); + Image* target_img = (*tile_surface)->getGraphics(); + const int target_w = (*tile_surface)->getGraphicsWidth(); + const int target_h = (*tile_surface)->getGraphicsHeight(); target_img->beginPixelBatch(); @@ -298,7 +395,7 @@ else if (tile_type == 2 || tile_type == 6) draw_color = color_obst; else draw_tile = false; - if (draw_tile) { + if (draw_tile && draw_color.a != 0) { if (odd_row) { for (int l = 0; l < zoom; l++) { for (int k = 0; k < zoom * 2; k++) { @@ -337,10 +434,187 @@ target_img->endPixelBatch(); } +void MenuMiniMap::renderEntitiesOrtho(Sprite* entity_surface, int zoom) { + if (!entity_surface) + return; + + Color draw_color; + int tile_type; + + Image* target_img = entity_surface->getGraphics(); + const int target_w = entity_surface->getGraphicsWidth(); + const int target_h = entity_surface->getGraphicsHeight(); + + target_img->fillWithColor(Color(0,0,0,0)); + + clearEntities(); + fillEntities(); + + target_img->beginPixelBatch(); + + for (int i=0; i<std::min(target_w, map_size.x); i++) { + for (int j=0; j<std::min(target_h, map_size.y); j++) { + bool draw_tile = true; + tile_type = entities[i][j]; + + if (tile_type == TILE_HERO) draw_color = color_hero; + else if (tile_type == TILE_ENEMY) draw_color = color_enemy; + else if (tile_type == TILE_NPC) draw_color = color_npc; + else if (tile_type == TILE_TELEPORT) draw_color = color_teleport; + else if (tile_type == TILE_ALLY) draw_color = color_ally; + else draw_tile = false; + + if (draw_tile && draw_color.a != 0) { + for (int l = 0; l < zoom; l++) { + for (int k =0; k < zoom; k++) { + target_img->drawPixel((zoom*i)+k, (zoom*j)+l, draw_color); + } + } + } + } + } + + target_img->endPixelBatch(); +} + +void MenuMiniMap::renderEntitiesIso(Sprite* entity_surface, int zoom) { + if (!entity_surface) + return; + + // a 2x1 pixel area correlates to a tile, so we can traverse tiles using pixel counting + Color draw_color; + int tile_type; + + Point tile_cursor; + tile_cursor.x = -std::max(map_size.x, map_size.y)/2; + tile_cursor.y = std::max(map_size.x, map_size.y)/2; + + bool odd_row = false; + + Image* target_img = entity_surface->getGraphics(); + const int target_w = entity_surface->getGraphicsWidth(); + const int target_h = entity_surface->getGraphicsHeight(); + + target_img->fillWithColor(Color(0,0,0,0)); + + clearEntities(); + fillEntities(); + + target_img->beginPixelBatch(); + + // for each pixel row + for (int j=0; j<target_h; j++) { + + // for each 2-px wide column + for (int i=0; i<target_w; i+=2) { + + // if this tile is the max map size + if (tile_cursor.x >= 0 && tile_cursor.y >= 0 && tile_cursor.x < map_size.x && tile_cursor.y < map_size.y) { + + tile_type = entities[tile_cursor.x][tile_cursor.y]; + bool draw_tile = true; + + if (tile_type == TILE_HERO) draw_color = color_hero; + else if (tile_type == TILE_ENEMY) draw_color = color_enemy; + else if (tile_type == TILE_NPC) draw_color = color_npc; + else if (tile_type == TILE_TELEPORT) draw_color = color_teleport; + else if (tile_type == TILE_ALLY) draw_color = color_ally; + else draw_tile = false; + + if (draw_tile && draw_color.a != 0) { + if (odd_row) { + for (int l = 0; l < zoom; l++) { + for (int k = 0; k < zoom * 2; k++) { + target_img->drawPixel((zoom*i)+k, (zoom*j)+l, draw_color); + } + } + } + else { + for (int l = 0; l < zoom; l++) { + for (int k = -((zoom * 2) - zoom); k < zoom; k++) { + target_img->drawPixel((zoom*i)+k, (zoom*j)+l, draw_color); + } + } + } + } + } + + // moving screen-right in isometric is +x -y in map coordinates + tile_cursor.x++; + tile_cursor.y--; + } + + // return tile cursor to next row of tiles + if (odd_row) { + odd_row = false; + tile_cursor.x -= target_w/2; + tile_cursor.y += (target_w/2 +1); + } + else { + odd_row = true; + tile_cursor.x -= (target_w/2 -1); + tile_cursor.y += target_w/2; + } + } + + target_img->endPixelBatch(); +} + +void MenuMiniMap::clearEntities() { + entities.resize(map_size.x); + for (size_t i=0; i<entities.size(); ++i) { + entities[i].resize(map_size.y); + for (size_t j=0; j<entities[i].size(); ++j) { + entities[i][j] = 0; + } + } +} + +void MenuMiniMap::fillEntities() { + Point hero = Point(pc->stats.pos); + if (hero.x >= 0 && hero.y >= 0 && hero.x < map_size.x && hero.y < map_size.y) { + entities[hero.x][hero.y] = TILE_HERO; + } + + for (size_t i=0; i<mapr->events.size(); ++i) { + EventComponent* ec_minimap = mapr->events[i].getComponent(EventComponent::SHOW_ON_MINIMAP); + if (ec_minimap && !ec_minimap->x) + continue; + + if (mapr->events[i].getComponent(EventComponent::NPC_HOTSPOT) && EventManager::isActive(mapr->events[i])) { + entities[mapr->events[i].location.x][mapr->events[i].location.y] = TILE_NPC; + } + else if ((mapr->events[i].activate_type == Event::ACTIVATE_ON_TRIGGER || mapr->events[i].activate_type == Event::ACTIVATE_ON_INTERACT) && mapr->events[i].getComponent(EventComponent::INTERMAP) && EventManager::isActive(mapr->events[i])) { + // TODO use location when hotspot is inappropriate? + Point event_pos(mapr->events[i].location.x, mapr->events[i].location.y); + for (int j=event_pos.x; j<event_pos.x + mapr->events[i].location.w; ++j) { + for (int k=event_pos.y; k<event_pos.y + mapr->events[i].location.h; ++k) { + entities[j][k] = TILE_TELEPORT; + } + } + } + } + + for (size_t i=0; i<entitym->entities.size(); ++i) { + Entity *e = entitym->entities[i]; + if (e->stats.hp > 0) { + if (e->stats.hero_ally) { + entities[static_cast<int>(e->stats.pos.x)][static_cast<int>(e->stats.pos.y)] = TILE_ALLY; + } + else if (e->stats.in_combat) { + entities[static_cast<int>(e->stats.pos.x)][static_cast<int>(e->stats.pos.y)] = TILE_ENEMY; + } + } + } +} + MenuMiniMap::~MenuMiniMap() { delete map_surface; delete map_surface_2x; + delete map_surface_entities; + delete map_surface_entities_2x; delete label; delete compass; -} + delete button_config; +} diff --git a/src/MenuMiniMap.h b/src/MenuMiniMap.h index d22c17c..cd3927a 100644 --- a/src/MenuMiniMap.h +++ b/src/MenuMiniMap.h @@ -29,40 +29,65 @@ class MapCollision; class Sprite; +class WidgetButton; class WidgetLabel; class MenuMiniMap : public Menu { private: + enum { + TILE_HERO = 1, + TILE_ENEMY = 2, + TILE_NPC = 3, + TILE_TELEPORT = 4, + TILE_ALLY = 5 + }; + Color color_wall; Color color_obst; Color color_hero; + Color color_enemy; + Color color_ally; + Color color_npc; + Color color_teleport; Sprite *map_surface; Sprite *map_surface_2x; + Sprite *map_surface_entities; + Sprite *map_surface_entities_2x; Point map_size; Rect pos; WidgetLabel *label; Sprite *compass; + Rect map_area; + WidgetButton* button_config; int current_zoom; + bool lock_zoom_change; + + std::vector< std::vector<unsigned short> > entities; void createMapSurface(Sprite** target_surface, int w, int h); - // void renderIso(const FPoint& hero_pos); - // void renderOrtho(const FPoint& hero_pos); void renderMapSurface(const FPoint& hero_pos); - void prerenderOrtho(MapCollision *collider, Sprite** target_surface, int zoom); - void prerenderIso(MapCollision *collider, Sprite** target_surface, int zoom); + void prerenderOrtho(MapCollision *collider, Sprite** tile_surface, Sprite** entity_surface, int zoom); + void prerenderIso(MapCollision *collider, Sprite** tile_surface, Sprite** entity_surface, int zoom); + void renderEntitiesOrtho(Sprite* entity_surface, int zoom); + void renderEntitiesIso(Sprite* entity_surface, int zoom); + void clearEntities(); + void fillEntities(); public: MenuMiniMap(); ~MenuMiniMap(); void align(); + void logic(); void render(); void render(const FPoint& hero_pos); void prerender(MapCollision *collider, int map_w, int map_h); void setMapTitle(const std::string& map_title); + + bool clicked_config; }; diff --git a/src/MenuMovementType.cpp b/src/MenuMovementType.cpp new file mode 100644 index 0000000..bcd5967 --- /dev/null +++ b/src/MenuMovementType.cpp @@ -0,0 +1,230 @@ +/* +Copyright © 2020 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +#include "FileParser.h" +#include "FontEngine.h" +#include "InputState.h" +#include "MenuMovementType.h" +#include "MessageEngine.h" +#include "Platform.h" +#include "RenderDevice.h" +#include "Settings.h" +#include "SharedResources.h" +#include "UtilsParsing.h" +#include "WidgetButton.h" + +#include <string> + +MenuMovementType::MenuMovementType() + : Menu() + , button_keyboard(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , button_mouse(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , button_joystick(new WidgetButton(WidgetButton::DEFAULT_FILE)) + , icon_keyboard(NULL) + , icon_mouse(NULL) + , icon_joystick(NULL) +{ + // Load config settings + FileParser infile; + // @CLASS MenuMovementType|Description of menus/movement_type.txt + if(infile.open("menus/movement_type.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { + while(infile.next()) { + if (parseMenuKey(infile.key, infile.val)) + continue; + else if (infile.key == "label_title") { + // @ATTR label_title|label|Position of the "Select a Movement Type" text. + label_title.setFromLabelInfo(Parse::popLabelInfo(infile.val)); + } + else if (infile.key == "label_config_hint") { + // @ATTR label_config_hint|label|Position of the "Can be changed later in the Configuration menu" text. + label_config_hint.setFromLabelInfo(Parse::popLabelInfo(infile.val)); + } + else if (infile.key == "button_keyboard") { + // @ATTR button_keyboard|point|Position of the "Keyboard" button. + Point pos = Parse::toPoint(infile.val); + button_keyboard->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); + } + else if (infile.key == "button_mouse") { + // @ATTR button_mouse|point|Position of the "Mouse" button. + Point pos = Parse::toPoint(infile.val); + button_mouse->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); + } + else if (infile.key == "button_joystick") { + // @ATTR button_joystick|point|Position of the "Joystick" button. + Point pos = Parse::toPoint(infile.val); + button_joystick->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); + } + else if (infile.key == "icon_keyboard") { + // @ATTR icon_keyboard|point|Position of the keyboard icon. + icon_keyboard_pos = Parse::toPoint(infile.val); + } + else if (infile.key == "icon_mouse") { + // @ATTR icon_mouse|point|Position of the mouse icon. + icon_mouse_pos = Parse::toPoint(infile.val); + } + else if (infile.key == "icon_joystick") { + // @ATTR icon_joystick|point|Position of the joystick icon. + icon_joystick_pos = Parse::toPoint(infile.val); + } + } + infile.close(); + } + + label_title.setText(msg->get("Select a Movement Type")); + label_title.setColor(font->getColor(FontEngine::COLOR_MENU_NORMAL)); + label_config_hint.setText(msg->get("Can be changed later in the Configuration menu.")); + label_config_hint.setColor(font->getColor(FontEngine::COLOR_WIDGET_DISABLED)); + + button_keyboard->setLabel(msg->get("Keyboard")); + button_mouse->setLabel(msg->get("Mouse")); + button_joystick->setLabel(msg->get("Joystick")); + + tablist.ignore_no_mouse = true; + tablist.add(button_keyboard); + tablist.add(button_mouse); + tablist.add(button_joystick); + + setBackground("images/menus/movement_type.png"); + + // load icons + Image *graphics; + graphics = render_device->loadImage("images/menus/movement_type_keyboard.png", RenderDevice::ERROR_NORMAL); + if (graphics) { + icon_keyboard = graphics->createSprite(); + graphics->unref(); + } + graphics = render_device->loadImage("images/menus/movement_type_mouse.png", RenderDevice::ERROR_NORMAL); + if (graphics) { + icon_mouse = graphics->createSprite(); + graphics->unref(); + } + graphics = render_device->loadImage("images/menus/movement_type_joystick.png", RenderDevice::ERROR_NORMAL); + if (graphics) { + icon_joystick = graphics->createSprite(); + graphics->unref(); + } + + // button tooltips + button_keyboard->tooltip = msg->get("Keyboard") + "\n\n" + \ + msg->get("Up") + ": " + inpt->getBindingString(Input::UP) + "\n" + \ + msg->get("Left") + ": " + inpt->getBindingString(Input::LEFT) + "\n" + \ + msg->get("Down") + ": " + inpt->getBindingString(Input::DOWN) + "\n" + \ + msg->get("Right") + ": " + inpt->getBindingString(Input::RIGHT); + + button_mouse->tooltip = msg->get("Mouse") + "\n\n" + \ + msg->get("Button") + ": " + inpt->getBindingString(settings->mouse_move_swap ? Input::MAIN2 : Input::MAIN1); + + button_joystick->tooltip = msg->get("Joystick") + "\n\n" + \ + msg->get("Up") + ": " + inpt->getBindingString(Input::UP, InputState::BINDING_JOYSTICK) + "\n" + \ + msg->get("Left") + ": " + inpt->getBindingString(Input::LEFT, InputState::BINDING_JOYSTICK) + "\n" + \ + msg->get("Down") + ": " + inpt->getBindingString(Input::DOWN, InputState::BINDING_JOYSTICK) + "\n" + \ + msg->get("Right") + ": " + inpt->getBindingString(Input::RIGHT, InputState::BINDING_JOYSTICK); + + align(); + + visible = false; +} + +void MenuMovementType::align() { + Menu::align(); + + label_title.setPos(window_area.x, window_area.y); + label_config_hint.setPos(window_area.x, window_area.y); + + button_keyboard->setPos(window_area.x, window_area.y); + button_mouse->setPos(window_area.x, window_area.y); + button_joystick->setPos(window_area.x, window_area.y); + + if (icon_keyboard) + icon_keyboard->setDest(window_area.x + icon_keyboard_pos.x, window_area.y + icon_keyboard_pos.y); + if (icon_mouse) + icon_mouse->setDest(window_area.x + icon_mouse_pos.x, window_area.y + icon_mouse_pos.y); + if (icon_joystick) + icon_joystick->setDest(window_area.x + icon_joystick_pos.x, window_area.y + icon_joystick_pos.y); +} + +void MenuMovementType::logic() { + if (!visible) + return; + + tablist.logic(); + + button_joystick->enabled = (inpt->getNumJoysticks() > 0 && platform.config_input[Platform::Input::JOYSTICK]); + + if (button_keyboard->checkClick()) { + settings->mouse_move = false; + settings->enable_joystick = false; + settings->joystick_device = -1; + close(); + } + else if (button_mouse->checkClick()) { + settings->mouse_move = true; + settings->no_mouse = false; + settings->mouse_aim = true; + settings->enable_joystick = false; + settings->joystick_device = -1; + close(); + } + else if (button_joystick->checkClick()) { + settings->mouse_move = false; + settings->enable_joystick = true; + if (settings->joystick_device == -1) + settings->joystick_device = 0; + close(); + } +} + +void MenuMovementType::close() { + visible = false; + tablist.defocus(); + + inpt->initJoystick(); + inpt->joysticks_changed = false; + + settings->move_type_dimissed = true; + settings->saveSettings(); +} + +void MenuMovementType::render() { + if (!visible) + return; + + // background + Menu::render(); + + label_title.render(); + label_config_hint.render(); + + button_keyboard->render(); + button_mouse->render(); + button_joystick->render(); + + render_device->render(icon_keyboard); + render_device->render(icon_mouse); + render_device->render(icon_joystick); +} + +MenuMovementType::~MenuMovementType() { + delete button_keyboard; + delete button_mouse; + delete button_joystick; + + delete icon_keyboard; + delete icon_mouse; + delete icon_joystick; +} + diff --git a/src/MenuMovementType.h b/src/MenuMovementType.h new file mode 100644 index 0000000..2f1abe7 --- /dev/null +++ b/src/MenuMovementType.h @@ -0,0 +1,54 @@ +/* +Copyright © 2020 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +#ifndef MENU_MOVEMENT_TYPE_H +#define MENU_MOVEMENT_TYPE_H + +#include "CommonIncludes.h" +#include "Menu.h" +#include "Utils.h" +#include "WidgetLabel.h" + +class WidgetButton; + +class MenuMovementType : public Menu { +protected: + WidgetButton *button_keyboard; + WidgetButton *button_mouse; + WidgetButton *button_joystick; + WidgetLabel label_title; + WidgetLabel label_config_hint; + + Sprite *icon_keyboard; + Sprite *icon_mouse; + Sprite *icon_joystick; + + Point icon_keyboard_pos; + Point icon_mouse_pos; + Point icon_joystick_pos; + +public: + MenuMovementType(); + ~MenuMovementType(); + + void logic(); + void align(); + void close(); + virtual void render(); +}; + +#endif diff --git a/src/MenuPowers.cpp b/src/MenuPowers.cpp index 8feedac..8032ce7 100644 --- a/src/MenuPowers.cpp +++ b/src/MenuPowers.cpp @@ -33,6 +33,7 @@ #include "FontEngine.h" #include "Menu.h" #include "MenuActionBar.h" +#include "MenuInventory.h" #include "MenuManager.h" #include "MenuPowers.h" #include "MessageEngine.h" @@ -54,29 +55,19 @@ MenuPowersCell::MenuPowersCell() : id(-1) + , requires_point(false) , requires_level(0) - , requires_point(false) , requires_primary(eset->primary_stats.list.size(), 0) , requires_power() - , visible_requires_status() - , visible_requires_not() + , requires_status() + , requires_not_status() + , visible(true) + , visible_when_locked(true) , upgrade_level(0) , passive_on(false) , is_unlocked(false) , group(0) , next(NULL) { -} - -bool MenuPowersCell::isVisible() { - for (size_t i = 0; i < visible_requires_status.size(); ++i) - if (!camp->checkStatus(visible_requires_status[i])) - return false; - - for (size_t i = 0; i < visible_requires_not.size(); ++i) - if (camp->checkStatus(visible_requires_not[i])) - return false; - - return true; } MenuPowersCellGroup::MenuPowersCellGroup() @@ -132,7 +123,6 @@ , label_unspent(new WidgetLabel) , tab_control(NULL) , tree_loaded(false) - , prev_powers_list_size(0) , default_power_tab(-1) , newPowerNotification(false) { @@ -353,8 +343,8 @@ // create power slots for (size_t i=0; i<slots.size(); i++) { - if (!power_cell[i].cells.empty() && static_cast<size_t>(power_cell[i].cells[0].id) < powers->powers.size()) { - slots[i] = new WidgetSlot(powers->powers[power_cell[i].cells[0].id].icon, Input::ACCEPT, WidgetSlot::SIZE_NORMAL); + if (!power_cell[i].cells.empty() && !powers->powers[power_cell[i].cells[0].id].is_empty) { + slots[i] = new WidgetSlot(powers->powers[power_cell[i].cells[0].id].icon, Input::ACCEPT); slots[i]->setBasePos(power_cell[i].pos.x, power_cell[i].pos.y, Utils::ALIGN_TOPLEFT); if (!tablist_pow.empty()) { @@ -394,12 +384,16 @@ } void MenuPowers::loadPower(FileParser &infile) { + // base power cell storage hasn't been set up! + if (power_cell.back().cells.empty()) + return; + // @ATTR power.id|int|A power id from powers/powers.txt for this slot. if (infile.key == "id") { int id = Parse::popFirstInt(infile.val); if (id > 0) { skip_section = false; - power_cell.back().cells.back().id = id; + power_cell.back().cells[0].id = id; } else { infile.error("MenuPowers: Power index out of bounds 1-%d, skipping power.", INT_MAX); @@ -407,7 +401,7 @@ return; } - if (power_cell.back().cells.back().id <= 0) { + if (power_cell.back().cells[0].id <= 0) { skip_section = true; power_cell.pop_back(); slots.pop_back(); @@ -422,36 +416,55 @@ // @ATTR power.position|point|Position of this power icon; relative to MenuPowers "pos". else if (infile.key == "position") power_cell.back().pos = Parse::toPoint(infile.val); + // @ATTR power.requires_point|bool|Power requires a power point to unlock. + else if (infile.key == "requires_point") power_cell.back().cells[0].requires_point = Parse::toBool(infile.val); + // @ATTR power.requires_primary|predefined_string, int : Primary stat name, Required value|Power requires this primary stat to be at least the specificed value. else if (infile.key == "requires_primary") { std::string prim_stat = Parse::popFirstString(infile.val); size_t prim_stat_index = eset->primary_stats.getIndexByID(prim_stat); if (prim_stat_index != eset->primary_stats.list.size()) { - power_cell.back().cells.back().requires_primary[prim_stat_index] = Parse::toInt(infile.val); + power_cell.back().cells[0].requires_primary[prim_stat_index] = Parse::toInt(infile.val); } else { infile.error("MenuPowers: '%s' is not a valid primary stat.", prim_stat.c_str()); } } - // @ATTR power.requires_point|bool|Power requires a power point to unlock. - else if (infile.key == "requires_point") power_cell.back().cells.back().requires_point = Parse::toBool(infile.val); // @ATTR power.requires_level|int|Power requires at least this level for the hero. - else if (infile.key == "requires_level") power_cell.back().cells.back().requires_level = Parse::toInt(infile.val); + else if (infile.key == "requires_level") power_cell.back().cells[0].requires_level = Parse::toInt(infile.val); // @ATTR power.requires_power|power_id|Power requires another power id. - else if (infile.key == "requires_power") power_cell.back().cells.back().requires_power.push_back(Parse::toInt(infile.val)); - - // @ATTR power.visible_requires_status|repeatable(string)|Hide the power if we don't have this campaign status. - else if (infile.key == "visible_requires_status") power_cell.back().cells.back().visible_requires_status.push_back(camp->registerStatus(infile.val)); - // @ATTR power.visible_requires_not_status|repeatable(string)|Hide the power if we have this campaign status. - else if (infile.key == "visible_requires_not_status") power_cell.back().cells.back().visible_requires_not.push_back(camp->registerStatus(infile.val)); + else if (infile.key == "requires_power") power_cell.back().cells[0].requires_power.push_back(Parse::toPowerID(infile.val)); + // @ATTR power.requires_status|repeatable(string)|Power requires this campaign status. + else if (infile.key == "requires_status") power_cell.back().cells[0].requires_status.push_back(camp->registerStatus(infile.val)); + // @ATTR power.requires_not_status|repeatable(string)|Power requires not having this campaign status. + else if (infile.key == "requires_not_status") power_cell.back().cells[0].requires_not_status.push_back(camp->registerStatus(infile.val)); + + // @ATTR power.visible_requires_status|repeatable(string)|(Deprecated as of v1.11.75) Hide the power if we don't have this campaign status. + else if (infile.key == "visible_requires_status") { + infile.error("MenuPowers: visible_requires_status is deprecated. Use requires_status and visible_when_locked=false instead."); + power_cell.back().cells[0].requires_status.push_back(camp->registerStatus(infile.val)); + power_cell.back().cells[0].visible_when_locked = false; + } + // @ATTR power.visible_requires_not_status|repeatable(string)|(Deprecated as of v1.11.75) Hide the power if we have this campaign status. + else if (infile.key == "visible_requires_not_status") { + infile.error("MenuPowers: visible_requires_not_status is deprecated. Use requires_not_status and visible_when_locked=false instead."); + power_cell.back().cells[0].requires_not_status.push_back(camp->registerStatus(infile.val)); + power_cell.back().cells[0].visible_when_locked = false; + } // @ATTR power.upgrades|list(power_id)|A list of upgrade power ids that this power slot can upgrade to. Each of these powers should have a matching upgrade section. else if (infile.key == "upgrades") { std::string repeat_val = Parse::popFirstString(infile.val); while (repeat_val != "") { - power_cell.back().cells.push_back(MenuPowersCell()); - power_cell.back().cells.back().id = Parse::toInt(repeat_val); + PowerID test_id = Parse::toPowerID(repeat_val); + if (test_id == power_cell.back().cells[0].id) { + infile.error("MenuPowers: Upgrade ID '%d' is the same as the base ID. Ignoring.", test_id); + } + else { + power_cell.back().cells.push_back(MenuPowersCell()); + power_cell.back().cells.back().id = test_id; + } repeat_val = Parse::popFirstString(infile.val); } @@ -461,6 +474,11 @@ power_cell.back().upgrade_button = new WidgetButton("images/menus/buttons/button_plus.png"); } } + + // @ATTR power.visible|bool|Controls whether or not a power is visible or hidden regardless of unlocked state. Defaults to true. + else if (infile.key == "visible") power_cell.back().cells[0].visible = Parse::toBool(infile.val); + // @ATTR power.visible_when_locked|bool|Controls whether or not a power is visible or hidden when the power is locked. Defaults to true. + else if (infile.key == "visible_when_locked") power_cell.back().cells[0].visible_when_locked = Parse::toBool(infile.val); else infile.error("MenuPowers: '%s' is not a valid key.", infile.key.c_str()); } @@ -501,12 +519,29 @@ // @ATTR upgrade.requires_level|int|Upgrade requires at least this level for the hero. else if (infile.key == "requires_level") power_cell_upgrade.back().requires_level = Parse::toInt(infile.val); // @ATTR upgrade.requires_power|int|Upgrade requires another power id. - else if (infile.key == "requires_power") power_cell_upgrade.back().requires_power.push_back(Parse::toInt(infile.val)); - - // @ATTR upgrade.visible_requires_status|repeatable(string)|Hide the upgrade if we don't have this campaign status. - else if (infile.key == "visible_requires_status") power_cell_upgrade.back().visible_requires_status.push_back(camp->registerStatus(infile.val)); - // @ATTR upgrade.visible_requires_not_status|repeatable(string)|Hide the upgrade if we have this campaign status. - else if (infile.key == "visible_requires_not_status") power_cell_upgrade.back().visible_requires_not.push_back(camp->registerStatus(infile.val)); + else if (infile.key == "requires_power") power_cell_upgrade.back().requires_power.push_back(Parse::toPowerID(infile.val)); + // @ATTR upgrade.requires_status|repeatable(string)|Upgrade requires this campaign status. + else if (infile.key == "requires_status") power_cell_upgrade.back().requires_status.push_back(camp->registerStatus(infile.val)); + // @ATTR upgrade.requires_not_status|repeatable(string)|Upgrade requires not having this campaign status. + else if (infile.key == "requires_not_status") power_cell_upgrade.back().requires_not_status.push_back(camp->registerStatus(infile.val)); + + // @ATTR upgrade.visible_requires_status|repeatable(string)|(Deprecated as of v1.11.75) Hide the upgrade if we don't have this campaign status. + else if (infile.key == "visible_requires_status") { + infile.error("MenuPowers: visible_requires_status is deprecated. Use requires_status and visible_when_locked=false instead."); + power_cell_upgrade.back().requires_status.push_back(camp->registerStatus(infile.val)); + power_cell_upgrade.back().visible_when_locked = false; + } + // @ATTR upgrade.visible_requires_not_status|repeatable(string)|(Deprecated as of v1.11.75) Hide the upgrade if we have this campaign status. + else if (infile.key == "visible_requires_not_status") { + infile.error("MenuPowers: visible_requires_not_status is deprecated. Use requires_not_status and visible_when_locked=false instead."); + power_cell_upgrade.back().requires_not_status.push_back(camp->registerStatus(infile.val)); + power_cell_upgrade.back().visible_when_locked = false; + } + + // @ATTR upgrade.visible|bool|Controls whether or not a power is visible or hidden regardless of unlocked state. Defaults to true. + else if (infile.key == "visible") power_cell_upgrade.back().visible = Parse::toBool(infile.val); + // @ATTR upgrade.visible_when_locked|bool|Controls whether or not a power is visible or hidden when the power is locked. Defaults to true. + else if (infile.key == "visible_when_locked") power_cell_upgrade.back().visible_when_locked = Parse::toBool(infile.val); else infile.error("MenuPowers: '%s' is not a valid key.", infile.key.c_str()); } @@ -515,16 +550,24 @@ if (!pcell) return false; + if (pc->stats.level < pcell->requires_level) + return false; + + for (size_t i = 0; i < eset->primary_stats.list.size(); ++i) { + if (pc->stats.get_primary(i) < pcell->requires_primary[i]) + return false; + } + + for (size_t i = 0; i < pcell->requires_status.size(); ++i) + if (!camp->checkStatus(pcell->requires_status[i])) + return false; + + for (size_t i = 0; i < pcell->requires_not_status.size(); ++i) + if (camp->checkStatus(pcell->requires_not_status[i])) + return false; + for (size_t i = 0; i < pcell->requires_power.size(); ++i) { if (!checkUnlocked(getCellByPowerIndex(pcell->requires_power[i]))) - return false; - } - - if (pc->stats.level < pcell->requires_level) - return false; - - for (size_t i = 0; i < eset->primary_stats.list.size(); ++i) { - if (pc->stats.get_primary(i) < pcell->requires_primary[i]) return false; } @@ -542,9 +585,6 @@ // If this power is not in the menu, than it has no requirements if (!pcell) return true; - - if (!pcell->isVisible()) - return false; // If power_id is saved into vector, it's unlocked anyway // check if the unlocked flag is set and check the player's power list @@ -569,9 +609,6 @@ if (!pcell) return true; - if (!pcell->isVisible()) - return false; - // If we already have a power, don't try to unlock it if (checkUnlocked(pcell)) return false; @@ -601,7 +638,7 @@ // remove passive effects if (powers->powers[pcell->id].passive && pcell->passive_on) { - std::vector<int>::iterator passive_it = std::find(pc->stats.powers_passive.begin(), pc->stats.powers_passive.end(), pcell->id); + std::vector<PowerID>::iterator passive_it = std::find(pc->stats.powers_passive.begin(), pc->stats.powers_passive.end(), pcell->id); if (passive_it != pc->stats.powers_passive.end()) pc->stats.powers_passive.erase(passive_it); @@ -611,18 +648,16 @@ } // remove from player's power list - std::vector<int>::iterator it = std::find(pc->stats.powers_list.begin(), pc->stats.powers_list.end(), pcell->id); + std::vector<PowerID>::iterator it = std::find(pc->stats.powers_list.begin(), pc->stats.powers_list.end(), pcell->id); if (it != pc->stats.powers_list.end()) pc->stats.powers_list.erase(it); // remove from action bar menu->act->addPower(0, pcell->id); - // lock higher levels as well - MenuPowersCell* next_cell = pcell->next; - while (next_cell) { - lockCell(next_cell); - next_cell = next_cell->next; + // lock higher levels as well (careful: recursion) + if (pcell->next) { + lockCell(pcell->next); } } @@ -636,9 +671,22 @@ return pcell == power_cell[pcell->group].getBonusCurrent(power_cell[pcell->group].getCurrent()); } -MenuPowersCell* MenuPowers::getCellByPowerIndex(int power_index) { +bool MenuPowers::isCellVisible(MenuPowersCell* pcell) { + if (!pcell) + return false; + + if (!pcell->visible) + return false; + + if (!pcell->visible_when_locked && !checkUnlocked(pcell)) + return false; + + return true; +} + +MenuPowersCell* MenuPowers::getCellByPowerIndex(PowerID power_index) { // Powers can not have an id of 0 - if (power_index <= 0) + if (power_index == 0) return NULL; // Find cell with our power @@ -687,7 +735,7 @@ } if (power_cell[i].cells[j].is_unlocked) { - if (!power_cell[i].cells[j].isVisible() || !checkRequirements(&power_cell[i].cells[j])) { + if (!checkRequirements(&power_cell[i].cells[j])) { lockCell(&power_cell[i].cells[j]); did_cell_lock = true; } @@ -721,26 +769,34 @@ for (size_t j = 0; j < power_cell[i].cells.size(); ++j) { MenuPowersCell* pcell = &power_cell[i].cells[j]; - if (pcell != bonus_pcell || ((!checkRequirements(pcell) || (!pcell->is_unlocked && !isBonusCell(pcell))) && pcell->passive_on)) { + if (pcell != bonus_pcell || (pcell->passive_on && powers->powers[pcell->id].passive && (!checkRequirements(current_pcell) || (!pcell->is_unlocked && !isBonusCell(pcell))))) { // passive power is activated, but does not meet requirements, so remove it - std::vector<int>::iterator passive_it = std::find(pc->stats.powers_passive.begin(), pc->stats.powers_passive.end(), pcell->id); - if (passive_it != pc->stats.powers_passive.end()) + std::vector<PowerID>::iterator passive_it = std::find(pc->stats.powers_passive.begin(), pc->stats.powers_passive.end(), pcell->id); + if (passive_it != pc->stats.powers_passive.end()) { pc->stats.powers_passive.erase(passive_it); - pc->stats.effects.removeEffectPassive(pcell->id); - pcell->passive_on = false; - pc->stats.refresh_stats = true; - } - else if (pcell == bonus_pcell && checkRequirements(current_pcell) && !pcell->passive_on) { + pc->stats.effects.removeEffectPassive(pcell->id); + pcell->passive_on = false; + pc->stats.refresh_stats = true; + + // passive powers can lock equipment slots, so update equipment here + menu->inv->applyEquipment(); + } + } + else if (pcell == bonus_pcell && !pcell->passive_on && powers->powers[pcell->id].passive && checkRequirements(current_pcell)) { // passive power has not been activated, so activate it here - std::vector<int>::iterator passive_it = std::find(pc->stats.powers_passive.begin(), pc->stats.powers_passive.end(), pcell->id); - if (passive_it == pc->stats.powers_passive.end()) + std::vector<PowerID>::iterator passive_it = std::find(pc->stats.powers_passive.begin(), pc->stats.powers_passive.end(), pcell->id); + if (passive_it == pc->stats.powers_passive.end()) { pc->stats.powers_passive.push_back(pcell->id); - pcell->passive_on = true; - // for passives without special triggers, we need to trigger them here - if (pc->stats.effects.triggered_others) - powers->activateSinglePassive(&pc->stats, pcell->id); + pcell->passive_on = true; + // for passives without special triggers, we need to trigger them here + if (pc->stats.effects.triggered_others) + powers->activateSinglePassive(&pc->stats, pcell->id); + + // passive powers can lock equipment slots, so update equipment here + menu->inv->applyEquipment(); + } } } @@ -763,18 +819,44 @@ return used; } -void MenuPowers::createTooltip(TooltipData* tip_data, MenuPowersCell* pcell, bool show_unlock_prompt) { - if (!pcell) +void MenuPowers::createTooltipFromActionBar(TooltipData* tip_data, unsigned slot, int tooltip_length) { + if (slot >= menu->act->hotkeys.size() || slot >= menu->act->hotkeys_mod.size()) return; - MenuPowersCell* pcell_bonus = power_cell[pcell->group].getBonusCurrent(pcell); - - const Power &pwr = powers->powers[pcell_bonus->id]; + PowerID power_index = menu->act->hotkeys[slot]; + PowerID mod_power_index = menu->act->hotkeys_mod[slot]; + + PowerID pindex = mod_power_index; + MenuPowersCell* pcell = getCellByPowerIndex(pindex); + + // action bar slot is modded and not found in the menu + if (power_index != mod_power_index && !pcell) { + PowerID test_pindex = power_index; + MenuPowersCell* test_pcell = getCellByPowerIndex(test_pindex); + + // non-modded power found in the menu; use it instead + if (test_pcell) { + pindex = test_pindex; + pcell = test_pcell; + } + // else, neither is found in the menu, so default to the modded power + } + + createTooltip(tip_data, pcell, pindex, false, tooltip_length); +} + +void MenuPowers::createTooltip(TooltipData* tip_data, MenuPowersCell* pcell, PowerID power_index, bool show_unlock_prompt, int tooltip_length) { + + MenuPowersCell* pcell_bonus = NULL; + if (pcell) { + pcell_bonus = power_cell[pcell->group].getBonusCurrent(pcell); + } + const Power &pwr = pcell_bonus ? powers->powers[pcell_bonus->id] : powers->powers[power_index]; { std::stringstream ss; ss << pwr.name; - if (pcell->upgrade_level > 0) { + if (pcell && pcell->upgrade_level > 0) { ss << " (" << msg->get("Level %d", pcell->upgrade_level); int bonus_levels = power_cell[pcell->group].getBonusLevels(); if (bonus_levels > 0) @@ -784,8 +866,13 @@ tip_data->addText(ss.str()); } + if (tooltip_length == MenuPowers::TOOLTIP_SHORT || (!pcell && tooltip_length != MenuPowers::TOOLTIP_LONG_ALL)) + return; + if (pwr.passive) tip_data->addText(msg->get("Passive")); - tip_data->addColoredText(Utils::substituteVarsInString(pwr.description, pc), font->getColor(FontEngine::COLOR_ITEM_FLAVOR)); + if (pwr.description != "") { + tip_data->addColoredText(Utils::substituteVarsInString(pwr.description, pc), font->getColor(FontEngine::COLOR_ITEM_FLAVOR)); + } // add mana cost if (pwr.requires_mp > 0) { @@ -797,206 +884,193 @@ } // add cooldown time if (pwr.cooldown > 0) { - std::stringstream ss; - ss << msg->get("Cooldown:") << " " << Utils::getDurationString(pwr.cooldown, 2); - tip_data->addText(ss.str()); + tip_data->addText(msg->get("Cooldown:") + " " + Utils::getDurationString(pwr.cooldown, 2)); } for (size_t i=0; i<pwr.post_effects.size(); ++i) { std::stringstream ss; EffectDef* effect_ptr = powers->getEffectDef(pwr.post_effects[i].id); - // base stats - if (effect_ptr == NULL) { + int effect_type = Effect::NONE; + if (effect_ptr) { + effect_type = effect_ptr->type; + } + else { + effect_type = Effect::getTypeFromString(pwr.post_effects[i].id); + } + + if (Effect::typeIsStat(effect_type) || + Effect::typeIsDmgMin(effect_type) || + Effect::typeIsDmgMax(effect_type) || + Effect::typeIsResist(effect_type) || + Effect::typeIsPrimary(effect_type)) + { if (pwr.post_effects[i].magnitude > 0) { ss << "+"; } - ss << pwr.post_effects[i].magnitude; - bool found_key = false; - - for (int j=0; j<Stats::COUNT; ++j) { - if (pwr.post_effects[i].id == Stats::KEY[j]) { - if (Stats::PERCENT[j]) - ss << "%"; - - ss << " " << Stats::NAME[j]; - - found_key = true; - break; - } - } - - if (!found_key) { - for (size_t j=0; j<eset->elements.list.size(); ++j) { - if (pwr.post_effects[i].id == eset->elements.list[j].id + "_resist") { - ss << "% " << msg->get("Resistance (%s)", eset->elements.list[j].name); - found_key = true; - break; - } - } - } - - if (!found_key) { - for (size_t j=0; j<eset->primary_stats.list.size(); ++j) { - if (pwr.post_effects[i].id == eset->primary_stats.list[j].id) { - ss << " " << eset->primary_stats.list[j].name; - found_key = true; - break; - } - } - } - - // NOTE don't need to set found_key after this, since this is the last set of keys to check - if (!found_key) { - for (size_t j=0; j<eset->damage_types.list.size(); ++j) { - if (pwr.post_effects[i].id == eset->damage_types.list[j].min) { - ss << " " << eset->damage_types.list[j].name_min; - break; - } - else if (pwr.post_effects[i].id == eset->damage_types.list[j].max) { - ss << " " << eset->damage_types.list[j].name_max; - break; - } - } - } - } - else { - if (effect_ptr->type == "damage") { - ss << pwr.post_effects[i].magnitude << " " << msg->get("Damage per second"); - } - else if (effect_ptr->type == "damage_percent") { - ss << pwr.post_effects[i].magnitude << "% " << msg->get("Damage per second"); - } - else if (effect_ptr->type == "hpot") { - ss << pwr.post_effects[i].magnitude << " " << msg->get("HP per second"); - } - else if (effect_ptr->type == "hpot_percent") { - ss << pwr.post_effects[i].magnitude << "% " << msg->get("HP per second"); - } - else if (effect_ptr->type == "mpot") { - ss << pwr.post_effects[i].magnitude << " " << msg->get("MP per second"); - } - else if (effect_ptr->type == "mpot_percent") { - ss << pwr.post_effects[i].magnitude << "% " << msg->get("MP per second"); - } - else if (effect_ptr->type == "speed") { - if (pwr.post_effects[i].magnitude == 0) - ss << msg->get("Immobilize"); + } + + if (Effect::typeIsStat(effect_type)) { + int index = Effect::getStatFromType(effect_type); + if (Stats::PERCENT[index]) { + ss << "%"; + } + ss << " " << Stats::NAME[index]; + } + else if (Effect::typeIsDmgMin(effect_type)) { + size_t index = Effect::getDmgFromType(effect_type); + ss << " " << eset->damage_types.list[index].name_min; + } + else if (Effect::typeIsDmgMax(effect_type)) { + size_t index = Effect::getDmgFromType(effect_type); + ss << " " << eset->damage_types.list[index].name_max; + } + else if (Effect::typeIsResist(effect_type)) { + size_t index = Effect::getResistFromType(effect_type); + ss << "% " << msg->get("Resistance (%s)", eset->elements.list[index].name); + } + else if (Effect::typeIsPrimary(effect_type)) { + size_t index = Effect::getPrimaryFromType(effect_type); + ss << " " << eset->primary_stats.list[index].name; + } + else if (effect_type == Effect::DAMAGE) { + ss << pwr.post_effects[i].magnitude << " " << msg->get("Damage per second"); + } + else if (effect_type == Effect::DAMAGE_PERCENT) { + ss << pwr.post_effects[i].magnitude << "% " << msg->get("Damage per second"); + } + else if (effect_type == Effect::HPOT) { + ss << pwr.post_effects[i].magnitude << " " << msg->get("HP per second"); + } + else if (effect_type == Effect::HPOT_PERCENT) { + ss << pwr.post_effects[i].magnitude << "% " << msg->get("HP per second"); + } + else if (effect_type == Effect::MPOT) { + ss << pwr.post_effects[i].magnitude << " " << msg->get("MP per second"); + } + else if (effect_type == Effect::MPOT_PERCENT) { + ss << pwr.post_effects[i].magnitude << "% " << msg->get("MP per second"); + } + else if (effect_type == Effect::SPEED) { + if (pwr.post_effects[i].magnitude == 0) + ss << msg->get("Immobilize"); + else + ss << msg->get("%d%% Speed", pwr.post_effects[i].magnitude); + } + else if (effect_type == Effect::ATTACK_SPEED) { + ss << msg->get("%d%% Attack Speed", pwr.post_effects[i].magnitude); + } + else if (effect_type == Effect::IMMUNITY) { + ss << msg->get("Immunity"); + } + else if (effect_type == Effect::IMMUNITY_DAMAGE) { + ss << msg->get("Immunity to damage over time"); + } + else if (effect_type == Effect::IMMUNITY_SLOW) { + ss << msg->get("Immunity to slow"); + } + else if (effect_type == Effect::IMMUNITY_STUN) { + ss << msg->get("Immunity to stun"); + } + else if (effect_type == Effect::IMMUNITY_HP_STEAL) { + ss << msg->get("Immunity to HP steal"); + } + else if (effect_type == Effect::IMMUNITY_MP_STEAL) { + ss << msg->get("Immunity to MP steal"); + } + else if (effect_type == Effect::IMMUNITY_KNOCKBACK) { + ss << msg->get("Immunity to knockback"); + } + else if (effect_type == Effect::IMMUNITY_DAMAGE_REFLECT) { + ss << msg->get("Immunity to damage reflection"); + } + + // TODO Effect::IMMUNITY_STAT_DEBUFF? + + else if (effect_type == Effect::STUN) { + ss << msg->get("Stun"); + } + else if (effect_type == Effect::REVIVE) { + ss << msg->get("Automatic revive on death"); + } + else if (effect_type == Effect::CONVERT) { + ss << msg->get("Convert"); + } + else if (effect_type == Effect::FEAR) { + ss << msg->get("Fear"); + } + else if (effect_type == Effect::DEATH_SENTENCE) { + ss << msg->get("Lifespan"); + } + else if (effect_type == Effect::SHIELD) { + if (pwr.base_damage == eset->damage_types.list.size()) + continue; + + if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_MULTIPLY) { + int magnitude = pc->stats.getDamageMax(pwr.base_damage) * pwr.mod_damage_value_min / 100; + ss << magnitude; + } + else if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_ADD) { + int magnitude = pc->stats.getDamageMax(pwr.base_damage) + pwr.mod_damage_value_min; + ss << magnitude; + } + else if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_ABSOLUTE) { + if (pwr.mod_damage_value_max == 0 || pwr.mod_damage_value_min == pwr.mod_damage_value_max) + ss << pwr.mod_damage_value_min; else - ss << msg->get("%d%% Speed", pwr.post_effects[i].magnitude); - } - else if (effect_ptr->type == "attack_speed") { - ss << msg->get("%d%% Attack Speed", pwr.post_effects[i].magnitude); - } - else if (effect_ptr->type == "immunity") { - ss << msg->get("Immunity"); - } - else if (effect_ptr->type == "immunity_damage") { - ss << msg->get("Immunity to damage over time"); - } - else if (effect_ptr->type == "immunity_slow") { - ss << msg->get("Immunity to slow"); - } - else if (effect_ptr->type == "immunity_stun") { - ss << msg->get("Immunity to stun"); - } - else if (effect_ptr->type == "immunity_hp_steal") { - ss << msg->get("Immunity to HP steal"); - } - else if (effect_ptr->type == "immunity_mp_steal") { - ss << msg->get("Immunity to MP steal"); - } - else if (effect_ptr->type == "immunity_knockback") { - ss << msg->get("Immunity to knockback"); - } - else if (effect_ptr->type == "immunity_damage_reflect") { - ss << msg->get("Immunity to damage reflection"); - } - else if (effect_ptr->type == "stun") { - ss << msg->get("Stun"); - } - else if (effect_ptr->type == "revive") { - ss << msg->get("Automatic revive on death"); - } - else if (effect_ptr->type == "convert") { - ss << msg->get("Convert"); - } - else if (effect_ptr->type == "fear") { - ss << msg->get("Fear"); - } - else if (effect_ptr->type == "death_sentence") { - ss << msg->get("Lifespan"); - } - else if (effect_ptr->type == "shield") { - if (pwr.base_damage == eset->damage_types.list.size()) - continue; - - if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_MULTIPLY) { - int magnitude = pc->stats.getDamageMax(pwr.base_damage) * pwr.mod_damage_value_min / 100; - ss << magnitude; - } - else if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_ADD) { - int magnitude = pc->stats.getDamageMax(pwr.base_damage) + pwr.mod_damage_value_min; - ss << magnitude; - } - else if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_ABSOLUTE) { - if (pwr.mod_damage_value_max == 0 || pwr.mod_damage_value_min == pwr.mod_damage_value_max) - ss << pwr.mod_damage_value_min; - else - ss << pwr.mod_damage_value_min << "-" << pwr.mod_damage_value_max; - } - else { - ss << pc->stats.getDamageMax(pwr.base_damage); - } - - ss << " " << msg->get("Magical Shield"); - } - else if (effect_ptr->type == "heal") { - if (pwr.base_damage == eset->damage_types.list.size()) - continue; - - int mag_min = pc->stats.getDamageMin(pwr.base_damage); - int mag_max = pc->stats.getDamageMax(pwr.base_damage); - - if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_MULTIPLY) { - mag_min = mag_min * pwr.mod_damage_value_min / 100; - mag_max = mag_max * pwr.mod_damage_value_min / 100; - ss << mag_min << "-" << mag_max; - } - else if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_ADD) { - mag_min = mag_min + pwr.mod_damage_value_min; - mag_max = mag_max + pwr.mod_damage_value_min; - ss << mag_min << "-" << mag_max; - } - else if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_ABSOLUTE) { - if (pwr.mod_damage_value_max == 0 || pwr.mod_damage_value_min == pwr.mod_damage_value_max) - ss << pwr.mod_damage_value_min; - else - ss << pwr.mod_damage_value_min << "-" << pwr.mod_damage_value_max; - } - else { - ss << mag_min << "-" << mag_max; - } - - ss << " " << msg->get("Healing"); - } - else if (effect_ptr->type == "knockback") { - ss << pwr.post_effects[i].magnitude << " " << msg->get("Knockback"); - } - else if (!effect_ptr->name.empty() && pwr.post_effects[i].magnitude > 0) { - if (effect_ptr->can_stack) - ss << "+"; - ss << pwr.post_effects[i].magnitude << " " << msg->get(effect_ptr->name); - } - else if (pwr.post_effects[i].magnitude == 0) { - // nothing - } + ss << pwr.mod_damage_value_min << "-" << pwr.mod_damage_value_max; + } + else { + ss << pc->stats.getDamageMax(pwr.base_damage); + } + + ss << " " << msg->get("Magical Shield"); + } + else if (effect_type == Effect::HEAL) { + if (pwr.base_damage == eset->damage_types.list.size()) + continue; + + int mag_min = pc->stats.getDamageMin(pwr.base_damage); + int mag_max = pc->stats.getDamageMax(pwr.base_damage); + + if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_MULTIPLY) { + mag_min = mag_min * pwr.mod_damage_value_min / 100; + mag_max = mag_max * pwr.mod_damage_value_min / 100; + ss << mag_min << "-" << mag_max; + } + else if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_ADD) { + mag_min = mag_min + pwr.mod_damage_value_min; + mag_max = mag_max + pwr.mod_damage_value_min; + ss << mag_min << "-" << mag_max; + } + else if (pwr.mod_damage_mode == Power::STAT_MODIFIER_MODE_ABSOLUTE) { + if (pwr.mod_damage_value_max == 0 || pwr.mod_damage_value_min == pwr.mod_damage_value_max) + ss << pwr.mod_damage_value_min; + else + ss << pwr.mod_damage_value_min << "-" << pwr.mod_damage_value_max; + } + else { + ss << mag_min << "-" << mag_max; + } + + ss << " " << msg->get("Healing"); + } + else if (effect_type == Effect::KNOCKBACK) { + ss << pwr.post_effects[i].magnitude << " " << msg->get("Knockback"); + } + else if (effect_ptr && !effect_ptr->name.empty() && pwr.post_effects[i].magnitude > 0) { + if (effect_ptr->can_stack) + ss << "+"; + ss << pwr.post_effects[i].magnitude << " " << msg->get(effect_ptr->name); + } + else if (pwr.post_effects[i].magnitude == 0) { + // nothing } if (!ss.str().empty()) { if (pwr.post_effects[i].duration > 0) { - if (effect_ptr && effect_ptr->type == "death_sentence") { + if (effect_type == Effect::DEATH_SENTENCE) { ss << ": " << Utils::getDurationString(pwr.post_effects[i].duration, 2); } else { @@ -1116,57 +1190,59 @@ } } - // add requirement - for (size_t i = 0; i < eset->primary_stats.list.size(); ++i) { - if (pcell->requires_primary[i] > 0) { - if (pc->stats.get_primary(i) < pcell->requires_primary[i]) - tip_data->addColoredText(msg->get("Requires %s %d", eset->primary_stats.list[i].name, pcell->requires_primary[i]), font->getColor(FontEngine::COLOR_MENU_PENALTY)); + if (pcell) { + // add requirement + for (size_t i = 0; i < eset->primary_stats.list.size(); ++i) { + if (pcell->requires_primary[i] > 0) { + if (pc->stats.get_primary(i) < pcell->requires_primary[i]) + tip_data->addColoredText(msg->get("Requires %s %d", eset->primary_stats.list[i].name, pcell->requires_primary[i]), font->getColor(FontEngine::COLOR_MENU_PENALTY)); + else + tip_data->addText(msg->get("Requires %s %d", eset->primary_stats.list[i].name, pcell->requires_primary[i])); + } + } + + // Draw required Level Tooltip + if ((pcell->requires_level > 0) && pc->stats.level < pcell->requires_level) { + tip_data->addColoredText(msg->get("Requires Level %d", pcell->requires_level), font->getColor(FontEngine::COLOR_MENU_PENALTY)); + } + else if ((pcell->requires_level > 0) && pc->stats.level >= pcell->requires_level) { + tip_data->addText(msg->get("Requires Level %d", pcell->requires_level)); + } + + for (size_t j=0; j < pcell->requires_power.size(); ++j) { + MenuPowersCell* req_cell = getCellByPowerIndex(pcell->requires_power[j]); + if (!req_cell) + continue; + + std::string req_power_name; + if (req_cell->upgrade_level > 0) + req_power_name = powers->powers[req_cell->id].name + " (" + msg->get("Level %d", req_cell->upgrade_level) + ")"; else - tip_data->addText(msg->get("Requires %s %d", eset->primary_stats.list[i].name, pcell->requires_primary[i])); - } - } - - // Draw required Level Tooltip - if ((pcell->requires_level > 0) && pc->stats.level < pcell->requires_level) { - tip_data->addColoredText(msg->get("Requires Level %d", pcell->requires_level), font->getColor(FontEngine::COLOR_MENU_PENALTY)); - } - else if ((pcell->requires_level > 0) && pc->stats.level >= pcell->requires_level) { - tip_data->addText(msg->get("Requires Level %d", pcell->requires_level)); - } - - for (size_t j=0; j < pcell->requires_power.size(); ++j) { - MenuPowersCell* req_cell = getCellByPowerIndex(pcell->requires_power[j]); - if (!req_cell) - continue; - - std::string req_power_name; - if (req_cell->upgrade_level > 0) - req_power_name = powers->powers[req_cell->id].name + " (" + msg->get("Level %d", req_cell->upgrade_level) + ")"; - else - req_power_name = powers->powers[req_cell->id].name; - - - // Required Power Tooltip - if (!checkUnlocked(req_cell)) { - tip_data->addColoredText(msg->get("Requires Power: %s", req_power_name), font->getColor(FontEngine::COLOR_MENU_PENALTY)); - } - else { - tip_data->addText(msg->get("Requires Power: %s", req_power_name)); - } - - } - - // Draw unlock power Tooltip - if (pcell->requires_point && !(std::find(pc->stats.powers_list.begin(), pc->stats.powers_list.end(), pcell->id) != pc->stats.powers_list.end())) { - MenuPowersCell* unlock_cell = getCellByPowerIndex(pcell->id); - if (show_unlock_prompt && points_left > 0 && checkUnlock(unlock_cell)) { - tip_data->addColoredText(msg->get("Click to Unlock (uses 1 Skill Point)"), font->getColor(FontEngine::COLOR_MENU_BONUS)); - } - else { - if (pcell->requires_point && points_left < 1) - tip_data->addColoredText(msg->get("Requires 1 Skill Point"), font->getColor(FontEngine::COLOR_MENU_PENALTY)); - else - tip_data->addText(msg->get("Requires 1 Skill Point")); + req_power_name = powers->powers[req_cell->id].name; + + + // Required Power Tooltip + if (!checkUnlocked(req_cell)) { + tip_data->addColoredText(msg->get("Requires Power: %s", req_power_name), font->getColor(FontEngine::COLOR_MENU_PENALTY)); + } + else { + tip_data->addText(msg->get("Requires Power: %s", req_power_name)); + } + + } + + // Draw unlock power Tooltip + if (pcell->requires_point && !(std::find(pc->stats.powers_list.begin(), pc->stats.powers_list.end(), pcell->id) != pc->stats.powers_list.end())) { + MenuPowersCell* unlock_cell = getCellByPowerIndex(pcell->id); + if (show_unlock_prompt && points_left > 0 && checkUnlock(unlock_cell)) { + tip_data->addColoredText(msg->get("Click to Unlock (uses 1 Skill Point)"), font->getColor(FontEngine::COLOR_MENU_BONUS)); + } + else { + if (pcell->requires_point && points_left < 1) + tip_data->addColoredText(msg->get("Requires 1 Skill Point"), font->getColor(FontEngine::COLOR_MENU_PENALTY)); + else + tip_data->addText(msg->get("Requires 1 Skill Point")); + } } } } @@ -1182,7 +1258,7 @@ if (power_cell[i].tab != tab_num) continue; MenuPowersCell* slot_cell = power_cell[i].getCurrent(); - if (!slot_cell || !slot_cell->isVisible()) + if (!slot_cell || !isCellVisible(slot_cell)) continue; if (slots[i]) @@ -1235,29 +1311,45 @@ setUnlockedPowers(); - for (size_t i=0; i<power_cell.size(); i++) { - // make sure invisible cells are skipped in the tablist - if (slots[i]) - slots[i]->enable_tablist_nav = power_cell[i].getCurrent()->isVisible(); - - //upgrade buttons logic - if (power_cell[i].upgrade_button != NULL) { - power_cell[i].upgrade_button->enabled = false; - if (pc->stats.hp > 0) { - // enable button only if current level is unlocked and next level can be unlocked - if (checkUpgrade(power_cell[i].getCurrent())) { - power_cell[i].upgrade_button->enabled = true; - } - if ((!tab_control || power_cell[i].tab == tab_control->getActiveTab()) && power_cell[i].upgrade_button->checkClick()) { - upgradePower(power_cell[i].getCurrent(), !UPGRADE_POWER_ALL_TABS); - } - } - } - } - points_left = (pc->stats.level * pc->stats.power_points_per_level) - getPointsUsed(); if (points_left > 0) { newPowerNotification = true; + } + + for (size_t i=0; i<power_cell.size(); i++) { + // make sure invisible cells are skipped in the tablist + if (visible && slots[i]) + slots[i]->enable_tablist_nav = isCellVisible(power_cell[i].getCurrent()); + + // disable upgrade buttons by default + if (power_cell[i].upgrade_button != NULL) { + power_cell[i].upgrade_button->enabled = false; + } + + // try to automatically upgrade powers is no power point is required + MenuPowersCell* pcell = power_cell[i].getCurrent(); + while (checkUpgrade(pcell)) { + if (pcell->next && !pcell->next->requires_point) { + // automatic upgrade possible; do upgrade and re-check upgrade possibility + upgradePower(pcell, UPGRADE_POWER_ALL_TABS); + pcell = power_cell[i].getCurrent(); + if (power_cell[i].upgrade_button != NULL) + power_cell[i].upgrade_button->enabled = (pc->stats.hp > 0 && isCellVisible(pcell) && checkUpgrade(pcell)); + } + else { + // power point required or no upgrade available; stop trying to upgrade + if (power_cell[i].upgrade_button != NULL) + power_cell[i].upgrade_button->enabled = (pc->stats.hp > 0 && isCellVisible(pcell)); + break; + } + } + + // handle clicking of upgrade button + if (visible && pc->stats.hp > 0 && power_cell[i].upgrade_button != NULL) { + if ((!tab_control || power_cell[i].tab == tab_control->getActiveTab()) && power_cell[i].upgrade_button->checkClick()) { + upgradePower(power_cell[i].getCurrent(), !UPGRADE_POWER_ALL_TABS); + } + } } if (!visible) return; @@ -1348,16 +1440,12 @@ // stats if (!label_unspent->isHidden()) { - std::stringstream ss; - - ss.str(""); - if (points_left == 1) { - ss << msg->get("%d unspent skill point", points_left); - } - else if (points_left > 1) { - ss << msg->get("%d unspent skill points", points_left); - } - label_unspent->setText(ss.str()); + if (points_left >= 1) { + label_unspent->setText(msg->get("Available skill points: %d", points_left)); + } + else { + label_unspent->setText(""); + } label_unspent->render(); } } @@ -1377,16 +1465,16 @@ continue; MenuPowersCell* tip_cell = power_cell[i].getCurrent(); - if (!tip_cell->isVisible()) + if (!isCellVisible(tip_cell)) continue; if (slots[i] && Utils::isWithinRect(slots[i]->pos, position)) { bool base_unlocked = checkUnlocked(tip_cell); - createTooltip(&tip_data, tip_cell, !base_unlocked); + createTooltip(&tip_data, tip_cell, tip_cell->id, !base_unlocked, MenuPowers::TOOLTIP_LONG_MENU); if (tip_cell->next) { tip_data.addText("\n" + msg->get("Next Level:")); - createTooltip(&tip_data, tip_cell->next, base_unlocked); + createTooltip(&tip_data, tip_cell->next, tip_cell->next->id, base_unlocked, MenuPowers::TOOLTIP_LONG_MENU); } tooltipm->push(tip_data, position, TooltipData::STYLE_FLOAT); @@ -1398,7 +1486,7 @@ /** * Click-to-drag a power (to the action bar) */ -int MenuPowers::click(const Point& mouse) { +PowerID MenuPowers::click(const Point& mouse) { int active_tab = (tab_control) ? tab_control->getActiveTab() : 0; for (size_t i=0; i<power_cell.size(); i++) { @@ -1417,7 +1505,7 @@ } MenuPowersCell* pcell = power_cell[i].getCurrent(); - if (!pcell) + if (!pcell || !isCellVisible(pcell)) return 0; if (checkUnlock(pcell) && points_left > 0 && pcell->requires_point) { @@ -1430,12 +1518,14 @@ } else if (checkUnlocked(pcell) && !powers->powers[pcell->id].passive) { // pick up and drag power - slots[i]->defocus(); - if (!tabs.empty()) { - tablist_pow[active_tab].setCurrent(NULL); - } - else { - tablist.setCurrent(NULL); + if (inpt->usingMouse()) { + slots[i]->defocus(); + if (!tabs.empty()) { + tablist_pow[active_tab].setCurrent(NULL); + } + else { + tablist.setCurrent(NULL); + } } return power_cell[i].getBonusCurrent(pcell)->id; } @@ -1471,7 +1561,7 @@ /** * Return true if required stats for power usage are met. Else return false. */ -bool MenuPowers::meetsUsageStats(int power_index) { +bool MenuPowers::meetsUsageStats(PowerID power_index) { // Find cell with our power MenuPowersCell* pcell = getCellByPowerIndex(power_index); @@ -1510,7 +1600,7 @@ } } -void MenuPowers::addBonusLevels(int power_index, int bonus_levels) { +void MenuPowers::addBonusLevels(PowerID power_index, int bonus_levels) { MenuPowersCell* pcell = getCellByPowerIndex(power_index); if (!pcell) @@ -1530,19 +1620,18 @@ pgroup->bonus_levels.push_back(bonus); } -std::string MenuPowers::getItemBonusPowerReqString(int power_index) { +std::string MenuPowers::getItemBonusPowerReqString(PowerID power_index) { MenuPowersCell* pcell = getCellByPowerIndex(power_index); if (!pcell) return ""; - std::stringstream ss; - ss << powers->powers[power_index].name; + std::string output = powers->powers[power_index].name; if (pcell->upgrade_level > 0) { - ss << " (" << msg->get("Level %d", pcell->upgrade_level) << ")"; - } - - return ss.str(); + output += " (" + msg->get("Level %d", pcell->upgrade_level) + ")"; + } + + return output; } bool MenuPowers::isTabListSelected() { diff --git a/src/MenuPowers.h b/src/MenuPowers.h index 0f26150..d01c5a1 100644 --- a/src/MenuPowers.h +++ b/src/MenuPowers.h @@ -52,15 +52,18 @@ class MenuPowersCell { public: MenuPowersCell(); - bool isVisible(); - int id; + PowerID id; + bool requires_point; + int requires_level; - bool requires_point; std::vector<int> requires_primary; - std::vector<int> requires_power; - std::vector<StatusID> visible_requires_status; - std::vector<StatusID> visible_requires_not; + std::vector<PowerID> requires_power; + std::vector<StatusID> requires_status; + std::vector<StatusID> requires_not_status; + + bool visible; + bool visible_when_locked; int upgrade_level; bool passive_on; @@ -103,14 +106,15 @@ bool checkUpgrade(MenuPowersCell* pcell); void lockCell(MenuPowersCell* pcell); bool isBonusCell(MenuPowersCell* pcell); + bool isCellVisible(MenuPowersCell* pcell); - MenuPowersCell* getCellByPowerIndex(int power_index); + MenuPowersCell* getCellByPowerIndex(PowerID power_index); void upgradePower(MenuPowersCell* pcell, bool ignore_tab); int getPointsUsed(); - void createTooltip(TooltipData* tip_data, MenuPowersCell* pcell, bool show_unlock_prompt); + void createTooltip(TooltipData* tip_data, MenuPowersCell* pcell, PowerID power_index, bool show_unlock_prompt, int tooltip_length); void renderPowers(int tab_num); std::vector<MenuPowersCellGroup> power_cell; @@ -134,11 +138,15 @@ bool tree_loaded; - size_t prev_powers_list_size; - int default_power_tab; public: + enum { + TOOLTIP_SHORT = 0, + TOOLTIP_LONG_MENU = 1, + TOOLTIP_LONG_ALL = 2 + }; + MenuPowers(); ~MenuPowers(); void align(); @@ -149,18 +157,20 @@ void render(); void renderTooltips(const Point& position); - int click(const Point& mouse); + PowerID click(const Point& mouse); void upgradeBySlotIndex(int slot_index); void setUnlockedPowers(); void resetToBasePowers(); - bool meetsUsageStats(int power_index); + bool meetsUsageStats(PowerID power_index); void clearActionBarBonusLevels(); void clearBonusLevels(); - void addBonusLevels(int power_index, int bonus_levels); - std::string getItemBonusPowerReqString(int power_index); + void addBonusLevels(PowerID power_index, int bonus_levels); + std::string getItemBonusPowerReqString(PowerID power_index); + + void createTooltipFromActionBar(TooltipData* tip_data, unsigned slot, int tooltip_length); std::vector<WidgetSlot*> slots; // power slot Widgets diff --git a/src/MenuStash.cpp b/src/MenuStash.cpp index a049ce0..19f92ff 100644 --- a/src/MenuStash.cpp +++ b/src/MenuStash.cpp @@ -39,14 +39,28 @@ #include "UtilsParsing.h" #include "WidgetButton.h" #include "WidgetSlot.h" +#include "WidgetTabControl.h" + +MenuStashTab::MenuStashTab(const std::string& _id, const std::string& _name, const std::string& _filename, bool _is_private) + : id(_id) + , name(_name) + , filename(_filename) + , is_private(_is_private) + , is_legacy(false) + , updated(false) + , stock() +{} + +MenuStashTab::~MenuStashTab() { +} MenuStash::MenuStash() : Menu() , closeButton(new WidgetButton("images/menus/buttons/button_x.png")) - , stock() - , updated(false) + , tab_control(new WidgetTabControl()) + , activetab(0) + , tabs() { - setBackground("images/menus/stash.png"); int slots_cols = 8; // default if menus/stash.txt::stash_cols not set @@ -57,43 +71,94 @@ // @CLASS MenuStash|Description of menus/stash.txt if (infile.open("menus/stash.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { while(infile.next()) { - if (parseMenuKey(infile.key, infile.val)) - continue; - - // @ATTR close|point|Position of the close button. - if (infile.key == "close") { - Point pos = Parse::toPoint(infile.val); - closeButton->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); + if (infile.new_section) { + if (infile.section == "tab") { + std::stringstream id_str, name_str, filename_str; + + // default tab settings + id_str << "Stash " << tabs.size(); + name_str << msg->get("Stash") << " " << tabs.size(); + filename_str << "stash_tab_" << tabs.size() << ".txt"; + + tabs.push_back(MenuStashTab(id_str.str(), name_str.str(), filename_str.str(), MenuStashTab::IS_PRIVATE)); + } } - // @ATTR slots_area|point|Position of the top-left slot. - else if (infile.key == "slots_area") { - slots_area.x = Parse::popFirstInt(infile.val); - slots_area.y = Parse::popFirstInt(infile.val); + + if (infile.section == "") { + if (parseMenuKey(infile.key, infile.val)) + continue; + + // @ATTR close|point|Position of the close button. + if (infile.key == "close") { + Point pos = Parse::toPoint(infile.val); + closeButton->setBasePos(pos.x, pos.y, Utils::ALIGN_TOPLEFT); + } + // @ATTR slots_area|point|Position of the top-left slot. + else if (infile.key == "slots_area") { + slots_area.x = Parse::popFirstInt(infile.val); + slots_area.y = Parse::popFirstInt(infile.val); + } + // @ATTR stash_cols|int|The number of columns for the grid of slots. + else if (infile.key == "stash_cols") { + slots_cols = std::max(1, Parse::toInt(infile.val)); + } + // @ATTR stash_rows|int|The number of rows for the grid of slots. + else if (infile.key == "stash_rows") { + slots_rows = std::max(1, Parse::toInt(infile.val)); + } + // @ATTR label_title|label|Position of the "Stash" label. + else if (infile.key == "label_title") { + label_title.setFromLabelInfo(Parse::popLabelInfo(infile.val)); + } + // @ATTR currency|label|Position of the label displaying the amount of currency stored in the stash. + else if (infile.key == "currency") { + label_currency.setFromLabelInfo(Parse::popLabelInfo(infile.val)); + } + else { + infile.error("MenuStash: '%s' is not a valid key.", infile.key.c_str()); + } } - // @ATTR stash_cols|int|The number of columns for the grid of slots. - else if (infile.key == "stash_cols") { - slots_cols = std::max(1, Parse::toInt(infile.val)); + else if (infile.section == "tab") { + // don't load any settings for the "Private" and "Shared" tabs + if (tabs.back().is_legacy) + continue; + + if (infile.key == "name") { + // @ATTR tab.name|["Private", "Shared", string]|The displayed name of this tab. It is also used to determine the filename of the stash file that the engine will create. 'Private' and 'Shared' will use their legacy filenames for compatibility. + std::string name_str = infile.val; + tabs.back().id = name_str; + tabs.back().name = msg->get(name_str); + + if (name_str == "Private") { + tabs.back().filename = "stash_HC.txt"; + tabs.back().is_private = true; + tabs.back().is_legacy = true; + } + else if (name_str == "Shared") { + tabs.back().filename = "stash.txt"; + tabs.back().is_private = false; + tabs.back().is_legacy = true; + } + else { + // generate a filename + std::stringstream ss; + ss << std::hex << "stash_" << Utils::hashString(name_str) << ".txt"; + tabs.back().filename = ss.str(); + } + } + else if (infile.key == "is_private") { + // @ATTR tab.is_private|bool|If true, this stash will not be shared across other saves. + tabs.back().is_private = Parse::toBool(infile.val); + } + else { + infile.error("MenuStash: '%s' is not a valid key.", infile.key.c_str()); + } } - // @ATTR stash_rows|int|The number of rows for the grid of slots. - else if (infile.key == "stash_rows") { - slots_rows = std::max(1, Parse::toInt(infile.val)); - } - // @ATTR label_title|label|Position of the "Stash" label. - else if (infile.key == "label_title") { - label_title.setFromLabelInfo(Parse::popLabelInfo(infile.val)); - } - // @ATTR currency|label|Position of the label displaying the amount of currency stored in the stash. - else if (infile.key == "currency") { - label_currency.setFromLabelInfo(Parse::popLabelInfo(infile.val)); - } - else { - infile.error("MenuStash: '%s' is not a valid key.", infile.key.c_str()); - } } infile.close(); } - label_title.setText(msg->get("Shared Stash")); + label_title.setText(msg->get("Stash")); label_title.setColor(font->getColor(FontEngine::COLOR_MENU_NORMAL)); label_currency.setColor(font->getColor(FontEngine::COLOR_MENU_NORMAL)); @@ -102,9 +167,37 @@ slots_area.w = slots_cols * eset->resolutions.icon_size; slots_area.h = slots_rows * eset->resolutions.icon_size; - stock.initGrid(stash_slots, slots_area, slots_cols); - for (int i = 0; i < stash_slots; i++) { - tablist.add(stock.slots[i]); + tablist.add(tab_control); + + // default tabs if none are defined in the config file + if (tabs.empty()) { + tabs.push_back(MenuStashTab("Private", msg->get("Private"), "stash_HC.txt", MenuStashTab::IS_PRIVATE)); + tabs.push_back(MenuStashTab("Shared", msg->get("Shared"), "stash.txt", !MenuStashTab::IS_PRIVATE)); + } + + // ensure that characters have access to at least one private stash + // this needs to be done because permadeath characters ONLY have access to private stashes + bool private_exists = false; + for (size_t i = 0; i < tabs.size(); ++i) { + if (tabs[i].is_private) { + private_exists = true; + break; + } + } + if (!private_exists) { + tabs.push_back(MenuStashTab("Private", msg->get("Private"), "stash_HC.txt", MenuStashTab::IS_PRIVATE)); + } + + for (size_t i = 0; i < tabs.size(); ++i) { + tabs[i].stock.initGrid(stash_slots, slots_area, slots_cols); + tab_control->setTabTitle(static_cast<unsigned>(i), tabs[i].name); + + // "tablist" keyboard navigation + tabs[i].tablist.setPrevTabList(&tablist); + tabs[i].tablist.lock(); + for (int j = 0; j < stash_slots; ++j) { + tabs[i].tablist.add(tabs[i].stock.slots[j]); + } } align(); @@ -113,8 +206,17 @@ void MenuStash::align() { Menu::align(); + Rect tabs_area = slots_area; + tabs_area.x += window_area.x; + tabs_area.y += window_area.y; + + tab_control->setMainArea(tabs_area.x, tabs_area.y - tab_control->getTabHeight()); + closeButton->setPos(window_area.x, window_area.y); - stock.setPos(window_area.x, window_area.y); + + for (size_t i = 0; i < tabs.size(); ++i) { + tabs[i].stock.setPos(window_area.x, window_area.y); + } label_title.setPos(window_area.x, window_area.y); label_currency.setPos(window_area.x, window_area.y); @@ -124,6 +226,34 @@ if (!visible) return; tablist.logic(); + for (size_t i = 0; i < tabs.size(); ++i) { + tabs[i].tablist.logic(); + } + + // disable tab control if we're dragging something from one of the stash stocks + bool dragging = false; + for (size_t i = 0; i < tabs.size(); ++i) { + if (tabs[i].stock.drag_prev_slot != -1) { + dragging = true; + break; + } + } + if (!dragging) + tab_control->logic(); + + if (settings->touchscreen && activetab != static_cast<size_t>(tab_control->getActiveTab())) { + for (size_t i = 0; i < tabs.size(); ++i) { + tabs[i].tablist.defocus(); + } + } + activetab = tab_control->getActiveTab(); + + tablist.setNextTabList(&(tabs[activetab].tablist)); + + if (settings->touchscreen) { + if (tabs[activetab].tablist.getCurrent() == -1) + tabs[activetab].stock.current_slot = NULL; + } if (closeButton->checkClick()) { visible = false; @@ -143,13 +273,14 @@ // text overlay label_title.render(); if (!label_currency.isHidden()) { - label_currency.setText(msg->get("%d %s", stock.count(eset->misc.currency_id), eset->loot.currency)); + label_currency.setText(msg->get("%d %s", tabs[activetab].stock.count(eset->misc.currency_id), eset->loot.currency)); label_currency.render(); } + tab_control->render(); // show stock - stock.render(); + tabs[activetab].stock.render(); } /** @@ -166,27 +297,27 @@ items->playSound(stack.item); - slot = stock.slotOver(position); - drag_prev_slot = stock.drag_prev_slot; + slot = tabs[activetab].stock.slotOver(position); + drag_prev_slot = tabs[activetab].stock.drag_prev_slot; if (slot == -1) { success = add(stack, slot, !ADD_PLAY_SOUND); } else if (drag_prev_slot != -1) { - if (stock[slot].item == stack.item || stock[slot].empty()) { + if (tabs[activetab].stock[slot].item == stack.item || tabs[activetab].stock[slot].empty()) { // Drop the stack, merging if needed success = add(stack, slot, !ADD_PLAY_SOUND); } - else if (drag_prev_slot != -1 && stock[drag_prev_slot].empty()) { + else if (drag_prev_slot != -1 && tabs[activetab].stock[drag_prev_slot].empty()) { // Check if the previous slot is free (could still be used if SHIFT was used). // Swap the two stacks - itemReturn(stock[slot]); - stock[slot] = stack; - updated = true; + itemReturn(tabs[activetab].stock[slot]); + tabs[activetab].stock[slot] = stack; + tabs[activetab].updated = true; } else { itemReturn(stack); - updated = true; + tabs[activetab].updated = true; } } else { @@ -205,23 +336,33 @@ items->playSound(stack.item); } - if (items->items[stack.item].quest_item) { - pc->logMsg(msg->get("Can not store quest items in the stash."), Avatar::MSG_NORMAL); + if (items->items[stack.item].no_stash == Item::NO_STASH_ALL) { + pc->logMsg(msg->get("This item can not be stored in the stash."), Avatar::MSG_NORMAL); drop_stack.push(stack); return false; } - - ItemStack leftover = stock.add(stack, slot); + else if (tabs[activetab].is_private && items->items[stack.item].no_stash == Item::NO_STASH_PRIVATE) { + pc->logMsg(msg->get("This item can not be stored in the private stash."), Avatar::MSG_NORMAL); + drop_stack.push(stack); + return false; + } + else if (!tabs[activetab].is_private && items->items[stack.item].no_stash == Item::NO_STASH_SHARED) { + pc->logMsg(msg->get("This item can not be stored in the shared stash."), Avatar::MSG_NORMAL); + drop_stack.push(stack); + return false; + } + + ItemStack leftover = tabs[activetab].stock.add(stack, slot); if (!leftover.empty()) { if (leftover.quantity != stack.quantity) { - updated = true; + tabs[activetab].updated = true; } pc->logMsg(msg->get("Stash is full."), Avatar::MSG_NORMAL); drop_stack.push(leftover); return false; } else { - updated = true; + tabs[activetab].updated = true; } return true; @@ -232,9 +373,9 @@ * Players can drag an item to their inventory. */ ItemStack MenuStash::click(const Point& position) { - ItemStack stack = stock.click(position); + ItemStack stack = tabs[activetab].stock.click(position); if (settings->touchscreen) { - tablist.setCurrent(stock.current_slot); + tabs[activetab].tablist.setCurrent(tabs[activetab].stock.current_slot); } return stack; } @@ -243,25 +384,122 @@ * Cancel the dragging initiated by the click() */ void MenuStash::itemReturn(ItemStack stack) { - stock.itemReturn(stack); + tabs[activetab].stock.itemReturn(stack); } void MenuStash::renderTooltips(const Point& position) { if (!visible || !Utils::isWithinRect(window_area, position)) return; - TooltipData tip_data = stock.checkTooltip(position, &pc->stats, ItemManager::PLAYER_INV); + TooltipData tip_data = tabs[activetab].stock.checkTooltip(position, &pc->stats, ItemManager::PLAYER_INV); tooltipm->push(tip_data, position, TooltipData::STYLE_FLOAT); } void MenuStash::removeFromPrevSlot(int quantity) { - int drag_prev_slot = stock.drag_prev_slot; + int drag_prev_slot = tabs[activetab].stock.drag_prev_slot; if (drag_prev_slot > -1) { - stock.subtract(drag_prev_slot, quantity); + tabs[activetab].stock.subtract(drag_prev_slot, quantity); + } +} + +void MenuStash::validate(std::queue<ItemStack>& global_drop_stack) { + for (size_t tab = 0; tab < tabs.size(); ++tab) { + for (int i = 0; i < tabs[activetab].stock.getSlotNumber(); ++i) { + if (tabs[tab].stock[i].empty()) + continue; + + ItemStack stack = tabs[tab].stock[i]; + int no_stash = items->items[stack.item].no_stash; + if (no_stash == Item::NO_STASH_ALL || (tabs[tab].is_private && no_stash == Item::NO_STASH_PRIVATE) || (!tabs[tab].is_private && no_stash == Item::NO_STASH_SHARED)) { + pc->logMsg(msg->get("Can not store item in stash: %s", items->getItemName(stack.item).c_str()), Avatar::MSG_NORMAL); + global_drop_stack.push(stack); + tabs[tab].stock[i].clear(); + tabs[tab].updated = true; + } + } + } +} + +bool MenuStash::checkUpdates() { + bool updated = false; + + for (size_t i = 0; i < tabs.size(); ++i) { + if (tabs[i].updated) { + tabs[i].updated = false; + + if (eset->misc.save_onstash == EngineSettings::Misc::SAVE_ONSTASH_ALL) + updated = true; + else if (tabs[i].is_private && eset->misc.save_onstash == EngineSettings::Misc::SAVE_ONSTASH_PRIVATE) + updated = true; + else if (!tabs[i].is_private && eset->misc.save_onstash == EngineSettings::Misc::SAVE_ONSTASH_SHARED) + updated = true; + } + } + + return updated; +} + +void MenuStash::enableSharedTab(bool permadeath) { + for (size_t i = 0; i < tabs.size(); ++i) { + tab_control->setEnabled(static_cast<unsigned>(i), (!permadeath || (permadeath && tabs[i].is_private))); + } +} + +void MenuStash::setTab(size_t tab) { + if (settings->touchscreen && activetab != tab) { + for (size_t i = 0; i < tabs.size(); ++i) { + tabs[i].tablist.defocus(); + } + } + if (tab >= tabs.size()) { + tab_control->setActiveTab(0); + activetab = 0; + } + else { + tab_control->setActiveTab(static_cast<unsigned>(tab)); + activetab = tab; + } +} + +size_t MenuStash::getTab() { + return activetab; +} + +void MenuStash::lockTabControl() { + for (size_t i = 0; i < tabs.size(); ++i) { + tabs[i].tablist.setPrevTabList(NULL); + } +} + +void MenuStash::unlockTabControl() { + for (size_t i = 0; i < tabs.size(); ++i) { + tabs[i].tablist.setPrevTabList(&tablist); + } +} + +TabList* MenuStash::getCurrentTabList() { + if (tablist.getCurrent() != -1) { + return (&tablist); + } + else { + for (size_t i = 0; i < tabs.size(); ++i) { + if (tabs[i].tablist.getCurrent() != -1) + return (&(tabs[i].tablist)); + } + } + + return NULL; +} + +void MenuStash::defocusTabLists() { + tablist.defocus(); + for (size_t i = 0; i < tabs.size(); ++i) { + tabs[i].tablist.defocus(); } } MenuStash::~MenuStash() { delete closeButton; -} - + delete tab_control; +} + diff --git a/src/MenuStash.h b/src/MenuStash.h index 2ed001d..e2f7078 100644 --- a/src/MenuStash.h +++ b/src/MenuStash.h @@ -30,12 +30,34 @@ class NPC; class StatBlock; class WidgetButton; +class WidgetTabControl; + +class MenuStashTab { +public: + static const bool IS_PRIVATE = true; + + MenuStashTab(const std::string& id, const std::string& _name, const std::string& _filename, bool _is_private); + ~MenuStashTab(); + + std::string id; + std::string name; + std::string filename; + bool is_private; + bool is_legacy; + bool updated; + + MenuItemStorage stock; + TabList tablist; +}; class MenuStash : public Menu { private: WidgetButton *closeButton; + WidgetTabControl *tab_control; WidgetLabel label_title; WidgetLabel label_currency; + + size_t activetab; public: static const int NO_SLOT = -1; @@ -52,12 +74,22 @@ bool add(ItemStack stack, int slot, bool play_sound); void renderTooltips(const Point& position); bool drop(const Point& position, ItemStack stack); + void validate(std::queue<ItemStack>& global_drop_stack); + bool checkUpdates(); void removeFromPrevSlot(int quantity); + void enableSharedTab(bool permadeath); + + void setTab(size_t tab); + size_t getTab(); + + void lockTabControl(); + void unlockTabControl(); + TabList* getCurrentTabList(); + void defocusTabLists(); Rect slots_area; - MenuItemStorage stock; - bool updated; + std::vector<MenuStashTab> tabs; std::queue<ItemStack> drop_stack; }; diff --git a/src/MenuStatBar.cpp b/src/MenuStatBar.cpp index 1db7417..5d595c8 100644 --- a/src/MenuStatBar.cpp +++ b/src/MenuStatBar.cpp @@ -29,10 +29,13 @@ #include "FontEngine.h" #include "InputState.h" #include "Menu.h" +#include "MenuExit.h" +#include "MenuManager.h" #include "MenuStatBar.h" #include "ModManager.h" #include "RenderDevice.h" #include "Settings.h" +#include "SharedGameResources.h" #include "SharedResources.h" #include "StatBlock.h" #include "WidgetLabel.h" @@ -40,24 +43,34 @@ #include "UtilsParsing.h" #include "UtilsFileSystem.h" -MenuStatBar::MenuStatBar(const std::string& type) +MenuStatBar::MenuStatBar(short _type) : bar(NULL) + , label(new WidgetLabel()) , stat_min(0) , stat_cur(0) + , stat_cur_prev(0) , stat_max(0) , orientation(HORIZONTAL) , custom_text_pos(false) // label will be placed in the middle of the bar , custom_string("") , bar_gfx("") , bar_gfx_background("") + , type(_type) + , bar_fill_offset() + , bar_fill_size(-1, -1) { - - label = new WidgetLabel(); + std::string type_filename; + if (type == TYPE_HP) + type_filename = "hp"; + else if (type == TYPE_MP) + type_filename = "mp"; + else if (type == TYPE_XP) + type_filename = "xp"; // Load config settings FileParser infile; // @CLASS MenuStatBar|Description of menus/hp.txt, menus/mp.txt, menus/xp.txt - if(infile.open("menus/"+type+".txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { + if(!type_filename.empty() && infile.open("menus/" + type_filename + ".txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { while(infile.next()) { if (parseMenuKey(infile.key, infile.val)) continue; @@ -83,11 +96,29 @@ else if (infile.key == "bar_gfx_background") { bar_gfx_background = infile.val; } + // @ATTR hide_timeout|duration|Hide HP and MP bar if full mana or health, after given amount of seconds; Hide XP bar if no changes in XP points for given amount of seconds. 0 disable hiding. + else if (infile.key == "hide_timeout") { + timeout.setDuration(Parse::toDuration(infile.val)); + } + // @ATTR bar_fill_offset|point|Offset of the bar's fill graphics relative to the bar_pos X/Y. + else if (infile.key == "bar_fill_offset") { + bar_fill_offset = Parse::toPoint(infile.val); + } + // @ATTR bar_fill_size|int, int : Width, Height|Size of the bar's fill graphics. If not defined, the width/height of bar_pos is used. + else if (infile.key == "bar_fill_size") { + bar_fill_size = Parse::toPoint(infile.val); + } else { infile.error("MenuStatBar: '%s' is not a valid key.", infile.key.c_str()); } } infile.close(); + } + + // default to bar_pos size if bar_fill_size is undefined + if (bar_fill_size.x == -1 || bar_fill_size.y == -1) { + bar_fill_size.x = bar_pos.w; + bar_fill_size.y = bar_pos.h; } loadGraphics(); @@ -112,6 +143,7 @@ } void MenuStatBar::update(unsigned long _stat_min, unsigned long _stat_cur, unsigned long _stat_max) { + stat_cur_prev = stat_cur; // save previous value stat_min = _stat_min; stat_cur = _stat_cur; stat_max = _stat_max; @@ -121,7 +153,31 @@ custom_string = _custom_string; } +bool MenuStatBar::disappear() { + if (timeout.getDuration() > 0 && settings->statbar_autohide) { + if (type == TYPE_HP || type == TYPE_MP) { + // HP and MP bars disappear when full + if (stat_cur != stat_max) { + timeout.reset(Timer::BEGIN); + } + } else if (type == TYPE_XP) { + // XP bar disappears when value is not changing + if (stat_cur_prev != stat_cur) { + timeout.reset(Timer::BEGIN); + } + } + + timeout.tick(); + if (timeout.isEnd()) + return true; + } + return false; +} + void MenuStatBar::render() { + + if (disappear()) return; + Rect src; Rect dest; @@ -147,22 +203,26 @@ // draw bar progress based on orientation if (orientation == HORIZONTAL) { - unsigned long bar_length = (normalized_max == 0) ? 0 : (normalized_cur * static_cast<unsigned long>(bar_pos.w)) / normalized_max; + unsigned long bar_length = (normalized_max == 0) ? 0 : (normalized_cur * static_cast<unsigned long>(bar_fill_size.x)) / normalized_max; + if (bar_length == 0 && normalized_cur > 0) + bar_length = 1; src.x = 0; src.y = 0; src.w = static_cast<int>(bar_length); - src.h = bar_pos.h; - dest.x = bar_dest.x; - dest.y = bar_dest.y; + src.h = bar_fill_size.y; + dest.x = bar_dest.x + bar_fill_offset.x; + dest.y = bar_dest.y + bar_fill_offset.y; } else if (orientation == VERTICAL) { - unsigned long bar_length = (normalized_max == 0) ? 0 : (normalized_cur * static_cast<unsigned long>(bar_pos.h)) / normalized_max; + unsigned long bar_length = (normalized_max == 0) ? 0 : (normalized_cur * static_cast<unsigned long>(bar_fill_size.y)) / normalized_max; + if (bar_length == 0 && normalized_cur > 0) + bar_length = 1; src.x = 0; - src.y = bar_pos.h-static_cast<int>(bar_length); - src.w = bar_pos.w; + src.y = bar_fill_size.y-static_cast<int>(bar_length); + src.w = bar_fill_size.x; src.h = static_cast<int>(bar_length); - dest.x = bar_dest.x; - dest.y = bar_dest.y+src.y; + dest.x = bar_dest.x + bar_fill_offset.x; + dest.y = bar_dest.y + bar_fill_offset.y + src.y; } if (bar) { @@ -174,7 +234,7 @@ // if mouseover, draw text if (!text_pos.hidden) { - if (settings->statbar_labels || (inpt->usingMouse() && Utils::isWithinRect(bar_dest, inpt->mouse))) { + if (settings->statbar_labels || (inpt->usingMouse() && Utils::isWithinRect(bar_dest, inpt->mouse) && !menu->exit->visible)) { std::stringstream ss; if (!custom_string.empty()) ss << custom_string; diff --git a/src/MenuStatBar.h b/src/MenuStatBar.h index d3c9ae4..5e0797e 100644 --- a/src/MenuStatBar.h +++ b/src/MenuStatBar.h @@ -34,6 +34,8 @@ class MenuStatBar : public Menu { private: + bool disappear(); + enum { HORIZONTAL = 0, VERTICAL = 1 @@ -43,6 +45,7 @@ WidgetLabel *label; unsigned long stat_min; unsigned long stat_cur; + unsigned long stat_cur_prev; unsigned long stat_max; Rect bar_pos; LabelInfo text_pos; @@ -51,9 +54,20 @@ std::string custom_string; std::string bar_gfx; std::string bar_gfx_background; + short type; + Timer timeout; + Point bar_fill_offset; + Point bar_fill_size; + public: - explicit MenuStatBar(const std::string& type); + enum { + TYPE_HP = 0, + TYPE_MP = 1, + TYPE_XP = 2 + }; + + explicit MenuStatBar(short _type); ~MenuStatBar(); void loadGraphics(); void update(unsigned long _stat_min, unsigned long _stat_cur, unsigned long _stat_max); diff --git a/src/MenuTalker.cpp b/src/MenuTalker.cpp index 60f4b1e..b2d6300 100644 --- a/src/MenuTalker.cpp +++ b/src/MenuTalker.cpp @@ -24,6 +24,7 @@ */ #include "Avatar.h" +#include "Entity.h" #include "FileParser.h" #include "FontEngine.h" #include "InputState.h" @@ -443,8 +444,9 @@ // add standard topics for (size_t i = nodes.size(); i > 0; i--) { std::string topic = npc->getDialogTopic(nodes[i-1]); - if (topic.empty()) - continue; + if (topic.empty()) { + topic = msg->get("<dialog node %d>", nodes[i-1]); + } addAction(topic, nodes[i-1], !Action::IS_VENDOR); } @@ -474,6 +476,9 @@ int node_id = actions[index].node_id; if (actions[index].is_vendor) { + // defocus the talker menu tablist. Otherwise, CANCEL needs to be pressed twice to exit the vendor screen + defocusTabLists(); + // begin trading NPC *temp_npc = npc; menu->closeAll(); @@ -522,11 +527,7 @@ void MenuTalker::setupTabList() { tablist.clear(); - if (dialog_node == -1) { - for (size_t i = 0; i < actions.size(); ++i) { - tablist.add(actions[i].btn); - } - } + tablist.add(textbox); if (advanceButton->enabled) { tablist.add(advanceButton); diff --git a/src/MenuVendor.cpp b/src/MenuVendor.cpp index 71c1f2a..e363f44 100644 --- a/src/MenuVendor.cpp +++ b/src/MenuVendor.cpp @@ -23,6 +23,7 @@ */ #include "Avatar.h" +#include "Entity.h" #include "EngineSettings.h" #include "FileParser.h" #include "FontEngine.h" @@ -36,6 +37,7 @@ #include "SharedGameResources.h" #include "SharedResources.h" #include "SoundManager.h" +#include "TooltipManager.h" #include "UtilsParsing.h" #include "WidgetButton.h" #include "WidgetSlot.h" @@ -144,7 +146,9 @@ tablist_buy.logic(); tablist_sell.logic(); - tabControl->logic(); + if (stock[ItemManager::VENDOR_BUY].drag_prev_slot == -1 && stock[ItemManager::VENDOR_SELL].drag_prev_slot == -1) + tabControl->logic(); + if (settings->touchscreen && activetab != tabControl->getActiveTab()) { tablist_buy.defocus(); tablist_sell.defocus(); @@ -241,7 +245,7 @@ int vendor_view = (activetab == ItemManager::VENDOR_BUY) ? ItemManager::VENDOR_BUY : ItemManager::VENDOR_SELL; TooltipData tip_data = stock[activetab].checkTooltip(position, &pc->stats, vendor_view); - tip->render(tip_data, position, TooltipData::STYLE_FLOAT); + tooltipm->push(tip_data, position, TooltipData::STYLE_FLOAT); } /** diff --git a/src/ModManager.cpp b/src/ModManager.cpp index 28ae3a6..d7d51df 100644 --- a/src/ModManager.cpp +++ b/src/ModManager.cpp @@ -134,16 +134,15 @@ loadModList(); applyDepends(); - std::stringstream ss; - ss << "Active mods: "; + std::string active_mods_str = "Active mods: "; for (size_t i = 0; i < mod_list.size(); ++i) { - ss << mod_list[i].name; + active_mods_str += mod_list[i].name; if (*mod_list[i].version != VersionInfo::MIN) - ss << " (" << mod_list[i].version->getString() << ")"; + active_mods_str += " (" + mod_list[i].version->getString() + ")"; if (i < mod_list.size()-1) - ss << ", "; - } - Utils::logInfo(ss.str().c_str()); + active_mods_str += ", "; + } + Utils::logInfo(active_mods_str.c_str()); } /** @@ -172,8 +171,8 @@ std::string line; std::string starts_with; - std::string place1 = settings->path_conf + "mods.txt"; - std::string place2 = settings->path_data + "mods/mods.txt"; + std::string place1 = Filesystem::convertSlashes(settings->path_conf + "mods.txt"); + std::string place2 = Filesystem::convertSlashes(settings->path_data + "mods/mods.txt"); infile.open(place1.c_str(), std::ios::in); @@ -239,7 +238,9 @@ * Find the location (mod file name) for this data file. * Use private loc_cache to prevent excessive disk I/O */ -std::string ModManager::locate(const std::string& filename) { +std::string ModManager::locate(const std::string& _filename) { + std::string filename = Filesystem::convertSlashes(_filename); + // if we have this location already cached, return it if (loc_cache.find(filename) != loc_cache.end()) { return loc_cache[filename]; @@ -250,7 +251,7 @@ for (size_t i = mod_list.size(); i > 0; i--) { for (size_t j = 0; j < mod_paths.size(); j++) { - test_path = mod_paths[j] + "mods/" + mod_list[i-1].name + "/" + filename; + test_path = Filesystem::convertSlashes(mod_paths[j] + "mods/" + mod_list[i-1].name + "/" + filename); if (Filesystem::fileExists(test_path)) { loc_cache[filename] = test_path; return test_path; @@ -259,7 +260,7 @@ } // all else failing, simply return the filename if it exists - test_path = settings->path_data + filename; + test_path = Filesystem::convertSlashes(settings->path_data + filename); if (!Filesystem::fileExists(test_path)) test_path = ""; @@ -283,7 +284,7 @@ for (size_t i = 0; i < mod_list.size(); ++i) { for (size_t j = mod_paths.size(); j > 0; j--) { - test_path = mod_paths[j-1] + "mods/" + mod_list[i].name + "/" + path; + test_path = Filesystem::convertSlashes(mod_paths[j-1] + "mods/" + mod_list[i].name + "/" + path); amendPathToVector(test_path, ret); } } @@ -334,7 +335,7 @@ // @CLASS ModManager|Description of mod settings.txt for (unsigned i=0; i<mod_paths.size(); ++i) { - std::string path = mod_paths[i] + "mods/" + name + "/settings.txt"; + std::string path = Filesystem::convertSlashes(mod_paths[i] + "mods/" + name + "/settings.txt"); infile.open(path.c_str(), std::ios::in); while (infile.good()) { @@ -527,7 +528,7 @@ void ModManager::saveMods() { std::ofstream outfile; - outfile.open((settings->path_conf + "mods.txt").c_str(), std::ios::out); + outfile.open((Filesystem::convertSlashes(settings->path_conf + "mods.txt")).c_str(), std::ios::out); if (outfile.is_open()) { // comment @@ -542,7 +543,7 @@ } } if (outfile.bad()) - Utils::logError("GameStateConfigBase: Unable to save mod list into file. No write access or disk is full!"); + Utils::logError("GameStateConfig: Unable to save mod list into file. No write access or disk is full!"); outfile.close(); outfile.clear(); diff --git a/src/ModManager.h b/src/ModManager.h index 0f9c1dc..09ac4b2 100644 --- a/src/ModManager.h +++ b/src/ModManager.h @@ -79,7 +79,7 @@ // Returns the filename within the latest mod, in which the provided generic // filename was found. - std::string locate(const std::string& filename); + std::string locate(const std::string& _filename); // Returns a list of filenames, going through all mods, in which the provided // generic filename is found. diff --git a/src/NPC.cpp b/src/NPC.cpp index 2790010..97f8de8 100644 --- a/src/NPC.cpp +++ b/src/NPC.cpp @@ -26,11 +26,14 @@ #include "AnimationManager.h" #include "AnimationSet.h" #include "CampaignManager.h" +#include "EntityBehavior.h" #include "EventManager.h" #include "FileParser.h" #include "ItemManager.h" #include "LootManager.h" +#include "MapRenderer.h" #include "MessageEngine.h" +#include "ModManager.h" #include "NPC.h" #include "RenderDevice.h" #include "SharedGameResources.h" @@ -39,16 +42,22 @@ #include "UtilsMath.h" #include "UtilsParsing.h" -NPC::NPC() - : Entity() +NPC::NPC(const Entity& e) + : Entity(e) , gfx("") + , vox_intro() + , vox_quests() , name("") , direction(0) + , show_on_minimap(true) , npc_portrait(NULL) , hero_portrait(NULL) , talker(false) , vendor(false) - , reset_buyback(true) { + , reset_buyback(true) + , stock() + , dialog() +{ stock.init(VENDOR_MAX_STOCK); } @@ -69,7 +78,11 @@ bool clear_random_table = true; while (infile.next()) { - if (infile.section == "dialog") { + if (infile.section == "stats") { + // handled by StatBlock::load() + continue; + } + else if (infile.section == "dialog") { if (infile.new_section) { dialog.push_back(std::vector<EventComponent>()); } @@ -124,6 +137,11 @@ e.s = infile.val; portrait_filenames.push_back(e.s); } + else if (infile.key == "take_a_party") { + // @ATTR dialog.take_a_party|bool|Start/stop taking a party with player. + e.type = EventComponent::NPC_TAKE_A_PARTY; + e.x = Parse::toBool(infile.val); + } else if (infile.key == "response") { // @ATTR dialog.response|repeatable(string)|A dialog ID to present as a selectable response. This key must precede the dialog text line. e.type = EventComponent::NPC_DIALOG_RESPONSE; @@ -149,7 +167,7 @@ dialog.back().push_back(e); } } - else { + else if (infile.section.empty() || infile.section == "npc") { filename = npc_id; if (infile.new_section) { @@ -162,12 +180,16 @@ name = msg->get(infile.val); } else if (infile.key == "gfx") { - // @ATTR gfx|filename|Filename of an animation definition. - gfx = infile.val; + // TODO deprecate this! + // Currently handled in StatBlock::isNPCStat() } else if (infile.key == "direction") { // @ATTR direction|direction|The direction to use for this NPC's stance animation. direction = Parse::toDirection(infile.val); + } + else if (infile.key == "show_on_minimap") { + // @ATTR show_on_minimap|bool|If true, this NPC will be shown on the minimap. The default is true. + show_on_minimap = Parse::toBool(infile.val); } // handle talkers @@ -200,12 +222,7 @@ else if (infile.key == "constant_stock") { // @ATTR constant_stock|repeatable(list(item_id))|A list of items this vendor has for sale. Quantity can be specified by appending ":Q" to the item_id, where Q is an integer. while (infile.val != "") { - std::string temp = Parse::popFirstString(infile.val); - temp += ':'; - stack.item = Parse::popFirstInt(temp, ':'); - stack.quantity = Parse::popFirstInt(temp, ':'); - if (stack.quantity == 0) - stack.quantity = 1; + stack = Parse::toItemQuantityPair(Parse::popFirstString(infile.val)); stock.add(stack, ItemStorage::NO_SLOT); } } @@ -213,12 +230,7 @@ // @ATTR status_stock|repeatable(string, list(item_id)) : Required status, Item(s)|A list of items this vendor will have for sale if the required status is met. Quantity can be specified by appending ":Q" to the item_id, where Q is an integer. if (camp->checkStatus(camp->registerStatus(Parse::popFirstString(infile.val)))) { while (infile.val != "") { - std::string temp = Parse::popFirstString(infile.val); - temp += ':'; - stack.item = Parse::popFirstInt(temp, ':'); - stack.quantity = Parse::popFirstInt(temp, ':'); - if (stack.quantity == 0) - stack.quantity = 1; + stack = Parse::toItemQuantityPair(Parse::popFirstString(infile.val)); stock.add(stack, ItemStorage::NO_SLOT); } } @@ -256,6 +268,7 @@ } infile.close(); } + loadGraphics(); // fill inventory with items from random stock table @@ -269,13 +282,22 @@ for (size_t i=0; i<rand_itemstacks.size(); ++i) { stock.add(rand_itemstacks[i], ItemStorage::NO_SLOT); } + + // warn if dialog nodes lack a topic + std::string full_filename = mods->locate(npc_id); + for (size_t i=0; i<dialog.size(); ++i) { + std::string topic = getDialogTopic(static_cast<int>(i)); + if (topic.empty()) { + Utils::logInfo("[%s] NPC: Dialog node %d does not have a topic.", full_filename.c_str(), i); + } + } } void NPC::loadGraphics() { - if (gfx != "") { - anim->increaseCount(gfx); - animationSet = anim->getAnimationSet(gfx); + if (stats.animations != "") { + anim->increaseCount(stats.animations); + animationSet = anim->getAnimationSet(stats.animations); activeAnimation = animationSet->getAnimation(""); } @@ -319,8 +341,13 @@ } void NPC::logic() { - if (activeAnimation) - activeAnimation->advanceFrame(); + mapr->collider.unblock(stats.pos.x, stats.pos.y); + + Entity::logic(); + moveMapEvents(); + + if (!stats.hero_ally) + mapr->collider.block(stats.pos.x, stats.pos.y, true); } bool NPC::playSoundIntro() { @@ -476,6 +503,36 @@ return true; } +void NPC::moveMapEvents() { + + // Update event position after NPC has moved + for (size_t i = 0; i < mapr->events.size(); i++) + { + if (mapr->events[i].type == filename) + { + mapr->events[i].location.x = static_cast<int>(stats.pos.x); + mapr->events[i].location.y = static_cast<int>(stats.pos.y); + + mapr->events[i].hotspot.x = static_cast<int>(stats.pos.x); + mapr->events[i].hotspot.y = static_cast<int>(stats.pos.y); + + mapr->events[i].center.x = + static_cast<float>(stats.pos.x) + static_cast<float>(mapr->events[i].hotspot.w)/2; + mapr->events[i].center.y = + static_cast<float>(stats.pos.y) + static_cast<float>(mapr->events[i].hotspot.h)/2; + + for (size_t ci = 0; ci < mapr->events[i].components.size(); ci++) + { + if (mapr->events[i].components[ci].type == EventComponent::NPC_HOTSPOT) + { + mapr->events[i].components[ci].x = static_cast<int>(stats.pos.x); + mapr->events[i].components[ci].y = static_cast<int>(stats.pos.y); + } + } + } + } +} + bool NPC::checkVendor() { if (!vendor) return false; @@ -574,6 +631,9 @@ } } } + else if (dialog[dialog_node][event_cursor].type == EventComponent::NPC_TAKE_A_PARTY) { + stats.hero_ally = dialog[dialog_node][event_cursor].x == 0 ? false : true; + } else if (dialog[dialog_node][event_cursor].type == EventComponent::NONE) { // conversation ends return false; @@ -602,17 +662,6 @@ EventManager::executeEvent(ev); } -Renderable NPC::getRender() { - Renderable r; - if (activeAnimation) { - r = activeAnimation->getCurrentFrame(direction); - } - r.map_pos.x = pos.x; - r.map_pos.y = pos.y; - - return r; -} - bool NPC::isDialogType(const int &event_type) { return event_type == EventComponent::NPC_DIALOG_THEM || event_type == EventComponent::NPC_DIALOG_YOU; } @@ -623,8 +672,8 @@ delete portraits[i]; } - if (gfx != "") { - anim->decreaseCount(gfx); + if (stats.animations != "") { + anim->decreaseCount(stats.animations); } while (!vox_intro.empty()) { diff --git a/src/NPC.h b/src/NPC.h index 97f1f3d..e6182f8 100644 --- a/src/NPC.h +++ b/src/NPC.h @@ -24,10 +24,8 @@ #ifndef NPC_H #define NPC_H -#include "CommonIncludes.h" #include "Entity.h" #include "ItemStorage.h" -#include "Utils.h" class EventComponent; @@ -61,7 +59,7 @@ static const int VENDOR_MAX_STOCK = 80; static const bool GET_RESPONSE_NODES = true; - NPC(); + NPC(const Entity& e); ~NPC(); void load(const std::string& npc_id); void logic(); @@ -70,17 +68,17 @@ void getDialogResponses(std::vector<int>& result, size_t node_id, size_t event_cursor); std::string getDialogTopic(unsigned int dialog_node); bool checkMovement(unsigned int dialog_node); + void moveMapEvents(); bool checkVendor(); bool processDialog(unsigned int dialog_node, unsigned int& event_cursor); void processEvent(unsigned int dialog_node, unsigned int cursor); - virtual Renderable getRender(); // general info std::string name; std::string filename; - FPoint pos; // map position int direction; + bool show_on_minimap; // talker info Sprite* npc_portrait; diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index bcbcfdf..35bc83e 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -25,7 +25,10 @@ */ #include "Animation.h" +#include "Avatar.h" #include "CampaignManager.h" +#include "EntityManager.h" +#include "EngineSettings.h" #include "EventManager.h" #include "ItemManager.h" #include "MapRenderer.h" @@ -54,9 +57,17 @@ Map_NPC mn; ItemStack item_roll; + std::map<std::string, NPC *> allies; + // remove existing NPCs - for (unsigned i=0; i<npcs.size(); i++) - delete(npcs[i]); + for (unsigned i=0; i<npcs.size(); i++) { + if (npcs[i]->stats.hero_ally) { + allies[npcs[i]->filename] = npcs[i]; + } + else { + delete(npcs[i]); + } + } npcs.clear(); @@ -78,55 +89,84 @@ if(!status_reqs_met) continue; - NPC *npc = new NPC(); + // ally npc that was moved from another map should not be loaded once again + if (allies.find(mn.id) != allies.end()) { + continue; + } + + NPC *npc = new NPC(*entitym->getEntityPrototype(mn.id)); + npc->load(mn.id); - npc->pos.x = mn.pos.x; - npc->pos.y = mn.pos.y; + + npc->stats.pos.x = mn.pos.x; + npc->stats.pos.y = mn.pos.y; + npc->stats.hero_ally = false; // npc->stock.sort(); npcs.push_back(npc); - - mapr->collider.block(npc->pos.x, npc->pos.y, !MapCollision::IS_ALLY); - - // create a map event for this npc - Event ev; - EventComponent ec; - - // the event hotspot is a 1x1 tile at the npc's feet - ev.activate_type = Event::ACTIVATE_ON_TRIGGER; - ev.keep_after_trigger = true; - Rect location; - location.x = static_cast<int>(npc->pos.x); - location.y = static_cast<int>(npc->pos.y); - location.w = location.h = 1; - ev.location = ev.hotspot = location; - ev.center.x = static_cast<float>(ev.hotspot.x) + static_cast<float>(ev.hotspot.w)/2; - ev.center.y = static_cast<float>(ev.hotspot.y) + static_cast<float>(ev.hotspot.h)/2; - - ec.type = EventComponent::NPC_ID; - ec.x = static_cast<int>(npcs.size())-1; - ev.components.push_back(ec); - - ec.type = EventComponent::TOOLTIP; - ec.s = npc->name; - ev.components.push_back(ec); - - // The hitbox for hovering/clicking on an npc is based on their first frame of animation - // This might cause some undesired behavior for npcs that have packed animations and a lot of variation - // However, it is sufficient for all of our current game data (fantasycore, no-name mod, polymorphable) - Renderable ren = npc->activeAnimation->getCurrentFrame(npc->direction); + createMapEvent(*npc, npcs.size()); + } + + FPoint spawn_pos = mapr->collider.getRandomNeighbor(Point(pc->stats.pos), 1, !MapCollision::IGNORE_BLOCKED); + while (!allies.empty()) { + NPC *npc = allies.begin()->second; + allies.erase(allies.begin()); + + npc->stats.pos = spawn_pos; + npc->stats.direction = pc->stats.direction; + + npcs.push_back(npc); + createMapEvent(*npc, npcs.size()); + + mapr->collider.block(npc->stats.pos.x, npc->stats.pos.y, !MapCollision::IS_ALLY); + } + +} + +void NPCManager::createMapEvent(const NPC& npc, size_t _npcs) { + // create a map event for provided npc + Event ev; + EventComponent ec; + + // the event hotspot is a 1x1 tile at the npc's feet + ev.activate_type = Event::ACTIVATE_ON_INTERACT; + ev.keep_after_trigger = true; + Rect location; + location.x = static_cast<int>(npc.stats.pos.x); + location.y = static_cast<int>(npc.stats.pos.y); + location.w = location.h = 1; + ev.location = ev.hotspot = location; + ev.center.x = static_cast<float>(ev.hotspot.x) + static_cast<float>(ev.hotspot.w)/2; + ev.center.y = static_cast<float>(ev.hotspot.y) + static_cast<float>(ev.hotspot.h)/2; + + ec.type = EventComponent::NPC_ID; + ec.x = static_cast<int>(_npcs)-1; + ev.components.push_back(ec); + + ec.type = EventComponent::TOOLTIP; + ec.s = npc.name; + ev.components.push_back(ec); + + // The hitbox for hovering/clicking on an npc is based on their first frame of animation + // This might cause some undesired behavior for npcs that have packed animations and a lot of variation + // However, it is sufficient for all of our current game data (fantasycore, no-name mod, polymorphable) + if (npc.activeAnimation) { + Renderable ren = npc.activeAnimation->getCurrentFrame(npc.direction); ec.type = EventComponent::NPC_HOTSPOT; - ec.x = static_cast<int>(npc->pos.x); - ec.y = static_cast<int>(npc->pos.y); + ec.x = static_cast<int>(npc.stats.pos.x); + ec.y = static_cast<int>(npc.stats.pos.y); ec.z = ren.offset.x; ec.a = ren.offset.y; ec.b = ren.src.w; ec.c = ren.src.h; ev.components.push_back(ec); - - mapr->events.push_back(ev); - } - + ev.type = npc.filename; + } + else { + Utils::logError("NPCManager: Unable to set click hotspot for '%s' due to lack of animation.", npc.filename.c_str()); + } + + mapr->events.push_back(ev); } void NPCManager::logic() { @@ -141,7 +181,7 @@ } // could not find NPC, try loading it here - NPC *n = new NPC(); + NPC *n = new NPC(*entitym->getEntityPrototype(npcName)); if (n) { n->load(npcName); npcs.push_back(n); @@ -151,6 +191,60 @@ return -1; } +Entity* NPCManager::npcFocus(const Point& mouse, const FPoint& cam, bool alive_only) { + Point p; + Rect r; + for(unsigned int i = 0; i < npcs.size(); i++) { + if(alive_only && (npcs[i]->stats.cur_state == StatBlock::ENTITY_DEAD || npcs[i]->stats.cur_state == StatBlock::ENTITY_CRITDEAD)) { + continue; + } + if (!npcs[i]->stats.hero_ally) { + continue; + } + + p = Utils::mapToScreen(npcs[i]->stats.pos.x, npcs[i]->stats.pos.y, cam.x, cam.y); + + Renderable ren = npcs[i]->getRender(); + r.w = ren.src.w; + r.h = ren.src.h; + r.x = p.x - ren.offset.x; + r.y = p.y - ren.offset.y; + + if (Utils::isWithinRect(r, mouse)) { + return npcs[i]; + } + } + return NULL; +} + +Entity* NPCManager::getNearestNPC(const FPoint& pos, bool get_corpse) { + Entity* nearest = NULL; + float best_distance = std::numeric_limits<float>::max(); + + for (unsigned i=0; i<npcs.size(); i++) { + if(!get_corpse && (npcs[i]->stats.cur_state == StatBlock::ENTITY_DEAD || npcs[i]->stats.cur_state == StatBlock::ENTITY_CRITDEAD)) { + continue; + } + if (get_corpse && !npcs[i]->stats.corpse) { + continue; + } + if (!npcs[i]->stats.hero_ally) { + continue; + } + + float distance = Utils::calcDist(pos, npcs[i]->stats.pos); + if (distance < best_distance) { + best_distance = distance; + nearest = npcs[i]; + } + } + + if (best_distance > eset->misc.interact_range) + nearest = NULL; + + return nearest; +} + NPCManager::~NPCManager() { for (unsigned i=0; i<npcs.size(); i++) { delete npcs[i]; diff --git a/src/NPCManager.h b/src/NPCManager.h index 45fbad7..223eb06 100644 --- a/src/NPCManager.h +++ b/src/NPCManager.h @@ -32,6 +32,7 @@ class StatBlock; class NPC; class WidgetTooltip; +class Entity; class NPCManager { private: @@ -45,9 +46,12 @@ std::vector<NPC*> npcs; void handleNewMap(); + void createMapEvent(const NPC& npc, size_t _npcs); void logic(); void addRenders(std::vector<Renderable> &r); int getID(const std::string& npcName); + Entity* npcFocus(const Point& mouse, const FPoint& cam, bool alive_only); + Entity* getNearestNPC(const FPoint& pos, bool get_corpse = false); }; #endif diff --git a/src/Platform.h b/src/Platform.h index e815148..6e0b803 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -28,6 +28,77 @@ CONFIG_MENU_TYPE_DESKTOP_NO_VIDEO = 2 }; + class Video { + public: + static const int COUNT = 9; + enum { + RENDERER, + FULLSCREEN, + HWSURFACE, + VSYNC, + TEXTURE_FILTER, + DPI_SCALING, + PARALLAX_LAYERS, + ENABLE_GAMMA, + GAMMA + }; + }; + + class Audio { + public: + static const int COUNT = 2; + enum { + SFX, + MUSIC + }; + }; + + class Interface { + public: + static const int COUNT = 16; + enum { + LANGUAGE, + SUBTITLES, + COLORBLIND, + MINIMAP_MODE, + LOOT_TOOLTIPS, + AUTO_EQUIP, + ITEM_COMPARE_TIPS, + LOW_HP_WARNING_TYPE, + LOW_HP_THRESHOLD, + COMBAT_TEXT, + STATBAR_LABELS, + STATBAR_AUTOHIDE, + HARDWARE_CURSOR, + ENTITY_MARKERS, + SHOW_FPS, + DEV_MODE + }; + }; + + class Input { + public: + static const int COUNT = 7; + enum { + MOUSE_MOVE, + MOUSE_MOVE_SWAP, + MOUSE_MOVE_ATTACK, + MOUSE_AIM, + NO_MOUSE, + JOYSTICK, + JOYSTICK_DEADZONE + }; + }; + + class Misc { + public: + static const int COUNT = 2; + enum { + KEYBINDS, + MODS + }; + }; + Platform(); ~Platform(); @@ -48,6 +119,12 @@ bool has_lock_file; unsigned char config_menu_type; std::string default_renderer; + + std::vector<bool> config_video; + std::vector<bool> config_audio; + std::vector<bool> config_interface; + std::vector<bool> config_input; + std::vector<bool> config_misc; }; extern Platform platform; diff --git a/src/PlatformAndroid.cpp b/src/PlatformAndroid.cpp index 5cc014c..1611d08 100644 --- a/src/PlatformAndroid.cpp +++ b/src/PlatformAndroid.cpp @@ -78,7 +78,32 @@ , force_hardware_cursor(true) , has_lock_file(false) , config_menu_type(CONFIG_MENU_TYPE_BASE) - , default_renderer("sdl_hardware") { + , default_renderer("") + , config_video(Platform::Video::COUNT, true) + , config_audio(Platform::Audio::COUNT, true) + , config_interface(Platform::Interface::COUNT, true) + , config_input(Platform::Input::COUNT, true) + , config_misc(Platform::Misc::COUNT, true) +{ + config_video[Platform::Video::RENDERER] = true; + config_video[Platform::Video::FULLSCREEN] = false; + config_video[Platform::Video::HWSURFACE] = false; + config_video[Platform::Video::VSYNC] = false; + config_video[Platform::Video::TEXTURE_FILTER] = false; + config_video[Platform::Video::ENABLE_GAMMA] = false; + config_video[Platform::Video::GAMMA] = false; + + config_interface[Platform::Interface::HARDWARE_CURSOR] = false; + + config_input[Platform::Input::JOYSTICK] = false; + config_input[Platform::Input::MOUSE_MOVE] = false; + config_input[Platform::Input::MOUSE_AIM] = false; + config_input[Platform::Input::NO_MOUSE] = false; + config_input[Platform::Input::MOUSE_MOVE_SWAP] = false; + config_input[Platform::Input::MOUSE_MOVE_ATTACK] = false; + config_input[Platform::Input::JOYSTICK_DEADZONE] = false; + + config_misc[Platform::Misc::KEYBINDS] = false; } Platform::~Platform() { @@ -134,7 +159,7 @@ } if (settings->path_data.empty()) { - Utils::logError("Settings: Android external storage unavailable: %s", SDL_GetError()); + Utils::logError("Platform: Android external storage unavailable: %s", SDL_GetError()); } if (settings->path_user.empty() || !Filesystem::pathExists(settings->path_user)) { @@ -156,6 +181,15 @@ settings->path_conf += "/"; settings->path_user += "/"; settings->path_data += "/"; + + // create a .nomedia file to prevent game data being added to the Android media library + std::ofstream nomedia; + nomedia.open(settings->path_user + ".nomedia", std::ios::out); + if (nomedia.bad()) { + Utils::logError("Platform: Unable to create Android .nomedia file."); + } + nomedia.close(); + nomedia.clear(); } void Platform::setExitEventFilter() { diff --git a/src/PlatformEmscripten.cpp b/src/PlatformEmscripten.cpp index a0187de..70dcd2e 100644 --- a/src/PlatformEmscripten.cpp +++ b/src/PlatformEmscripten.cpp @@ -43,7 +43,26 @@ , force_hardware_cursor(false) , has_lock_file(false) , config_menu_type(CONFIG_MENU_TYPE_DESKTOP_NO_VIDEO) - , default_renderer("sdl_hardware") { + , default_renderer("sdl_hardware") + , config_video(Platform::Video::COUNT, true) + , config_audio(Platform::Audio::COUNT, true) + , config_interface(Platform::Interface::COUNT, true) + , config_input(Platform::Input::COUNT, true) + , config_misc(Platform::Misc::COUNT, true) +{ + config_video[Platform::Video::RENDERER] = false; + config_video[Platform::Video::FULLSCREEN] = false; + config_video[Platform::Video::HWSURFACE] = false; + config_video[Platform::Video::VSYNC] = false; + config_video[Platform::Video::TEXTURE_FILTER] = false; + config_video[Platform::Video::DPI_SCALING] = false; + config_video[Platform::Video::ENABLE_GAMMA] = false; + config_video[Platform::Video::GAMMA] = false; + + config_input[Platform::Input::JOYSTICK] = false; + config_input[Platform::Input::JOYSTICK_DEADZONE] = false; + + config_misc[Platform::Misc::MODS] = false; } Platform::~Platform() { diff --git a/src/PlatformGCW0.cpp b/src/PlatformGCW0.cpp index 8fe5b1a..b34028d 100644 --- a/src/PlatformGCW0.cpp +++ b/src/PlatformGCW0.cpp @@ -41,7 +41,33 @@ , force_hardware_cursor(true) , has_lock_file(true) , config_menu_type(CONFIG_MENU_TYPE_BASE) - , default_renderer("") { + , default_renderer("") + , config_video(Platform::Video::COUNT, true) + , config_audio(Platform::Audio::COUNT, true) + , config_interface(Platform::Interface::COUNT, true) + , config_input(Platform::Input::COUNT, true) + , config_misc(Platform::Misc::COUNT, true) +{ + config_video[Platform::Video::RENDERER] = false; + config_video[Platform::Video::FULLSCREEN] = false; + config_video[Platform::Video::HWSURFACE] = false; + config_video[Platform::Video::VSYNC] = false; + config_video[Platform::Video::TEXTURE_FILTER] = false; + config_video[Platform::Video::DPI_SCALING] = false; + config_video[Platform::Video::ENABLE_GAMMA] = false; + config_video[Platform::Video::GAMMA] = false; + + config_interface[Platform::Interface::HARDWARE_CURSOR] = false; + + config_input[Platform::Input::JOYSTICK] = false; + config_input[Platform::Input::MOUSE_MOVE] = false; + config_input[Platform::Input::MOUSE_AIM] = false; + config_input[Platform::Input::NO_MOUSE] = false; + config_input[Platform::Input::MOUSE_MOVE_SWAP] = false; + config_input[Platform::Input::MOUSE_MOVE_ATTACK] = false; + config_input[Platform::Input::JOYSTICK_DEADZONE] = false; + + config_misc[Platform::Misc::KEYBINDS] = false; } Platform::~Platform() { @@ -110,7 +136,7 @@ path_data = true; } else if (!settings->custom_path_data.empty()) { - Utils::logError("Settings: Could not find specified game data directory."); + Utils::logError("Platform: Could not find specified game data directory."); settings->custom_path_data = ""; } diff --git a/src/PlatformIPhoneOS.cpp b/src/PlatformIPhoneOS.cpp index d22247e..205999e 100644 --- a/src/PlatformIPhoneOS.cpp +++ b/src/PlatformIPhoneOS.cpp @@ -55,7 +55,33 @@ , force_hardware_cursor(true) , has_lock_file(false) , config_menu_type(CONFIG_MENU_TYPE_BASE) - , default_renderer("sdl_hardware") { + , default_renderer("sdl_hardware") + , config_video(Platform::Video::COUNT, true) + , config_audio(Platform::Audio::COUNT, true) + , config_interface(Platform::Interface::COUNT, true) + , config_input(Platform::Input::COUNT, true) + , config_misc(Platform::Misc::COUNT, true) +{ + config_video[Platform::Video::RENDERER] = false; + config_video[Platform::Video::FULLSCREEN] = false; + config_video[Platform::Video::HWSURFACE] = false; + config_video[Platform::Video::VSYNC] = false; + config_video[Platform::Video::TEXTURE_FILTER] = false; + config_video[Platform::Video::DPI_SCALING] = false; + config_video[Platform::Video::ENABLE_GAMMA] = false; + config_video[Platform::Video::GAMMA] = false; + + config_interface[Platform::Interface::HARDWARE_CURSOR] = false; + + config_input[Platform::Input::JOYSTICK] = false; + config_input[Platform::Input::MOUSE_MOVE] = false; + config_input[Platform::Input::MOUSE_AIM] = false; + config_input[Platform::Input::NO_MOUSE] = false; + config_input[Platform::Input::MOUSE_MOVE_SWAP] = false; + config_input[Platform::Input::MOUSE_MOVE_ATTACK] = false; + config_input[Platform::Input::JOYSTICK_DEADZONE] = false; + + config_misc[Platform::Misc::KEYBINDS] = false; } Platform::~Platform() { @@ -126,7 +152,7 @@ path_data = true; } else if (!settings->custom_path_data.empty()) { - Utils::logError("Settings: Could not find specified game data directory."); + Utils::logError("Platform: Could not find specified game data directory."); settings->custom_path_data = ""; } diff --git a/src/PlatformLinux.cpp b/src/PlatformLinux.cpp index fd74854..86133bd 100644 --- a/src/PlatformLinux.cpp +++ b/src/PlatformLinux.cpp @@ -41,7 +41,13 @@ , force_hardware_cursor(false) , has_lock_file(true) , config_menu_type(CONFIG_MENU_TYPE_DESKTOP) - , default_renderer("") { + , default_renderer("") + , config_video(Platform::Video::COUNT, true) + , config_audio(Platform::Audio::COUNT, true) + , config_interface(Platform::Interface::COUNT, true) + , config_input(Platform::Input::COUNT, true) + , config_misc(Platform::Misc::COUNT, true) +{ } Platform::~Platform() { @@ -110,7 +116,7 @@ path_data = true; } else if (!settings->custom_path_data.empty()) { - Utils::logError("Settings: Could not find specified game data directory."); + Utils::logError("Platform: Could not find specified game data directory."); settings->custom_path_data = ""; } @@ -156,7 +162,26 @@ if (!path_data && Filesystem::pathExists(settings->path_data)) path_data = true; // finally assume the local folder - if (!path_data) settings->path_data = "./"; + if (!path_data) { + char abs_path[1024]; + ssize_t len = readlink("/proc/self/exe", abs_path, 1024); + if (len >= 0 && len < 1024) { + // remove executable name from abs_path + const char BREAK_POINT = '/'; + const char BREAK_STRING = '\0'; + for(ssize_t i = len; i >= 0; --i) { + if(abs_path[i] == BREAK_POINT) { + abs_path[i + 1] = BREAK_STRING; + break; + } + } + settings->path_data = std::string(abs_path); + } + else { + // unable to get executable path, so just use the working directory + settings->path_data = "./"; + } + } } bool Platform::dirCreate(const std::string& path) { diff --git a/src/PlatformWin32.cpp b/src/PlatformWin32.cpp index 6766cb3..81f6c6c 100644 --- a/src/PlatformWin32.cpp +++ b/src/PlatformWin32.cpp @@ -36,7 +36,12 @@ , force_hardware_cursor(false) , has_lock_file(true) , config_menu_type(CONFIG_MENU_TYPE_DESKTOP) - , default_renderer("") { + , default_renderer("") + , config_video(Platform::Video::COUNT, true) + , config_audio(Platform::Audio::COUNT, true) + , config_interface(Platform::Interface::COUNT, true) + , config_input(Platform::Input::COUNT, true) + , config_misc(Platform::Misc::COUNT, true) { } Platform::~Platform() { @@ -67,7 +72,7 @@ settings->path_data = ""; if (Filesystem::pathExists(settings->custom_path_data)) settings->path_data = settings->custom_path_data; else if (!settings->custom_path_data.empty()) { - Utils::logError("Settings: Could not find specified game data directory."); + Utils::logError("Platform: Could not find specified game data directory."); settings->custom_path_data = ""; } diff --git a/src/PowerManager.cpp b/src/PowerManager.cpp index ca64967..1de4fb0 100644 --- a/src/PowerManager.cpp +++ b/src/PowerManager.cpp @@ -30,7 +30,7 @@ #include "Avatar.h" #include "CombatText.h" #include "EffectManager.h" -#include "EnemyManager.h" +#include "EntityManager.h" #include "EngineSettings.h" #include "EventManager.h" #include "FileParser.h" @@ -84,10 +84,7 @@ , requires_targeting(false) , requires_spawns(0) , cooldown(0) - , requires_max_hp(-1) - , requires_max_mp(-1) - , requires_not_max_hp(-1) - , requires_not_max_mp(-1) + , requires_max_hpmp() , animation_name("") , sfx_index(-1) , sfx_hit(0) @@ -211,7 +208,7 @@ } else if (infile.key == "type") { // @ATTR effect.type|string|Defines the type of effect - effects.back().type = infile.val; + effects.back().type = Effect::getTypeFromString(infile.val); } else if (infile.key == "name") { // @ATTR effect.name|string|A displayed name that is shown when hovering the mouse over the effect icon. @@ -276,29 +273,29 @@ bool clear_post_effects = true; - int input_id = 0; - bool skippingEntry = false; + PowerID input_id = 0; + bool id_line = false; while (infile.next()) { // id needs to be the first component of each power. That is how we write // data to the correct power. if (infile.key == "id") { // @ATTR power.id|power_id|Uniq identifier for the power definition. - input_id = Parse::toInt(infile.val); - skippingEntry = input_id < 1; - if (skippingEntry) - infile.error("PowerManager: Power index out of bounds 1-%d, skipping power.", INT_MAX); - if (static_cast<int>(powers.size()) < input_id + 1) { - powers.resize(input_id + 1); - power_animations.resize(powers.size()); - } + id_line = true; + input_id = Parse::toPowerID(infile.val); + powers[input_id] = Power(); clear_post_effects = true; powers[input_id].is_empty = false; continue; } - if (skippingEntry) + else id_line = false; + + if (input_id < 1) { + if (id_line) infile.error("PowerManager: Power index out of bounds 1-%d, skipping power.", INT_MAX); + } + if (id_line) continue; if (infile.key == "type") { @@ -403,7 +400,7 @@ else if (infile.key == "requires_item") { // @ATTR power.requires_item|repeatable(item_id, int) : Item, Quantity|Requires a specific item of a specific quantity in inventory. If quantity > 0, then the item will be removed. PowerRequiredItem pri; - pri.id = Parse::popFirstInt(infile.val); + pri.id = Parse::toItemID(Parse::popFirstString(infile.val)); pri.quantity = Parse::toInt(Parse::popFirstString(infile.val), 1); pri.equipped = false; powers[input_id].required_items.push_back(pri); @@ -411,7 +408,7 @@ else if (infile.key == "requires_equipped_item") { // @ATTR power.requires_equipped_item|repeatable(item_id, int) : Item, Quantity|Requires a specific item of a specific quantity to be equipped on hero. If quantity > 0, then the item will be removed. PowerRequiredItem pri; - pri.id = Parse::popFirstInt(infile.val); + pri.id = Parse::toItemID(Parse::popFirstString(infile.val)); pri.quantity = Parse::popFirstInt(infile.val); pri.equipped = true; @@ -433,39 +430,72 @@ // @ATTR power.cooldown|duration|Specify the duration for cooldown of the power in 'ms' or 's'. powers[input_id].cooldown = Parse::toDuration(infile.val); else if (infile.key == "requires_hpmp_state") { - // @ATTR power.requires_hpmp_state|["hp", "mp"], ["percent", "not_percent", "ignore"], int : Stat, Current state, Percentage value|Power can only be used when HP/MP matches the specified state - std::string stat = Parse::popFirstString(infile.val); - std::string cur_state = Parse::popFirstString(infile.val); - int percent = Parse::popFirstInt(infile.val); - - bool is_req = false; - bool invert = false; - if (cur_state == "percent") { - is_req = true; - invert = false; - } - else if (cur_state == "not_percent") { - is_req = true; - invert = true; - } - else if (cur_state == "ignore") { - is_req = false; + // @ATTR power.requires_hpmp_state|["all", "any"], ["percent", "not_percent", "ignore"], int , ["percent", "not_percent", "ignore"], int: Mode, HP state, HP Percentage value, MP state, MP Percentage value|Power can only be used when HP/MP matches the specified state. In 'all' mode, both HP and MP must meet the requirements, where as only one must in 'any' mode. To check a single stat, use 'all' mode and set the 'ignore' state for the other stat. + + std::string mode = Parse::popFirstString(infile.val); + std::string state_hp = Parse::popFirstString(infile.val); + std::string state_hp_val = Parse::popFirstString(infile.val); + std::string state_mp = Parse::popFirstString(infile.val); + std::string state_mp_val = Parse::popFirstString(infile.val); + + powers[input_id].requires_max_hpmp.hp = state_hp_val.empty() ? -1 : Parse::toInt(state_hp_val); + powers[input_id].requires_max_hpmp.mp = state_mp_val.empty() ? -1 : Parse::toInt(state_mp_val); + + if (state_hp == "percent") { + powers[input_id].requires_max_hpmp.hp_state = Power::HPMPSTATE_PERCENT; + } + else if (state_hp == "not_percent") { + powers[input_id].requires_max_hpmp.hp_state = Power::HPMPSTATE_NOT_PERCENT; + } + else if (state_hp == "ignore" || state_hp.empty()) { + powers[input_id].requires_max_hpmp.hp_state = Power::HPMPSTATE_IGNORE; + powers[input_id].requires_max_hpmp.hp = -1; } else { - is_req = false; - infile.error("PowerManager: '%s' is not a valid hp/mp state. Use 'percent', 'not_percent', or 'ignore'.", cur_state.c_str()); - } - - if (stat == "hp") { - powers[input_id].requires_max_hp = (is_req && !invert) ? percent : -1; - powers[input_id].requires_not_max_hp = (is_req && invert) ? percent : -1; - } - else if (stat == "mp") { - powers[input_id].requires_max_mp = (is_req && !invert) ? percent : -1; - powers[input_id].requires_not_max_mp = (is_req && invert) ? percent : -1; + infile.error("PowerManager: '%s' is not a valid hp/mp state. Use 'percent', 'not_percent', or 'ignore'.", state_hp.c_str()); + } + + if (state_mp == "percent") { + powers[input_id].requires_max_hpmp.mp_state = Power::HPMPSTATE_PERCENT; + } + else if (state_mp == "not_percent") { + powers[input_id].requires_max_hpmp.mp_state = Power::HPMPSTATE_NOT_PERCENT; + } + else if (state_mp == "ignore" || state_mp.empty()) { + powers[input_id].requires_max_hpmp.mp_state = Power::HPMPSTATE_IGNORE; + powers[input_id].requires_max_hpmp.mp = -1; } else { - infile.error("PowerManager: Please specify 'hp' or 'mp'."); + infile.error("PowerManager: '%s' is not a valid hp/mp state. Use 'percent', 'not_percent', or 'ignore'.", state_mp.c_str()); + } + + if (mode == "any") { + powers[input_id].requires_max_hpmp.mode = Power::HPMPSTATE_ANY; + } + else if (mode == "all") { + powers[input_id].requires_max_hpmp.mode = Power::HPMPSTATE_ALL; + } + else if (mode == "hp") { + // TODO deprecated + infile.error("PowerManager: 'hp' has been deprecated. Use 'all' or 'any'."); + + powers[input_id].requires_max_hpmp.mode = Power::HPMPSTATE_ALL; + powers[input_id].requires_max_hpmp.mp_state = Power::HPMPSTATE_IGNORE; + powers[input_id].requires_max_hpmp.mp = -1; + } + else if (mode == "mp") { + // TODO deprecated + infile.error("PowerManager: 'mp' has been deprecated. Use 'any' or 'all'."); + + // use the HP values for MP, then ignore the HP stat + powers[input_id].requires_max_hpmp.mode = Power::HPMPSTATE_ALL; + powers[input_id].requires_max_hpmp.mp_state = powers[input_id].requires_max_hpmp.hp_state; + powers[input_id].requires_max_hpmp.mp = powers[input_id].requires_max_hpmp.hp; + powers[input_id].requires_max_hpmp.hp_state = Power::HPMPSTATE_IGNORE; + powers[input_id].requires_max_hpmp.hp = -1; + } + else { + infile.error("PowerManager: Please specify 'any' or 'all'."); } } // animation info @@ -686,7 +716,7 @@ } } else if (infile.key == "post_power") { - // @ATTR power.post_power|power_id, int : Power, Chance to cast|Trigger a power if the hazard did damage. + // @ATTR power.post_power|power_id, int : Power, Chance to cast|Trigger a power if the hazard did damage. For 'block' type powers, this power will be triggered when the blocker takes damage. powers[input_id].post_power = Parse::popFirstInt(infile.val); std::string chance = Parse::popFirstString(infile.val); if (!chance.empty()) { @@ -864,18 +894,56 @@ // @ATTR power.target_nearest|float|Will automatically target the nearest enemy within the specified range. powers[input_id].target_nearest = Parse::toFloat(infile.val); } + else if (infile.key == "disable_equip_slots") { + // @ATTR power.disable_equip_slots|list(predefined_string)|Passive powers only. A comma separated list of equip slot types to disable when this power is active. + powers[input_id].disable_equip_slots.clear(); + std::string slot_type = Parse::popFirstString(infile.val); + + while (slot_type != "") { + powers[input_id].disable_equip_slots.push_back(slot_type); + slot_type = Parse::popFirstString(infile.val); + } + } else infile.error("PowerManager: '%s' is not a valid key", infile.key.c_str()); } infile.close(); - for (size_t i=0; i<powers.size(); ++i) { + std::map<PowerID, Power>::iterator power_it; + for (power_it = powers.begin(); power_it != powers.end(); ++power_it) { + Power& power = power_it->second; + // verify wall/post power ids - powers[i].wall_power = verifyID(powers[i].wall_power, NULL, ALLOW_ZERO_ID); - powers[i].post_power = verifyID(powers[i].post_power, NULL, ALLOW_ZERO_ID); + power.wall_power = verifyID(power.wall_power, NULL, ALLOW_ZERO_ID); + power.post_power = verifyID(power.post_power, NULL, ALLOW_ZERO_ID); // calculate effective combat range - setCombatRange(i); + { + power.combat_range = 0; + + // TODO apparently, missiles and repeaters don't need to have "use_hazard=true"? + if (!( (!power.use_hazard && power.type == Power::TYPE_FIXED) || power.no_attack) ) { + if (power.type == Power::TYPE_FIXED) { + if (power.relative_pos) { + power.combat_range += power.charge_speed * static_cast<float>(power.lifespan); + } + if (power.starting_pos == Power::STARTING_POS_TARGET) { + power.combat_range = FLT_MAX - power.radius; + } + } + else if (power.type == Power::TYPE_MISSILE) { + power.combat_range += power.speed * static_cast<float>(power.lifespan); + } + else if (power.type == Power::TYPE_REPEATER) { + power.combat_range += power.speed * static_cast<float>(power.count); + } + else { + power.combat_range = 0; + } + + power.combat_range += (power.radius / 2.f); + } + } } } @@ -942,7 +1010,7 @@ /** * Check if the target is valid (not an empty area or a wall) */ -bool PowerManager::hasValidTarget(int power_index, StatBlock *src_stats, const FPoint& target) { +bool PowerManager::hasValidTarget(PowerID power_index, StatBlock *src_stats, const FPoint& target) { if (!collider) return false; @@ -969,7 +1037,7 @@ * @param target Aim position in map coordinates * @param haz A newly-initialized hazard */ -void PowerManager::initHazard(int power_index, StatBlock *src_stats, const FPoint& target, Hazard *haz) { +void PowerManager::initHazard(PowerID power_index, StatBlock *src_stats, const FPoint& target, Hazard *haz) { //the hazard holds the statblock of its source haz->src_stats = src_stats; @@ -1045,7 +1113,7 @@ * Any attack-based effects are handled by hazards. * Self-enhancements (buffs) are handled by this function. */ -void PowerManager::buff(int power_index, StatBlock *src_stats, const FPoint& target) { +void PowerManager::buff(PowerID power_index, StatBlock *src_stats, const FPoint& target) { // teleport to the target location if (powers[power_index].buff_teleport) { @@ -1096,12 +1164,12 @@ * Play the sound effect for this power * Equipped items may have unique sounds */ -void PowerManager::playSound(int power_index) { +void PowerManager::playSound(PowerID power_index) { if (powers[power_index].sfx_index != -1) snd->play(sfx[powers[power_index].sfx_index], snd->DEFAULT_CHANNEL, snd->NO_POS, !snd->LOOP); } -bool PowerManager::effect(StatBlock *target_stats, StatBlock *caster_stats, int power_index, int source_type) { +bool PowerManager::effect(StatBlock *target_stats, StatBlock *caster_stats, PowerID power_index, int source_type) { const Power& pwr = powers[power_index]; for (unsigned i=0; i<powers[power_index].post_effects.size(); i++) { const PostEffect& pe = pwr.post_effects[i]; @@ -1116,14 +1184,14 @@ int duration = pe.duration; StatBlock *dest_stats = pe.target_src ? caster_stats : target_stats; - if (dest_stats->hp <= 0 && !(effect_data.type == "revive" || (effect_data.type.empty() && pe.id == "revive"))) + if (dest_stats->hp <= 0 && !(effect_data.type == Effect::REVIVE || (effect_data.type == Effect::NONE && pe.id == "revive"))) continue; if (effect_ptr != NULL) { // effects loaded from powers/effects.txt effect_data = (*effect_ptr); - if (effect_data.type == "shield") { + if (effect_data.type == Effect::SHIELD) { if (pwr.base_damage == eset->damage_types.list.size()) continue; @@ -1139,7 +1207,7 @@ comb->addString(msg->get("+%d Shield",magnitude), dest_stats->pos, CombatText::MSG_BUFF); } - else if (effect_data.type == "heal") { + else if (effect_data.type == Effect::HEAL) { if (pwr.base_damage == eset->damage_types.list.size()) continue; @@ -1157,7 +1225,7 @@ dest_stats->hp += magnitude; if (dest_stats->hp > dest_stats->get(Stats::HP_MAX)) dest_stats->hp = dest_stats->get(Stats::HP_MAX); } - else if (effect_data.type == "knockback") { + else if (effect_data.type == Effect::KNOCKBACK) { if (dest_stats->speed_default == 0) { // enemies that can't move can't be knocked back continue; @@ -1168,7 +1236,8 @@ } else { // all other effects - effect_data.id = effect_data.type = pe.id; + effect_data.id = pe.id; + effect_data.type = Effect::getTypeFromString(pe.id); } dest_stats->effects.addEffect(effect_data, duration, magnitude, source_type, power_index); @@ -1185,7 +1254,7 @@ * @param target The mouse cursor position in map coordinates * return boolean true if successful */ -bool PowerManager::fixed(int power_index, StatBlock *src_stats, const FPoint& target) { +bool PowerManager::fixed(PowerID power_index, StatBlock *src_stats, const FPoint& target) { if (powers[power_index].use_hazard) { int delay_iterator = 0; @@ -1221,7 +1290,7 @@ * @param target The mouse cursor position in map coordinates * return boolean true if successful */ -bool PowerManager::missile(int power_index, StatBlock *src_stats, const FPoint& target) { +bool PowerManager::missile(PowerID power_index, StatBlock *src_stats, const FPoint& target) { FPoint src; if (powers[power_index].starting_pos == Power::STARTING_POS_TARGET) { src = target; @@ -1276,7 +1345,7 @@ /** * Repeaters are multiple hazards that spawn in a straight line */ -bool PowerManager::repeater(int power_index, StatBlock *src_stats, const FPoint& target) { +bool PowerManager::repeater(PowerID power_index, StatBlock *src_stats, const FPoint& target) { payPowerCost(power_index, src_stats); @@ -1332,7 +1401,7 @@ /** * Spawn a creature. Does not create a hazard */ -bool PowerManager::spawn(int power_index, StatBlock *src_stats, const FPoint& target) { +bool PowerManager::spawn(PowerID power_index, StatBlock *src_stats, const FPoint& target) { Map_Enemy espawn; espawn.type = powers[power_index].spawn_type; espawn.summoner = src_stats; @@ -1388,7 +1457,7 @@ /** * Transform into a creature. Fully replaces entity characteristics */ -bool PowerManager::transform(int power_index, StatBlock *src_stats, const FPoint& target) { +bool PowerManager::transform(PowerID power_index, StatBlock *src_stats, const FPoint& target) { // locking the actionbar prevents power usage until after the hero is transformed inpt->lockActionBar(); @@ -1444,7 +1513,7 @@ * Stationary blocking with optional buffs/debuffs * Only the hero can block */ -bool PowerManager::block(int power_index, StatBlock *src_stats) { +bool PowerManager::block(PowerID power_index, StatBlock *src_stats) { // if the hero is blocking, we can't activate any more blocking powers if (src_stats->effects.triggered_block) return false; @@ -1465,18 +1534,22 @@ return true; } +PowerID PowerManager::checkReplaceByEffect(PowerID power_index, StatBlock *src_stats) { + for (size_t i = 0; i < powers[power_index].replace_by_effect.size(); ++i) { + if (src_stats->effects.hasEffect(powers[power_index].replace_by_effect[i].effect_id, powers[power_index].replace_by_effect[i].count)) { + return powers[power_index].replace_by_effect[i].power_id; + } + } + + return power_index; +} + /** * Activate is basically a switch/redirect to the appropriate function */ -bool PowerManager::activate(int power_index, StatBlock *src_stats, const FPoint& target) { - if (static_cast<unsigned>(power_index) >= powers.size()) +bool PowerManager::activate(PowerID power_index, StatBlock *src_stats, const FPoint& target) { + if (powers[power_index].is_empty) return false; - - for (size_t i = 0; i < powers[power_index].replace_by_effect.size(); ++i) { - if (src_stats->effects.hasEffect(powers[power_index].replace_by_effect[i].effect_id, powers[power_index].replace_by_effect[i].count)) { - return activate(powers[power_index].replace_by_effect[i].power_id, src_stats, target); - } - } if (src_stats->hero) { if (powers[power_index].requires_mp > src_stats->mp) @@ -1528,7 +1601,7 @@ /** * pay costs, i.e. remove mana or items. */ -void PowerManager::payPowerCost(int power_index, StatBlock *src_stats) { +void PowerManager::payPowerCost(PowerID power_index, StatBlock *src_stats) { if (src_stats) { if (src_stats->hero) { src_stats->mp -= powers[power_index].requires_mp; @@ -1569,19 +1642,21 @@ * Activate an entity's passive powers */ void PowerManager::activatePassives(StatBlock *src_stats) { + bool activated_passive = false; bool triggered_others = false; // unlocked powers for (unsigned i=0; i<src_stats->powers_passive.size(); i++) { - activatePassiveByTrigger(src_stats->powers_passive[i], src_stats, triggered_others); + activated_passive |= activatePassiveByTrigger(src_stats->powers_passive[i], src_stats, triggered_others); } // item powers for (unsigned i=0; i<src_stats->powers_list_items.size(); i++) { - activatePassiveByTrigger(src_stats->powers_list_items[i], src_stats, triggered_others); + activated_passive |= activatePassiveByTrigger(src_stats->powers_list_items[i], src_stats, triggered_others); } // Only trigger normal passives once - if (triggered_others) src_stats->effects.triggered_others = true; + if (triggered_others) + src_stats->effects.triggered_others = true; // the hit/death triggers can be triggered more than once, so reset them here // the block trigger is handled in the Avatar class @@ -1589,43 +1664,60 @@ src_stats->effects.triggered_death = false; activatePassivePostPowers(src_stats); -} - -void PowerManager::activatePassiveByTrigger(int power_id, StatBlock *src_stats, bool& triggered_others) { + + // passive powers can lock equipment slots, so update equipment here + if (activated_passive && src_stats->hero) + menu->inv->applyEquipment(); +} + +bool PowerManager::activatePassiveByTrigger(PowerID power_id, StatBlock *src_stats, bool& triggered_others) { if (powers[power_id].passive) { int trigger = powers[power_id].passive_trigger; if (trigger == -1) { - if (src_stats->effects.triggered_others) return; - else triggered_others = true; - } - else if (trigger == Power::TRIGGER_BLOCK && !src_stats->effects.triggered_block) return; - else if (trigger == Power::TRIGGER_HIT && !src_stats->effects.triggered_hit) return; + if (src_stats->effects.triggered_others) + return false; + else + triggered_others = true; + } + else if (trigger == Power::TRIGGER_BLOCK && !src_stats->effects.triggered_block) + return false; + else if (trigger == Power::TRIGGER_HIT && !src_stats->effects.triggered_hit) + return false; else if (trigger == Power::TRIGGER_HALFDEATH && !src_stats->effects.triggered_halfdeath) { - if (src_stats->hp > src_stats->get(Stats::HP_MAX)/2) return; - else src_stats->effects.triggered_halfdeath = true; + if (src_stats->hp > src_stats->get(Stats::HP_MAX)/2) + return false; + else + src_stats->effects.triggered_halfdeath = true; } else if (trigger == Power::TRIGGER_JOINCOMBAT && !src_stats->effects.triggered_joincombat) { - if (!src_stats->in_combat) return; - else src_stats->effects.triggered_joincombat = true; - } - else if (trigger == Power::TRIGGER_DEATH && !src_stats->effects.triggered_death) return; + if (!src_stats->in_combat) + return false; + else + src_stats->effects.triggered_joincombat = true; + } + else if (trigger == Power::TRIGGER_DEATH && !src_stats->effects.triggered_death) { + return false; + } activate(power_id, src_stats, src_stats->pos); src_stats->refresh_stats = true; - int post_power = powers[power_id].post_power; + PowerID post_power = powers[power_id].post_power; if (post_power > 0) { src_stats->setPowerCooldown(post_power, powers[post_power].cooldown); } - } + + return true; + } + return false; } /** * Activate a single passive * this is used when unlocking powers in MenuPowers */ -void PowerManager::activateSinglePassive(StatBlock *src_stats, int id) { +void PowerManager::activateSinglePassive(StatBlock *src_stats, PowerID id) { if (!powers[id].passive) return; if (powers[id].passive_trigger == -1) { @@ -1633,7 +1725,7 @@ src_stats->refresh_stats = true; src_stats->effects.triggered_others = true; - int post_power = powers[id].post_power; + PowerID post_power = powers[id].post_power; if (post_power > 0) { src_stats->setPowerCooldown(post_power, powers[post_power].cooldown); } @@ -1645,11 +1737,15 @@ */ void PowerManager::activatePassivePostPowers(StatBlock *src_stats) { for (size_t i = 0; i < src_stats->powers_passive.size(); ++i) { - const int post_power = powers[src_stats->powers_passive[i]].post_power; + const PowerID post_power = powers[src_stats->powers_passive[i]].post_power; if (post_power <= 0) continue; if (powers[post_power].new_state != Power::STATE_INSTANT) + continue; + + // blocking powers use a passive trigger, but we only want to activate their post_power when the blocker takes a hit + if (powers[src_stats->powers_passive[i]].type == Power::TYPE_BLOCK) continue; if (src_stats->getPowerCooldown(post_power) == 0 && src_stats->canUsePower(post_power, !StatBlock::CAN_USE_PASSIVE)) { @@ -1670,9 +1766,9 @@ return NULL; } -int PowerManager::verifyID(int power_id, FileParser* infile, bool allow_zero) { - bool lower_bound = (allow_zero && power_id < 0) || (!allow_zero && power_id < 1); - if (lower_bound || static_cast<unsigned>(power_id) >= powers.size()) { +PowerID PowerManager::verifyID(PowerID power_id, FileParser* infile, bool allow_zero) { + bool is_valid = (allow_zero || (!allow_zero && power_id > 0)); + if (!is_valid) { if (infile != NULL) infile->error("PowerManager: %d is not a valid power id.", power_id); else @@ -1710,7 +1806,12 @@ if (!items->requirementsMet(src_stats, pow.required_items[i].id)) { return false; } - if (!menu->inv->inventory[MenuInventory::CARRIED].contain(pow.required_items[i].id, pow.required_items[i].quantity)) { + + // Cap the lower bound of quantity to 1. + // We can set required quantity to 0 in order to not consume the item, + // but checking for presence of the item requires >0 quantity + int quantity = std::max(1, pow.required_items[i].quantity); + if (!menu->inv->inventory[MenuInventory::CARRIED].contain(pow.required_items[i].id, quantity)) { return false; } } @@ -1720,38 +1821,29 @@ return true; } -void PowerManager::setCombatRange(size_t power_index) { - Power& pow = powers[power_index]; - - pow.combat_range = 0; - - // TODO apparently, missiles and repeaters don't need to have "use_hazard=true"? - if ((!pow.use_hazard && pow.type == Power::TYPE_FIXED) || pow.no_attack) { - return; - } - - if (pow.type == Power::TYPE_FIXED) { - if (pow.relative_pos) { - pow.combat_range += pow.charge_speed * static_cast<float>(pow.lifespan); - } - if (pow.starting_pos == Power::STARTING_POS_TARGET) { - pow.combat_range = FLT_MAX - pow.radius; - } - } - else if (pow.type == Power::TYPE_MISSILE) { - pow.combat_range += pow.speed * static_cast<float>(pow.lifespan); - } - else if (pow.type == Power::TYPE_REPEATER) { - pow.combat_range += pow.speed * static_cast<float>(pow.count); - } - else { - pow.combat_range = 0; - } - - pow.combat_range += (pow.radius / 2.f); -} - -bool PowerManager::checkCombatRange(int power_index, StatBlock* src_stats, FPoint target) { +bool PowerManager::checkRequiredMaxHPMP(const Power &pow, const StatBlock *src_stats) { + bool hp_ok = true; + bool mp_ok = true; + + if (pow.requires_max_hpmp.hp_state == Power::HPMPSTATE_PERCENT && src_stats->hp < (src_stats->get(Stats::HP_MAX) * pow.requires_max_hpmp.hp) / 100) + hp_ok = false; + else if (pow.requires_max_hpmp.hp_state == Power::HPMPSTATE_NOT_PERCENT && src_stats->hp >= (src_stats->get(Stats::HP_MAX) * pow.requires_max_hpmp.hp) / 100) + hp_ok = false; + + if (pow.requires_max_hpmp.mp_state == Power::HPMPSTATE_PERCENT && src_stats->mp < (src_stats->get(Stats::MP_MAX) * pow.requires_max_hpmp.mp) / 100) + mp_ok = false; + else if (pow.requires_max_hpmp.mp_state == Power::HPMPSTATE_NOT_PERCENT && src_stats->mp >= (src_stats->get(Stats::MP_MAX) * pow.requires_max_hpmp.mp) / 100) + mp_ok = false; + + if (pow.requires_max_hpmp.mode == Power::HPMPSTATE_ALL) + return hp_ok && mp_ok; + else if (pow.requires_max_hpmp.mode == Power::HPMPSTATE_ANY) + return hp_ok || mp_ok; + else + return true; +} + +bool PowerManager::checkCombatRange(PowerID power_index, StatBlock* src_stats, FPoint target) { Power& pow = powers[power_index]; if (pow.combat_range == 0) @@ -1772,14 +1864,15 @@ } PowerManager::~PowerManager() { - for (size_t i = 0; i < powers.size(); ++i) { - if (powers[i].animation_name.empty()) + std::map<PowerID, Power>::iterator power_it; + for (power_it = powers.begin(); power_it != powers.end(); ++power_it) { + if (power_it->second.animation_name.empty()) continue; - anim->decreaseCount(powers[i].animation_name); - - if (power_animations[i]) - delete power_animations[i]; + anim->decreaseCount(power_it->second.animation_name); + + if (power_animations[power_it->first]) + delete power_animations[power_it->first]; } for (size_t i = 0; i < effects.size(); ++i) { diff --git a/src/PowerManager.h b/src/PowerManager.h index cdbcb40..61bae6b 100644 --- a/src/PowerManager.h +++ b/src/PowerManager.h @@ -63,7 +63,7 @@ class PowerRequiredItem { public: - int id; + ItemID id; int quantity; bool equipped; @@ -76,6 +76,32 @@ class Power { public: + enum { + HPMPSTATE_ANY = 0, + HPMPSTATE_ALL = 1 + }; + enum { + HPMPSTATE_IGNORE = 0, + HPMPSTATE_PERCENT = 1, + HPMPSTATE_NOT_PERCENT = 2 + }; + class HPMPState { + public: + int mode; + int hp_state; + int mp_state; + int hp; + int mp; + HPMPState() + : mode(HPMPSTATE_ANY) + , hp_state(HPMPSTATE_IGNORE) + , mp_state(HPMPSTATE_IGNORE) + , hp(-1) + , mp(-1) + {} + ~HPMPState() {} + }; + enum { TYPE_FIXED = 0, TYPE_MISSILE = 1, @@ -169,10 +195,7 @@ bool requires_targeting; // power only makes sense when using click-to-target int requires_spawns; int cooldown; // milliseconds before you can use the power again - int requires_max_hp; - int requires_max_mp; - int requires_not_max_hp; - int requires_not_max_mp; + HPMPState requires_max_hpmp; // animation info std::string animation_name; @@ -245,15 +268,15 @@ bool buff; bool buff_teleport; bool buff_party; - int buff_party_power_id; + PowerID buff_party_power_id; std::vector<PostEffect> post_effects; - int pre_power; + PowerID pre_power; int pre_power_chance; - int post_power; + PowerID post_power; int post_power_chance; - int wall_power; + PowerID wall_power; int wall_power_chance; bool wall_reflect; @@ -289,6 +312,8 @@ float target_nearest; + std::vector<std::string> disable_equip_slots; + Power(); ~Power() { } @@ -305,25 +330,23 @@ bool isValidEffect(const std::string& type); int loadSFX(const std::string& filename); - void initHazard(int powernum, StatBlock *src_stats, const FPoint& target, Hazard *haz); - void buff(int power_index, StatBlock *src_stats, const FPoint& target); - void playSound(int power_index); - - bool fixed(int powernum, StatBlock *src_stats, const FPoint& target); - bool missile(int powernum, StatBlock *src_stats, const FPoint& target); - bool repeater(int powernum, StatBlock *src_stats, const FPoint& target); - bool spawn(int powernum, StatBlock *src_stats, const FPoint& target); - bool transform(int powernum, StatBlock *src_stats, const FPoint& target); - bool block(int power_index, StatBlock *src_stats); - - void payPowerCost(int power_index, StatBlock *src_stats); - - void activatePassiveByTrigger(int power_id, StatBlock *src_stats, bool& triggered_others); + void initHazard(PowerID power_index, StatBlock *src_stats, const FPoint& target, Hazard *haz); + void buff(PowerID power_index, StatBlock *src_stats, const FPoint& target); + void playSound(PowerID power_index); + + bool fixed(PowerID power_index, StatBlock *src_stats, const FPoint& target); + bool missile(PowerID power_index, StatBlock *src_stats, const FPoint& target); + bool repeater(PowerID power_index, StatBlock *src_stats, const FPoint& target); + bool spawn(PowerID power_index, StatBlock *src_stats, const FPoint& target); + bool transform(PowerID power_index, StatBlock *src_stats, const FPoint& target); + bool block(PowerID power_index, StatBlock *src_stats); + + void payPowerCost(PowerID power_index, StatBlock *src_stats); + + bool activatePassiveByTrigger(PowerID power_id, StatBlock *src_stats, bool& triggered_others); void activatePassivePostPowers(StatBlock *src_stats); - void setCombatRange(size_t power_index); - - std::vector<Animation*> power_animations; + std::map<PowerID, Animation*> power_animations; std::vector<Animation*> effect_animations; public: @@ -333,29 +356,31 @@ ~PowerManager(); void handleNewMap(MapCollision *_collider); - bool activate(int power_index, StatBlock *src_stats, const FPoint& target); - bool canUsePower(unsigned id) const; - bool hasValidTarget(int power_index, StatBlock *src_stats, const FPoint& target); - bool effect(StatBlock *target_stats, StatBlock *caster_stats, int power_index, int source_type); + bool activate(PowerID power_index, StatBlock *src_stats, const FPoint& target); + bool canUsePower(PowerID id) const; + bool hasValidTarget(PowerID power_index, StatBlock *src_stats, const FPoint& target); + bool effect(StatBlock *target_stats, StatBlock *caster_stats, PowerID power_index, int source_type); void activatePassives(StatBlock *src_stats); - void activateSinglePassive(StatBlock *src_stats, int id); - int verifyID(int power_id, FileParser* infile, bool allow_zero); + void activateSinglePassive(StatBlock *src_stats, PowerID id); + PowerID verifyID(PowerID power_id, FileParser* infile, bool allow_zero); bool checkNearestTargeting(const Power &pow, const StatBlock *src_stats, bool check_corpses); bool checkRequiredItems(const Power &pow, const StatBlock *src_stats); - bool checkCombatRange(int power_index, StatBlock *src_stats, FPoint target); + bool checkRequiredMaxHPMP(const Power &pow, const StatBlock *src_stats); + bool checkCombatRange(PowerID power_index, StatBlock *src_stats, FPoint target); + PowerID checkReplaceByEffect(PowerID power_index, StatBlock *src_stats); EffectDef* getEffectDef(const std::string& id); std::vector<EffectDef> effects; - std::vector<Power> powers; + std::map<PowerID, Power> powers; std::queue<Hazard *> hazards; // output; read by HazardManager std::queue<Map_Enemy> map_enemies; // output; read by PowerManager // shared sounds for power special effects std::vector<SoundID> sfx; - std::vector<int> used_items; - std::vector<int> used_equipped_items; + std::vector<ItemID> used_items; + std::vector<ItemID> used_equipped_items; }; #endif diff --git a/src/RenderDevice.cpp b/src/RenderDevice.cpp index b8083e4..edd99cc 100644 --- a/src/RenderDevice.cpp +++ b/src/RenderDevice.cpp @@ -20,9 +20,9 @@ #include "RenderDevice.h" #include "Settings.h" #include "SharedResources.h" +#include "UtilsMath.h" #include <assert.h> -#include <math.h> #include <stdio.h> /* @@ -101,13 +101,18 @@ void Sprite::setClipFromRect(const Rect& clip) { src = clip; + + // don't exceed the dimensions of the image + const int target_w = getGraphicsWidth(); + const int target_h = getGraphicsHeight(); + if (src.x + src.w > target_w) + src.w = target_w - src.x; + if (src.y + src.h > target_h) + src.h = target_h - src.y; } void Sprite::setClip(const int x, const int y, const int w, const int h) { - src.x = x; - src.y = y; - src.w = w; - src.h = h; + setClipFromRect(Rect(x, y, w, h)); } const Rect& Sprite::getClip() { @@ -158,6 +163,7 @@ , texture_filter(false) , ignore_texture_filter(false) , min_screen(640, 480) + , destructive_fullscreen(false) , is_initialized(false) , reload_graphics(false) , ddpi(0) @@ -174,6 +180,7 @@ int status = createContextInternal(); if (status == -1) { + Utils::logError("RenderDevice: createContext() failed, trying previous settings."); // try previous setting first settings->fullscreen = fullscreen; settings->hwsurface = hwsurface; @@ -184,6 +191,7 @@ } if (status == -1) { + Utils::logError("RenderDevice: createContext() failed, disabling all options."); // last resort, try turning everything off settings->fullscreen = false; settings->hwsurface = false; @@ -364,6 +372,10 @@ Utils::logError("RenderDevice: Renderer does not support setting background color!"); } +void RenderDevice::setFullscreen(bool enable_fullscreen) { + Utils::logInfo("RenderDevice: Trying to set fullscreen=%d, without recreating the rendering context, but setFullscreen() is not implemented for this renderer.", enable_fullscreen); +} + void RenderDevice::drawEllipse(int x0, int y0, int x1, int y1, const Color& color, float step) { float rx = static_cast<float>(x1 - x0) / 2.f; float ry = static_cast<float>(y1 - y0) / 2.f; diff --git a/src/RenderDevice.h b/src/RenderDevice.h index 1282f89..3739a7a 100644 --- a/src/RenderDevice.h +++ b/src/RenderDevice.h @@ -113,6 +113,7 @@ virtual void fillWithColor(const Color& color) = 0; virtual void drawPixel(int x, int y, const Color& color) = 0; + virtual void drawLine(int x0, int y0, int x1, int y1, const Color& color) = 0; virtual void beginPixelBatch(); virtual void endPixelBatch(); virtual Image* resize(int width, int height) = 0; @@ -228,6 +229,7 @@ void drawEllipse(int x0, int y0, int x1, int y1, const Color& color, float step); virtual void windowResize() = 0; virtual void setBackgroundColor(Color color); + virtual void setFullscreen(bool enable_fullscreen); bool reloadGraphics(); @@ -252,6 +254,7 @@ bool texture_filter; bool ignore_texture_filter; Point min_screen; + bool destructive_fullscreen; bool is_initialized; bool reload_graphics; diff --git a/src/SDLFontEngine.cpp b/src/SDLFontEngine.cpp index 072a269..b34efee 100644 --- a/src/SDLFontEngine.cpp +++ b/src/SDLFontEngine.cpp @@ -31,10 +31,16 @@ #include "Settings.h" #include "UtilsParsing.h" -SDLFontStyle::SDLFontStyle() : FontStyle(), ttfont(NULL) { -} - -SDLFontEngine::SDLFontEngine() : FontEngine(), active_font(NULL) { +SDLFontStyle::SDLFontStyle() + : FontStyle() + , ttfont(NULL) +{ +} + +SDLFontEngine::SDLFontEngine() + : FontEngine() + , active_font(NULL) +{ // Initiate SDL_ttf if(!TTF_WasInit() && TTF_Init()==-1) { Utils::logError("SDLFontEngine: TTF_Init: %s", TTF_GetError()); @@ -95,19 +101,27 @@ // Attempt to set the default active font setFont("font_regular"); - if (!active_font) { + if (!isActiveFontValid()) { Utils::logError("FontEngine: Unable to determine default font!"); Utils::logErrorDialog("FontEngine: Unable to determine default font!"); - mods->resetModConfig(); - Utils::Exit(1); - } + } +} + +bool SDLFontEngine::isActiveFontValid() { + return active_font && active_font->ttfont; } int SDLFontEngine::getLineHeight() { + if (!isActiveFontValid()) + return 1; + return active_font->line_height; } int SDLFontEngine::getFontHeight() { + if (!isActiveFontValid()) + return 1; + return active_font->font_height; } @@ -115,6 +129,9 @@ * For single-line text, just calculate the width */ int SDLFontEngine::calc_width(const std::string& text) { + if (!isActiveFontValid()) + return 1; + int w, h; TTF_SizeUTF8(active_font->ttfont, text.c_str(), &w, &h); @@ -185,11 +202,22 @@ void SDLFontEngine::setFont(const std::string& _font) { for (unsigned int i=0; i<font_styles.size(); i++) { - if (font_styles[i].name == _font) { + if (font_styles[i].ttfont != NULL && font_styles[i].name == _font) { active_font = &(font_styles[i]); return; } } + + // Unable to find a matching font. Try the first available font style instead + for (unsigned int i=0; i<font_styles.size(); i++) { + if (font_styles[i].ttfont != NULL) { + Utils::logError("FontEngine: Invalid font '%s'. Falling back to '%s'.", _font.c_str(), font_styles[i].name.c_str()); + active_font = &(font_styles[i]); + return; + } + } + + Utils::logError("FontEngine: Invalid font '%s'. No fallback available.", _font.c_str()); } /** @@ -197,7 +225,7 @@ * Justify is left, right, or center */ void SDLFontEngine::renderInternal(const std::string& text, int x, int y, int justify, Image *target, const Color& color) { - if (text.empty()) + if (!isActiveFontValid() || text.empty()) return; Image *graphics; diff --git a/src/SDLFontEngine.h b/src/SDLFontEngine.h index 3b9c41b..4ae01e5 100644 --- a/src/SDLFontEngine.h +++ b/src/SDLFontEngine.h @@ -40,6 +40,8 @@ class SDLFontEngine : public FontEngine { private: + bool isActiveFontValid(); + std::vector<SDLFontStyle> font_styles; SDLFontStyle *active_font; diff --git a/src/SDLHardwareRenderDevice.cpp b/src/SDLHardwareRenderDevice.cpp index 9f7e034..fb6c7f2 100644 --- a/src/SDLHardwareRenderDevice.cpp +++ b/src/SDLHardwareRenderDevice.cpp @@ -78,6 +78,9 @@ */ void SDLHardwareImage::drawPixel(int x, int y, const Color& color) { if (!surface) return; + + if (x < 0 || y < 0 || x >= getWidth() || y >= getHeight()) + return; if (pixel_batch_surface) { // Taken from SDLSoftwareImage::drawPixel() @@ -127,6 +130,15 @@ SDL_SetRenderTarget(renderer, NULL); } } + +void SDLHardwareImage::drawLine(int x0, int y0, int x1, int y1, const Color& color) { + SDL_SetRenderTarget(renderer, surface); + SDL_SetTextureBlendMode(surface, SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); + SDL_RenderDrawLine(renderer, x0, y0, x1, y1); + SDL_SetRenderTarget(renderer, NULL); +} + /** * Creates a non-accelerated SDL_Surface as a pixel buffer @@ -208,7 +220,7 @@ , texture(NULL) , titlebar_icon(NULL) , title(NULL) - , background_color(0,0,0,0) + , background_color(0,0,0,255) { Utils::logInfo("Using Render Device: SDLHardwareRenderDevice (hardware, SDL 2, %s)", SDL_GetCurrentVideoDriver()); @@ -228,7 +240,14 @@ } int SDLHardwareRenderDevice::createContextInternal() { - bool settings_changed = (fullscreen != settings->fullscreen || +#ifdef _WIN32 + // We make heavy use of SDL_TEXTUREACCESS_TARGET for things such as text and the minimap + // If we use the 'direct3d' backend on Windows, these textures get lost on window resizing events + // So to bypass this, we force 'opengl' on Windows + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); +#endif + + bool settings_changed = ((fullscreen != settings->fullscreen && destructive_fullscreen) || hwsurface != settings->hwsurface || vsync != settings->vsync || texture_filter != settings->texture_filter || @@ -470,9 +489,10 @@ } void SDLHardwareRenderDevice::blankScreen() { - SDL_SetRenderDrawColor(renderer, background_color.r, background_color.g, background_color.b, background_color.a); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_SetRenderTarget(renderer, NULL); SDL_RenderClear(renderer); + SDL_SetRenderDrawColor(renderer, background_color.r, background_color.g, background_color.b, background_color.a); SDL_SetRenderTarget(renderer, texture); SDL_RenderClear(renderer); return; @@ -624,4 +644,24 @@ void SDLHardwareRenderDevice::setBackgroundColor(Color color) { background_color = color; -} + background_color.a = 255; // always 100% alpha +} + +void SDLHardwareRenderDevice::setFullscreen(bool enable_fullscreen) { + if (!destructive_fullscreen) { + if (enable_fullscreen) { + SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP); + } + else { + SDL_SetWindowFullscreen(window, 0); + + // restore window to the default size + SDL_SetWindowMinimumSize(window, eset->resolutions.min_screen_w, eset->resolutions.min_screen_h); + SDL_SetWindowSize(window, eset->resolutions.min_screen_w, eset->resolutions.min_screen_h); + windowResize(); + // setting minimum size might move the window, so set position again + SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + } + windowResize(); + } +} diff --git a/src/SDLHardwareRenderDevice.h b/src/SDLHardwareRenderDevice.h index 8b77eb7..a3458d7 100644 --- a/src/SDLHardwareRenderDevice.h +++ b/src/SDLHardwareRenderDevice.h @@ -46,6 +46,7 @@ void fillWithColor(const Color& color); void drawPixel(int x, int y, const Color& color); + void drawLine(int x0, int y0, int x1, int y1, const Color& color); void beginPixelBatch(); void endPixelBatch(); Image* resize(int width, int height); @@ -74,6 +75,7 @@ void destroyContext(); void windowResize(); void setBackgroundColor(Color color); + void setFullscreen(bool enable_fullscreen); Image *createImage(int width, int height); void setGamma(float g); void resetGamma(); diff --git a/src/SDLInputState.cpp b/src/SDLInputState.cpp index ebe3c2f..5c09b0b 100644 --- a/src/SDLInputState.cpp +++ b/src/SDLInputState.cpp @@ -154,6 +154,56 @@ binding[Input::ACTIONBAR_USE] = binding_alt[Input::ACTIONBAR_USE] = SDLK_n; binding[Input::DEVELOPER_MENU] = binding_alt[Input::DEVELOPER_MENU] = SDLK_F5; + + // Convert SDL_Keycode to SDL_Scancode, skip mouse binding + for (int key=0; key<KEY_COUNT; key++) { + if (SDL_GetScancodeFromKey(binding[key]) > 0) binding[key] = SDL_GetScancodeFromKey(binding[key]); + if (SDL_GetScancodeFromKey(binding_alt[key]) > 0) binding_alt[key] = SDL_GetScancodeFromKey(binding_alt[key]); + } +} + +void SDLInputState::setFixedKeyBindings() { + validateFixedKeyBinding(Input::MAIN1, (SDL_BUTTON_LEFT+MOUSE_BIND_OFFSET) * (-1), InputState::BINDING_DEFAULT); + + validateFixedKeyBinding(Input::CTRL, SDLK_LCTRL, InputState::BINDING_DEFAULT); + validateFixedKeyBinding(Input::CTRL, SDLK_RCTRL, InputState::BINDING_ALT); + binding_joy[Input::CTRL] = -1; + + validateFixedKeyBinding(Input::SHIFT, SDLK_LSHIFT, InputState::BINDING_DEFAULT); + validateFixedKeyBinding(Input::SHIFT, SDLK_RSHIFT, InputState::BINDING_ALT); + binding_joy[Input::SHIFT] = -1; + + validateFixedKeyBinding(Input::DEL, SDLK_DELETE, InputState::BINDING_DEFAULT); + validateFixedKeyBinding(Input::DEL, SDLK_BACKSPACE, InputState::BINDING_ALT); + binding_joy[Input::DEL] = -1; + + validateFixedKeyBinding(Input::ALT, SDLK_LALT, InputState::BINDING_DEFAULT); + validateFixedKeyBinding(Input::ALT, SDLK_RALT, InputState::BINDING_ALT); + binding_joy[Input::ALT] = -1; +} + +void SDLInputState::validateFixedKeyBinding(int action, int key, int bindings_list) { + if (bindings_list != InputState::BINDING_DEFAULT && bindings_list != InputState::BINDING_ALT) + return; + + int scan_key = (key < 0 ? key : SDL_GetScancodeFromKey(key)); + + for (int i = 0; i < KEY_COUNT; ++i) { + if (i == action) { + if (bindings_list == InputState::BINDING_DEFAULT) + binding[action] = scan_key; + else if (bindings_list == InputState::BINDING_ALT) + binding_alt[action] = scan_key; + + continue; + } + + if (binding[i] == scan_key) + binding[i] = -1; + + if (binding_alt[i] == scan_key) + binding_alt[i] = -1; + } } void SDLInputState::handle() { @@ -305,7 +355,7 @@ last_is_joystick = false; for (int key=0; key<KEY_COUNT; key++) { - if (event.key.keysym.sym == binding[key] || event.key.keysym.sym == binding_alt[key]) { + if (event.key.keysym.scancode == binding[key] || event.key.keysym.scancode == binding_alt[key]) { pressing[key] = true; un_press[key] = false; } @@ -319,11 +369,11 @@ last_is_joystick = false; for (int key=0; key<KEY_COUNT; key++) { - if (event.key.keysym.sym == binding[key] || event.key.keysym.sym == binding_alt[key]) { + if (event.key.keysym.scancode == binding[key] || event.key.keysym.scancode == binding_alt[key]) { un_press[key] = true; } } - last_key = event.key.keysym.sym; + last_key = event.key.keysym.scancode; if (event.key.keysym.sym == SDLK_UP) pressing_up = false; if (event.key.keysym.sym == SDLK_DOWN) pressing_down = false; @@ -518,6 +568,14 @@ break; case SDL_QUIT: done = 1; + // Clear inputs when quit is triggered. + // Doing this prevents unintended actions being triggered when exiting via an OS keyboard shortcut. + // For example, using Win+Esc as a global "close window" command while having CANCEL bound to Esc would cause a crash if it was used on the New Game screen. + for (int key=0; key<KEY_COUNT; key++) { + pressing[key] = false; + un_press[key] = false; + lock[key] = false; + } break; default: break; @@ -576,87 +634,140 @@ return std::string(SDL_JoystickNameForIndex(index)); } -std::string SDLInputState::getKeyName(int key) { +std::string SDLInputState::getKeyName(int key, bool get_short_string) { + key = SDL_GetKeyFromScancode(static_cast<SDL_Scancode>(key)); + // first, we try to provide a translation of the key - switch (static_cast<SDL_Keycode>(key)) { - case SDLK_BACKSPACE: return msg->get("Backspace"); - case SDLK_CAPSLOCK: return msg->get("CapsLock"); - case SDLK_DELETE: return msg->get("Delete"); - case SDLK_DOWN: return msg->get("Down"); - case SDLK_END: return msg->get("End"); - case SDLK_ESCAPE: return msg->get("Escape"); - case SDLK_HOME: return msg->get("Home"); - case SDLK_INSERT: return msg->get("Insert"); - case SDLK_LALT: return msg->get("Left Alt"); - case SDLK_LCTRL: return msg->get("Left Ctrl"); - case SDLK_LEFT: return msg->get("Left"); - case SDLK_LSHIFT: return msg->get("Left Shift"); - case SDLK_NUMLOCKCLEAR: return msg->get("NumLock"); - case SDLK_PAGEDOWN: return msg->get("PageDown"); - case SDLK_PAGEUP: return msg->get("PageUp"); - case SDLK_PAUSE: return msg->get("Pause"); - case SDLK_PRINTSCREEN: return msg->get("PrintScreen"); - case SDLK_RALT: return msg->get("Right Alt"); - case SDLK_RCTRL: return msg->get("Right Ctrl"); - case SDLK_RETURN: return msg->get("Return"); - case SDLK_RIGHT: return msg->get("Right"); - case SDLK_RSHIFT: return msg->get("Right Shift"); - case SDLK_SCROLLLOCK: return msg->get("ScrollLock"); - case SDLK_SPACE: return msg->get("Space"); - case SDLK_TAB: return msg->get("Tab"); - case SDLK_UP: return msg->get("Up"); + if (get_short_string) { + switch (static_cast<SDL_Keycode>(key)) { + case SDLK_BACKSPACE: return msg->get("BkSp"); + case SDLK_CAPSLOCK: return msg->get("Caps"); + case SDLK_DELETE: return msg->get("Del"); + case SDLK_DOWN: return msg->get("Down"); + case SDLK_END: return msg->get("End"); + case SDLK_ESCAPE: return msg->get("Esc"); + case SDLK_HOME: return msg->get("Home"); + case SDLK_INSERT: return msg->get("Ins"); + case SDLK_LALT: return msg->get("LAlt"); + case SDLK_LCTRL: return msg->get("LCtrl"); + case SDLK_LEFT: return msg->get("Left"); + case SDLK_LSHIFT: return msg->get("LShft"); + case SDLK_NUMLOCKCLEAR: return msg->get("Num"); + case SDLK_PAGEDOWN: return msg->get("PgDn"); + case SDLK_PAGEUP: return msg->get("PgUp"); + case SDLK_PAUSE: return msg->get("Pause"); + case SDLK_PRINTSCREEN: return msg->get("Print"); + case SDLK_RALT: return msg->get("RAlt"); + case SDLK_RCTRL: return msg->get("RCtrl"); + case SDLK_RETURN: return msg->get("Ret"); + case SDLK_RIGHT: return msg->get("Right"); + case SDLK_RSHIFT: return msg->get("RShft"); + case SDLK_SCROLLLOCK: return msg->get("SLock"); + case SDLK_SPACE: return msg->get("Spc"); + case SDLK_TAB: return msg->get("Tab"); + case SDLK_UP: return msg->get("Up"); + } + } + else { + switch (static_cast<SDL_Keycode>(key)) { + case SDLK_BACKSPACE: return msg->get("Backspace"); + case SDLK_CAPSLOCK: return msg->get("CapsLock"); + case SDLK_DELETE: return msg->get("Delete"); + case SDLK_DOWN: return msg->get("Down"); + case SDLK_END: return msg->get("End"); + case SDLK_ESCAPE: return msg->get("Escape"); + case SDLK_HOME: return msg->get("Home"); + case SDLK_INSERT: return msg->get("Insert"); + case SDLK_LALT: return msg->get("Left Alt"); + case SDLK_LCTRL: return msg->get("Left Ctrl"); + case SDLK_LEFT: return msg->get("Left"); + case SDLK_LSHIFT: return msg->get("Left Shift"); + case SDLK_NUMLOCKCLEAR: return msg->get("NumLock"); + case SDLK_PAGEDOWN: return msg->get("PageDown"); + case SDLK_PAGEUP: return msg->get("PageUp"); + case SDLK_PAUSE: return msg->get("Pause"); + case SDLK_PRINTSCREEN: return msg->get("PrintScreen"); + case SDLK_RALT: return msg->get("Right Alt"); + case SDLK_RCTRL: return msg->get("Right Ctrl"); + case SDLK_RETURN: return msg->get("Return"); + case SDLK_RIGHT: return msg->get("Right"); + case SDLK_RSHIFT: return msg->get("Right Shift"); + case SDLK_SCROLLLOCK: return msg->get("ScrollLock"); + case SDLK_SPACE: return msg->get("Space"); + case SDLK_TAB: return msg->get("Tab"); + case SDLK_UP: return msg->get("Up"); + } } // no translation for this key, so just get the name straight from SDL return std::string(SDL_GetKeyName(static_cast<SDL_Keycode>(key))); } -std::string SDLInputState::getMouseButtonName(int button) { +std::string SDLInputState::getMouseButtonName(int button, bool get_short_string) { int real_button = (button + MOUSE_BIND_OFFSET) * (-1); - if (real_button > 0 && real_button <= MOUSE_BUTTON_NAME_COUNT) - return mouse_button[real_button - 1]; - else - return msg->get("Mouse %d", real_button); -} - -std::string SDLInputState::getJoystickButtonName(int button) { + if (get_short_string) { + return msg->get("M%d", real_button); + } + else { + if (real_button > 0 && real_button <= MOUSE_BUTTON_NAME_COUNT) + return mouse_button[real_button - 1]; + else + return msg->get("Mouse %d", real_button); + } +} + +std::string SDLInputState::getJoystickButtonName(int button, bool get_short_string) { if (button < -1) { int axis = (button + JOY_AXIS_OFFSET) * (-1); - if (axis % 2 == 0) - return msg->get("Axis %d -", axis/2); + if (axis % 2 == 0) { + if (get_short_string) + return msg->get("JX%d-", axis/2); + else + return msg->get("Axis %d -", axis/2); + } + else { + if (get_short_string) + return msg->get("JX%d+", axis/2); + else + return msg->get("Axis %d +", axis/2); + } + } + else { + if (get_short_string) + return msg->get("JB%d", button); else - return msg->get("Axis %d +", axis/2); - } - else - return msg->get("Button %d", button); -} - -std::string SDLInputState::getBindingString(int key, int bindings_list) { - std::string none = msg->get("(none)"); + return msg->get("Button %d", button); + } +} + +std::string SDLInputState::getBindingString(int key, int bindings_list, bool get_short_string) { + std::string none = ""; + if (!get_short_string) + none = msg->get("(none)"); if (bindings_list == InputState::BINDING_DEFAULT) { if (binding[key] == 0 || binding[key] == -1) return none; else if (binding[key] < -1) - return getMouseButtonName(binding[key]); + return getMouseButtonName(binding[key], get_short_string); else - return getKeyName(binding[key]); + return getKeyName(binding[key], get_short_string); } else if (bindings_list == InputState::BINDING_ALT) { if (binding_alt[key] == 0 || binding_alt[key] == -1) return none; else if (binding_alt[key] < -1) - return getMouseButtonName(binding_alt[key]); + return getMouseButtonName(binding_alt[key], get_short_string); else - return getKeyName(binding_alt[key]); + return getKeyName(binding_alt[key], get_short_string); } else if (bindings_list == InputState::BINDING_JOYSTICK) { if (binding_joy[key] == -1) return none; else - return getJoystickButtonName(binding_joy[key]); + return getJoystickButtonName(binding_joy[key], get_short_string); } else { return none; @@ -664,64 +775,61 @@ } std::string SDLInputState::getMovementString() { - std::stringstream ss; - ss << "["; + std::string output = "["; if (settings->enable_joystick) { - ss << getBindingString(Input::LEFT, InputState::BINDING_JOYSTICK) << "/"; - ss << getBindingString(Input::RIGHT, InputState::BINDING_JOYSTICK) << "/"; - ss << getBindingString(Input::UP, InputState::BINDING_JOYSTICK) << "/"; - ss << getBindingString(Input::DOWN, InputState::BINDING_JOYSTICK); + output += getBindingString(Input::LEFT, InputState::BINDING_JOYSTICK) + "/"; + output += getBindingString(Input::RIGHT, InputState::BINDING_JOYSTICK) + "/"; + output += getBindingString(Input::UP, InputState::BINDING_JOYSTICK) + "/"; + output += getBindingString(Input::DOWN, InputState::BINDING_JOYSTICK); } else if (settings->touchscreen) { - ss << msg->get("Touch control D-Pad"); + output += msg->get("Touch control D-Pad"); } else if (settings->mouse_move) { - ss << (settings->mouse_move_swap ? getBindingString(Input::MAIN2) : getBindingString(Input::MAIN1)); + output += (settings->mouse_move_swap ? getBindingString(Input::MAIN2) : getBindingString(Input::MAIN1)); } else { - ss << getBindingString(Input::LEFT) << "/"; - ss << getBindingString(Input::RIGHT) << "/"; - ss << getBindingString(Input::UP) << "/"; - ss << getBindingString(Input::DOWN); - } - - ss << "]"; - return ss.str(); + output += getBindingString(Input::LEFT) + "/"; + output += getBindingString(Input::RIGHT) + "/"; + output += getBindingString(Input::UP) + "/"; + output += getBindingString(Input::DOWN); + } + + output += "]"; + return output; } std::string SDLInputState::getAttackString() { - std::stringstream ss; - ss << "["; + std::string output = "["; if (settings->enable_joystick) { - ss << getBindingString(Input::ACTIONBAR_USE, InputState::BINDING_JOYSTICK); + output += getBindingString(Input::ACTIONBAR_USE, InputState::BINDING_JOYSTICK); } else if (settings->touchscreen) { - ss << msg->get("Touch control buttons"); + output += msg->get("Touch control buttons"); } else { - ss << getBindingString(Input::MAIN1); - } - - ss << "]"; - return ss.str(); + output += getBindingString(Input::MAIN1); + } + + output += "]"; + return output; } std::string SDLInputState::getContinueString() { - std::stringstream ss; - ss << "["; + std::string output = "["; if (settings->touchscreen) { - ss << msg->get("Tap"); + output += msg->get("Tap"); } else { int binding_type = (settings->enable_joystick ? InputState::BINDING_JOYSTICK : InputState::BINDING_DEFAULT); - ss << getBindingString(Input::ACCEPT, binding_type); - } - - ss << "]"; - return ss.str(); + output += getBindingString(Input::ACCEPT, binding_type); + } + + output += "]"; + return output; } int SDLInputState::getNumJoysticks() { @@ -751,6 +859,28 @@ // unbind duplicate bindings for this key if (key != -1) { + + // prevent unmapping "fixed" keybinds + if (bindings_list != InputState::BINDING_JOYSTICK) { + if ((key == ((SDL_BUTTON_LEFT+MOUSE_BIND_OFFSET) * (-1)) && binding_button != Input::MAIN1) || + key == SDL_SCANCODE_LCTRL || + key == SDL_SCANCODE_RCTRL || + key == SDL_SCANCODE_LSHIFT || + key == SDL_SCANCODE_RSHIFT || + key == SDL_SCANCODE_LALT || + key == SDL_SCANCODE_RALT || + key == SDL_SCANCODE_DELETE || + key == SDL_SCANCODE_BACKSPACE) { + + if (key < -1) + keybind_msg = msg->get("Can not bind: %s", getMouseButtonName(key).c_str()); + else + keybind_msg = msg->get("Can not bind: %s", getKeyName(key).c_str()); + + return; + } + } + for (int i = 0; i < KEY_COUNT; ++i) { // the same key can be bound to both default & alt binding lists for the same action if (bindings_list != InputState::BINDING_JOYSTICK && i == binding_button) @@ -780,7 +910,7 @@ } int SDLInputState::getKeyFromName(const std::string& key_name) { - return SDL_GetKeyFromName(key_name.c_str()); + return SDL_GetScancodeFromName(key_name.c_str()); } SDLInputState::~SDLInputState() { diff --git a/src/SDLInputState.h b/src/SDLInputState.h index 6c1362b..a1ff829 100644 --- a/src/SDLInputState.h +++ b/src/SDLInputState.h @@ -34,14 +34,15 @@ void initJoystick(); void defaultQwertyKeyBindings(); + void setFixedKeyBindings(); void handle(); void hideCursor(); void showCursor(); std::string getJoystickName(int index); - std::string getKeyName(int key); - std::string getMouseButtonName(int button); - std::string getJoystickButtonName(int button); - std::string getBindingString(int key, int bindings_list = InputState::BINDING_DEFAULT); + std::string getKeyName(int key, bool get_short_string = !InputState::GET_SHORT_STRING); + std::string getMouseButtonName(int button, bool get_short_string = !InputState::GET_SHORT_STRING); + std::string getJoystickButtonName(int button, bool get_short_string = !InputState::GET_SHORT_STRING); + std::string getBindingString(int key, int bindings_list = InputState::BINDING_DEFAULT, bool get_short_string = !InputState::GET_SHORT_STRING); std::string getMovementString(); std::string getAttackString(); std::string getContinueString(); @@ -53,6 +54,7 @@ private: int getKeyFromName(const std::string& key_name); + void validateFixedKeyBinding(int action, int key, int bindings_list); SDL_Joystick* joy; int joy_num; diff --git a/src/SDLSoftwareRenderDevice.cpp b/src/SDLSoftwareRenderDevice.cpp index f652231..450f146 100644 --- a/src/SDLSoftwareRenderDevice.cpp +++ b/src/SDLSoftwareRenderDevice.cpp @@ -71,6 +71,9 @@ */ void SDLSoftwareImage::drawPixel(int x, int y, const Color& color) { if (!surface) return; + + if (x < 0 || y < 0 || x >= getWidth() || y >= getHeight()) + return; Uint32 pixel = MapRGBA(color.r, color.g, color.b, color.a); @@ -111,6 +114,36 @@ } } +void SDLSoftwareImage::drawLine(int x0, int y0, int x1, int y1, const Color& color) { + const int dx = abs(x1-x0); + const int dy = abs(y1-y0); + const int sx = x0 < x1 ? 1 : -1; + const int sy = y0 < y1 ? 1 : -1; + int err = dx-dy; + + int max_width = getWidth(); + int max_height = getHeight(); + + do { + //skip draw if outside screen + if (x0 > 0 && y0 > 0 && x0 < max_width && y0 < max_height) { + this->drawPixel(x0,y0,color); + } + + int e2 = 2*err; + if (e2 > -dy) { + err = err - dy; + x0 = x0 + sx; + } + if (e2 < dx) { + err = err + dx; + y0 = y0 + sy; + } + } + while(x0 != x1 || y0 != y1); +} + + Uint32 SDLSoftwareImage::MapRGBA(Uint8 r, Uint8 g, Uint8 b, Uint8 a) { if (!surface) return 0; return SDL_MapRGBA(surface->format, r, g, b, a); @@ -175,7 +208,18 @@ } int SDLSoftwareRenderDevice::createContextInternal() { - bool settings_changed = (fullscreen != settings->fullscreen || + if (settings->safe_video) { + settings->safe_video = false; + Utils::logInfo("RenderDevice: Safe mode is enabled. Using minimum video settings."); + settings->fullscreen = false; + settings->hwsurface = false; + settings->vsync = false; + settings->texture_filter = false; + settings->screen_w = eset->resolutions.min_screen_w; + settings->screen_h = eset->resolutions.min_screen_h; + } + + bool settings_changed = ((fullscreen != settings->fullscreen && destructive_fullscreen) || hwsurface != settings->hwsurface || vsync != settings->vsync || texture_filter != settings->texture_filter || @@ -629,5 +673,24 @@ } void SDLSoftwareRenderDevice::setBackgroundColor(Color color) { - background_color = SDL_MapRGBA(screen->format, color.r, color.g, color.b, color.a); -} + background_color = SDL_MapRGBA(screen->format, color.r, color.g, color.b, 255); +} + +void SDLSoftwareRenderDevice::setFullscreen(bool enable_fullscreen) { + if (!destructive_fullscreen) { + if (enable_fullscreen) { + SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP); + } + else { + SDL_SetWindowFullscreen(window, 0); + + // restore window to the default size + SDL_SetWindowMinimumSize(window, eset->resolutions.min_screen_w, eset->resolutions.min_screen_h); + SDL_SetWindowSize(window, eset->resolutions.min_screen_w, eset->resolutions.min_screen_h); + windowResize(); + // setting minimum size might move the window, so set position again + SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + } + windowResize(); + } +} diff --git a/src/SDLSoftwareRenderDevice.h b/src/SDLSoftwareRenderDevice.h index 7af9375..574d859 100644 --- a/src/SDLSoftwareRenderDevice.h +++ b/src/SDLSoftwareRenderDevice.h @@ -48,6 +48,7 @@ void fillWithColor(const Color& color); void drawPixel(int x, int y, const Color& color); + void drawLine(int x0, int y0, int x1, int y1, const Color& color); Image* resize(int width, int height); SDL_Surface *surface; @@ -74,6 +75,7 @@ void destroyContext(); void windowResize(); void setBackgroundColor(Color color); + void setFullscreen(bool enable_fullscreen); Image *createImage(int width, int height); void setGamma(float g); void resetGamma(); diff --git a/src/SDLSoundManager.cpp b/src/SDLSoundManager.cpp index ade4d3d..0196a46 100644 --- a/src/SDLSoundManager.cpp +++ b/src/SDLSoundManager.cpp @@ -83,8 +83,8 @@ while(it != playback.end()) { - /* if sound is finished add it to cleanup and continue with next */ - if (it->second.finished) { + /* if sound is finished and should be unloaded add it to cleanup and continue with next */ + if (it->second.finished && it->second.cleanup) { cleanup.push_back(it->first); ++it; continue; @@ -203,7 +203,7 @@ -void SDLSoundManager::play(SoundID sid, const std::string& channel, const FPoint& pos, bool loop) { +void SDLSoundManager::play(SoundID sid, const std::string& channel, const FPoint& pos, bool loop, bool cleanup) { SoundMapIterator it; VirtualChannelMapIterator vcit = channels.end(); @@ -226,13 +226,19 @@ p.virtual_channel = channel; p.loop = loop; p.finished = false; + p.cleanup = cleanup; if (p.virtual_channel != DEFAULT_CHANNEL) { - /* if playback exists, stop it befor playin next sound */ + /* if playback exists, stop it before playin next sound */ vcit = channels.find(p.virtual_channel); - if (vcit != channels.end()) + if (vcit != channels.end()) { + // temporarily disable the channel finish callback to avoid setting the 'finished' flag when stopping the channel + if (!cleanup) + Mix_ChannelFinished(NULL); + Mix_HaltChannel(vcit->second); + } vcit = channels.insert(std::pair<std::string, int>(p.virtual_channel, -1)).first; } @@ -263,6 +269,15 @@ playback.insert(std::pair<int, Playback>(c, p)); } +void SDLSoundManager::pauseChannel(const std::string& channel) { + VirtualChannelMapIterator vcit = channels.end(); + + vcit = channels.find(channel); + if (vcit != channels.end()) { + Mix_Pause(vcit->second); + } +} + void SDLSoundManager::pauseAll() { Mix_Pause(-1); Mix_PauseMusic(); @@ -347,12 +362,7 @@ } int SDLSoundManager::SetChannelPosition(int channel, Sint16 angle, Uint8 distance) { -#ifdef __EMSCRIPTEN__ - // TODO fix for Emscripten - return 0; -#else return Mix_SetPosition(channel, angle, distance); -#endif } SoundID SDLSoundManager::getLastPlayedSID() { diff --git a/src/SDLSoundManager.h b/src/SDLSoundManager.h index 6588351..95623a6 100644 --- a/src/SDLSoundManager.h +++ b/src/SDLSoundManager.h @@ -23,11 +23,7 @@ #ifndef SDL_SOUND_MANAGER_H #define SDL_SOUND_MANAGER_H -#ifdef __EMSCRIPTEN__ -#include <SDL/SDL_mixer.h> -#else #include <SDL_mixer.h> -#endif #include "SoundManager.h" @@ -38,7 +34,8 @@ SoundID load(const std::string& filename, const std::string& errormessage); void unload(SoundID); - void play(SoundID, const std::string& channel, const FPoint& pos, bool loop); + void play(SoundID, const std::string& channel, const FPoint& pos, bool loop, bool cleanup = true); + void pauseChannel(const std::string& channel); void pauseAll(); void resumeAll(); void setVolumeSFX(int value); diff --git a/src/SaveLoad.cpp b/src/SaveLoad.cpp index 9087470..1fcec90 100644 --- a/src/SaveLoad.cpp +++ b/src/SaveLoad.cpp @@ -86,7 +86,7 @@ std::stringstream ss; ss << settings->path_user << "saves/" << eset->misc.save_prefix << "/" << game_slot << "/avatar.txt"; - outfile.open(Filesystem::path(&ss).c_str(), std::ios::out); + outfile.open(Filesystem::convertSlashes(ss.str()).c_str(), std::ios::out); if (outfile.is_open()) { @@ -200,7 +200,9 @@ } } - outfile << "questlog_dismissed=" << !menu->act->requires_attention[MenuActionBar::MENU_LOG]; + outfile << "questlog_dismissed=" << !menu->act->requires_attention[MenuActionBar::MENU_LOG] << "\n"; + + outfile << "stash_tab=" << menu->stash->getTab(); outfile << std::endl; @@ -211,30 +213,35 @@ platform.FSCommit(); } - // Save stash - ss.str(""); - if (pc->stats.permadeath) - ss << settings->path_user << "saves/" << eset->misc.save_prefix << "/" << game_slot << "/stash_HC.txt"; - else - ss << settings->path_user << "saves/" << eset->misc.save_prefix << "/stash.txt"; - - outfile.open(Filesystem::path(&ss).c_str(), std::ios::out); - - if (outfile.is_open()) { - - // comment - outfile << "## flare-engine stash file ##" << "\n"; - - outfile << "quantity=" << menu->stash->stock.getQuantities() << "\n"; - outfile << "item=" << menu->stash->stock.getItems() << "\n"; - - outfile << std::endl; - - if (outfile.bad()) Utils::logError("SaveLoad: Unable to save stash. No write access or disk is full!"); - outfile.close(); - outfile.clear(); - - platform.FSCommit(); + // Save stashes + for (size_t i = 0; i < menu->stash->tabs.size(); ++i) { + // shared stashes are not saved for permadeath characters + if (pc->stats.permadeath && !menu->stash->tabs[i].is_private) + continue; + + ss.str(""); + ss << settings->path_user << "saves/" << eset->misc.save_prefix; + if (menu->stash->tabs[i].is_private) + ss << "/" << game_slot; + ss << "/" << menu->stash->tabs[i].filename; + outfile.open(Filesystem::convertSlashes(ss.str()).c_str(), std::ios::out); + + if (outfile.is_open()) { + + // comment + outfile << "# flare-engine stash file: \"" << menu->stash->tabs[i].id << "\"\n"; + + outfile << "quantity=" << menu->stash->tabs[i].stock.getQuantities() << "\n"; + outfile << "item=" << menu->stash->tabs[i].stock.getItems() << "\n"; + + outfile << std::endl; + + if (outfile.bad()) Utils::logError("SaveLoad: Unable to save stash. No write access or disk is full!"); + outfile.close(); + outfile.clear(); + + platform.FSCommit(); + } } settings->prev_save_slot = game_slot-1; @@ -253,15 +260,16 @@ int saved_hp = 0; int saved_mp = 0; int currency = 0; + size_t stash_tab = 0; Version save_version(VersionInfo::MIN); FileParser infile; - std::vector<int> hotkeys(MenuActionBar::SLOT_MAX, -1); + std::vector<PowerID> hotkeys(MenuActionBar::SLOT_MAX, -1); std::stringstream ss; ss << settings->path_user << "saves/" << eset->misc.save_prefix << "/" << game_slot << "/avatar.txt"; - if (infile.open(Filesystem::path(&ss), !FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { + if (infile.open(ss.str(), !FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { while (infile.next()) { if (infile.key == "name") pc->stats.name = infile.val; else if (infile.key == "permadeath") { @@ -327,20 +335,12 @@ else if (infile.key == "actionbar") { for (int i = 0; i < MenuActionBar::SLOT_MAX; i++) { hotkeys[i] = Parse::popFirstInt(infile.val); - if (hotkeys[i] < 0) { - Utils::logError("SaveLoad: Hotkey power on position %d has negative id, skipping", i); - hotkeys[i] = 0; - } - else if (static_cast<unsigned>(hotkeys[i]) > powers->powers.size()-1) { - Utils::logError("SaveLoad: Hotkey power id (%d) out of bounds 1-%d, skipping", hotkeys[i], static_cast<int>(powers->powers.size())); - hotkeys[i] = 0; - } - else if (hotkeys[i] != 0 && static_cast<unsigned>(hotkeys[i]) < powers->powers.size() && powers->powers[hotkeys[i]].name == "") { + if (hotkeys[i] != 0 && powers->powers[hotkeys[i]].is_empty) { Utils::logError("SaveLoad: Hotkey power with id=%d, found on position %d does not exist, skipping", hotkeys[i], i); hotkeys[i] = 0; } } - menu->act->set(hotkeys); + menu->act->set(hotkeys, !MenuActionBar::SET_SKIP_EMPTY); } else if (infile.key == "transformed") { pc->stats.transform_type = Parse::popFirstString(infile.val); @@ -374,6 +374,7 @@ } } else if (infile.key == "questlog_dismissed") pc->questlog_dismissed = Parse::toBool(infile.val); + else if (infile.key == "stash_tab") stash_tab = Parse::toInt(infile.val); } infile.close(); @@ -422,6 +423,11 @@ menu->chr->refreshStats(); loadPowerTree(); + + // disable the shared stash for permadeath characters + menu->stash->enableSharedTab(pc->stats.permadeath); + + menu->stash->setTab(stash_tab); } /** @@ -450,7 +456,7 @@ StatusID class_status = camp->registerStatus(eset->hero_classes.list[index].statuses[i]); camp->setStatus(class_status); } - menu->act->set(eset->hero_classes.list[index].hotkeys); + menu->act->set(eset->hero_classes.list[index].hotkeys, !MenuActionBar::SET_SKIP_EMPTY); // Add carried items std::string carried = eset->hero_classes.list[index].carried; @@ -477,25 +483,33 @@ // Load stash FileParser infile; std::stringstream ss; - if (pc->stats.permadeath) - ss << settings->path_user << "saves/" << eset->misc.save_prefix << "/" << game_slot << "/stash_HC.txt"; - else - ss << settings->path_user << "saves/" << eset->misc.save_prefix << "/stash.txt"; - - if (infile.open(Filesystem::path(&ss), !FileParser::MOD_FILE, FileParser::ERROR_NONE)) { - while (infile.next()) { - if (infile.key == "item") { - menu->stash->stock.setItems(infile.val); - } - else if (infile.key == "quantity") { - menu->stash->stock.setQuantities(infile.val); - } - } - infile.close(); - } - else Utils::logInfo("SaveLoad: Could not open stash file '%s'. This may be because it hasn't been created yet.", ss.str().c_str()); - - menu->stash->stock.clean(); + + for (size_t i = 0; i < menu->stash->tabs.size(); ++i) { + // shared stashes are not loaded for permadeath characters + if (pc->stats.permadeath && !menu->stash->tabs[i].is_private) + continue; + + ss.str(""); + ss << settings->path_user << "saves/" << eset->misc.save_prefix; + if (menu->stash->tabs[i].is_private) + ss << "/" << game_slot; + ss << "/" << menu->stash->tabs[i].filename; + + if (infile.open(ss.str(), !FileParser::MOD_FILE, FileParser::ERROR_NONE)) { + while (infile.next()) { + if (infile.key == "item") { + menu->stash->tabs[i].stock.setItems(infile.val); + } + else if (infile.key == "quantity") { + menu->stash->tabs[i].stock.setQuantities(infile.val); + } + } + infile.close(); + } + else Utils::logInfo("SaveLoad: Could not open stash file '%s'. This may be because it hasn't been created yet.", ss.str().c_str()); + + menu->stash->tabs[i].stock.clean(); + } } /** diff --git a/src/Settings.cpp b/src/Settings.cpp index 3550ee0..9066619 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -59,43 +59,50 @@ , show_hud(true) , encounter_dist(0) // set in updateScreenVars() , soft_reset(false) + , safe_video(false) { - config.resize(35); - setConfigDefault(0, "fullscreen", &typeid(fullscreen), "0", &fullscreen, "fullscreen mode. 1 enable, 0 disable."); - setConfigDefault(1, "resolution_w", &typeid(screen_w), "640", &screen_w, "display resolution. 640x480 minimum."); - setConfigDefault(2, "resolution_h", &typeid(screen_h), "480", &screen_h, ""); - setConfigDefault(3, "music_volume", &typeid(music_volume), "96", &music_volume, "music and sound volume (0 = silent, 128 = max)"); - setConfigDefault(4, "sound_volume", &typeid(sound_volume), "128", &sound_volume, ""); - setConfigDefault(5, "combat_text", &typeid(combat_text), "1", &combat_text, "display floating damage text. 1 enable, 0 disable."); - setConfigDefault(6, "mouse_move", &typeid(mouse_move), "0", &mouse_move, "use mouse to move (experimental). 1 enable, 0 disable."); - setConfigDefault(7, "hwsurface", &typeid(hwsurface), "1", &hwsurface, "hardware surfaces, v-sync. Try disabling for performance. 1 enable, 0 disable."); - setConfigDefault(8, "vsync", &typeid(vsync), "1", &vsync, ""); - setConfigDefault(9, "texture_filter", &typeid(texture_filter), "1", &texture_filter, "texture filter quality. 0 nearest neighbor (worst), 1 linear (best)"); - setConfigDefault(10, "dpi_scaling", &typeid(dpi_scaling), "0", &dpi_scaling, "toggle DPI-based render scaling. 1 enable, 0 disable"); - setConfigDefault(11, "parallax_layers", &typeid(parallax_layers), "1", ¶llax_layers, "toggle rendering of parallax map layers. 1 enable, 0 disable"); - setConfigDefault(12, "max_fps", &typeid(max_frames_per_sec), "60", &max_frames_per_sec, "maximum frames per second. default is 60"); - setConfigDefault(13, "renderer", &typeid(render_device_name), "sdl_hardware", &render_device_name, "default render device. 'sdl' is the default setting"); - setConfigDefault(14, "enable_joystick", &typeid(enable_joystick), "0", &enable_joystick, "joystick settings."); - setConfigDefault(15, "joystick_device", &typeid(joystick_device), "0", &joystick_device, ""); - setConfigDefault(16, "joystick_deadzone", &typeid(joy_deadzone), "100", &joy_deadzone, ""); - setConfigDefault(17, "language", &typeid(language), "en", &language, "2-letter language code."); - setConfigDefault(18, "change_gamma", &typeid(change_gamma), "0", &change_gamma, "allow changing gamma (experimental). 1 enable, 0 disable."); - setConfigDefault(19, "gamma", &typeid(gamma), "1.0", &gamma, "screen gamma (0.5 = darkest, 2.0 = lightest)"); - setConfigDefault(20, "mouse_aim", &typeid(mouse_aim), "1", &mouse_aim, "use mouse to aim. 1 enable, 0 disable."); - setConfigDefault(21, "no_mouse", &typeid(no_mouse), "0", &no_mouse, "make using mouse secondary, give full control to keyboard. 1 enable, 0 disable."); - setConfigDefault(22, "show_fps", &typeid(show_fps), "0", &show_fps, "show frames per second. 1 enable, 0 disable."); - setConfigDefault(23, "colorblind", &typeid(colorblind), "0", &colorblind, "enable colorblind tooltips. 1 enable, 0 disable"); - setConfigDefault(24, "hardware_cursor", &typeid(hardware_cursor), "0", &hardware_cursor, "use the system mouse cursor. 1 enable, 0 disable"); - setConfigDefault(25, "dev_mode", &typeid(dev_mode), "0", &dev_mode, "allow opening the developer console. 1 enable, 0 disable"); - setConfigDefault(26, "dev_hud", &typeid(dev_hud), "1", &dev_hud, "shows some additional information on-screen when developer mode is enabled. 1 enable, 0 disable"); - setConfigDefault(27, "loot_tooltips", &typeid(loot_tooltips), "0", &loot_tooltips, "loot tooltip mode. 0 normal, 1 show all, 2 hide all"); - setConfigDefault(28, "statbar_labels", &typeid(statbar_labels), "0", &statbar_labels, "always show labels on HP/MP/XP bars. 1 enable, 0 disable"); - setConfigDefault(29, "auto_equip", &typeid(auto_equip), "1", &auto_equip, "automatically equip items. 1 enable, 0 disable"); - setConfigDefault(30, "subtitles", &typeid(subtitles), "0", &subtitles, "displays subtitles. 1 enable, 0 disable"); - setConfigDefault(31, "minimap_mode", &typeid(minimap_mode), "0", &minimap_mode, "mini-map display mode. 0 is normal, 1 is 2x zoom, 2 is hidden"); - setConfigDefault(32, "mouse_move_swap", &typeid(mouse_move_swap), "0", &mouse_move_swap, "use 'Main2' as the movement action when using mouse movement. 1 enable, 0 disable."); - setConfigDefault(33, "mouse_move_attack", &typeid(mouse_move_attack), "1", &mouse_move_attack, "allows attacking with the mouse movement button if an enemy is targeted and in range. 1 enable, 0 disable."); - setConfigDefault(34, "prev_save_slot", &typeid(prev_save_slot), "-1", &prev_save_slot, "index of the last used save slot"); + config.resize(41); + setConfigDefault(0, "move_type_dimissed", &typeid(move_type_dimissed), "0", &move_type_dimissed, "One time flag for initial movement type dialog | 0 = show dialog, 1 = no dialog"); + setConfigDefault(1, "fullscreen", &typeid(fullscreen), "0", &fullscreen, "Fullscreen mode | 0 = disable, 1 = enable"); + setConfigDefault(2, "resolution_w", &typeid(screen_w), "640", &screen_w, "Window size"); + setConfigDefault(3, "resolution_h", &typeid(screen_h), "480", &screen_h, ""); + setConfigDefault(4, "music_volume", &typeid(music_volume), "96", &music_volume, "Music and sound volume | 0 = silent, 128 = maximum"); + setConfigDefault(5, "sound_volume", &typeid(sound_volume), "128", &sound_volume, ""); + setConfigDefault(6, "combat_text", &typeid(combat_text), "1", &combat_text, "Display floating damage text | 0 = disable, 1 = enable"); + setConfigDefault(7, "mouse_move", &typeid(mouse_move), "0", &mouse_move, "Use mouse to move | 0 = disable, 1 = enable"); + setConfigDefault(8, "hwsurface", &typeid(hwsurface), "1", &hwsurface, "Hardware surfaces & V-sync. Try disabling for performance. | 0 = disable, 1 = enable"); + setConfigDefault(9, "vsync", &typeid(vsync), "1", &vsync, ""); + setConfigDefault(10, "texture_filter", &typeid(texture_filter), "1", &texture_filter, "Texture filter quality | 0 = nearest neighbor (worst), 1 = linear (best)"); + setConfigDefault(11, "dpi_scaling", &typeid(dpi_scaling), "0", &dpi_scaling, "DPI-based render scaling | 0 = disable, 1 = enable"); + setConfigDefault(12, "parallax_layers", &typeid(parallax_layers), "1", ¶llax_layers, "Rendering of parallax map layers | 0 = disable, 1 = enable"); + setConfigDefault(13, "max_fps", &typeid(max_frames_per_sec), "60", &max_frames_per_sec, "Maximum frames per second | 60 = default"); + setConfigDefault(14, "renderer", &typeid(render_device_name), "sdl_hardware", &render_device_name, "Default render device. | sdl_hardware = default, Try sdl for compatibility"); + setConfigDefault(15, "enable_joystick", &typeid(enable_joystick), "0", &enable_joystick, "Joystick settings."); + setConfigDefault(16, "joystick_device", &typeid(joystick_device), "-1", &joystick_device, ""); + setConfigDefault(17, "joystick_deadzone", &typeid(joy_deadzone), "100", &joy_deadzone, ""); + setConfigDefault(18, "language", &typeid(language), "en", &language, "2-letter language code."); + setConfigDefault(19, "change_gamma", &typeid(change_gamma), "0", &change_gamma, "Allow changing screen gamma (experimental) | 0 = disable, 1 = enable"); + setConfigDefault(20, "gamma", &typeid(gamma), "1.0", &gamma, "Screen gamma. Requires change_gamma=1 | 0.5 = darkest, 2.0 = lightest"); + setConfigDefault(21, "mouse_aim", &typeid(mouse_aim), "1", &mouse_aim, "Use mouse to aim | 0 = disable, 1 = enable"); + setConfigDefault(22, "no_mouse", &typeid(no_mouse), "0", &no_mouse, "Make using mouse secondary, give full control to keyboard | 0 = disable, 1 = enable"); + setConfigDefault(23, "show_fps", &typeid(show_fps), "0", &show_fps, "Show frames per second | 0 = disable, 1 = enable"); + setConfigDefault(24, "colorblind", &typeid(colorblind), "0", &colorblind, "Enable colorblind help text | 0 = disable, 1 = enable"); + setConfigDefault(25, "hardware_cursor", &typeid(hardware_cursor), "0", &hardware_cursor, "Use the system mouse cursor | 0 = disable, 1 = enable"); + setConfigDefault(26, "dev_mode", &typeid(dev_mode), "0", &dev_mode, "Developer mode | 0 = disable, 1 = enable"); + setConfigDefault(27, "dev_hud", &typeid(dev_hud), "1", &dev_hud, "Show additional information on-screen when dev_mode=1 | 0 = disable, 1 = enable"); + setConfigDefault(28, "loot_tooltips", &typeid(loot_tooltips), "0", &loot_tooltips, "Loot tooltip mode | 0 = normal, 1 = show all, 2 = hide all"); + setConfigDefault(29, "statbar_labels", &typeid(statbar_labels), "0", &statbar_labels, "Always show labels on HP/MP/XP bars | 0 = disable, 1 = enable"); + setConfigDefault(30, "statbar_autohide", &typeid(statbar_autohide), "1", &statbar_autohide, "Allow the HP/MP/XP bars to auto-hide on inactivity | 0 = disable, 1 = enable"); + setConfigDefault(31, "auto_equip", &typeid(auto_equip), "1", &auto_equip, "Automatically equip items | 0 = enable, 1 = enable"); + setConfigDefault(32, "subtitles", &typeid(subtitles), "0", &subtitles, "Subtitles | 0 = disable, 1 = enable"); + setConfigDefault(33, "minimap_mode", &typeid(minimap_mode), "0", &minimap_mode, "Mini-map display mode | 0 = normal, 1 = 2x zoom, 2 = hidden"); + setConfigDefault(34, "mouse_move_swap", &typeid(mouse_move_swap), "0", &mouse_move_swap, "Use 'Main2' as the movement action when mouse_move=1 | 0 = disable, 1 = enable"); + setConfigDefault(35, "mouse_move_attack", &typeid(mouse_move_attack), "1", &mouse_move_attack, "Allow attacking with the mouse movement button if an enemy is targeted and in range | 0 = disable, 1 = enable"); + setConfigDefault(36, "entity_markers", &typeid(entity_markers), "1", &entity_markers, "Shows a marker above entities that are hidden behind tall tiles | 0 = disable, 1 = enable"); + setConfigDefault(37, "prev_save_slot", &typeid(prev_save_slot), "-1", &prev_save_slot, "Index of the last used save slot"); + setConfigDefault(38, "low_hp_warning_type", &typeid(low_hp_warning_type), "1", &low_hp_warning_type, "Low health warning type settings | 0 = disable, 1 = all, 2 = message & cursor, 3 = message & sound, 4 = cursor & sound , 5 = message, 6 = cursor, 7 = sound"); + setConfigDefault(39, "low_hp_threshold", &typeid(low_hp_threshold), "20", &low_hp_threshold, "Low HP warning threshold percentage"); + setConfigDefault(40, "item_compare_tips", &typeid(item_compare_tips), "1", &item_compare_tips, "Show comparison tooltips for equipped items of the same type | 0 = disable, 1 = enable"); } void Settings::setConfigDefault(size_t index, const std::string& name, const std::type_info *type, const std::string& default_val, void *storage, const std::string& comment) { @@ -128,25 +135,35 @@ } // try read from file + bool found_settings = false; + FileParser infile; - if (!infile.open(settings->path_conf + "settings.txt", !FileParser::MOD_FILE, FileParser::ERROR_NONE)) { - loadMobileDefaults(); - if (!infile.open("engine/default_settings.txt", FileParser::MOD_FILE, FileParser::ERROR_NONE)) { - saveSettings(); - return; + if (infile.open(settings->path_conf + "settings.txt", !FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { + found_settings = true; + } + else if (infile.open("engine/default_settings.txt", FileParser::MOD_FILE, FileParser::ERROR_NORMAL)) { + found_settings = true; + } + + if (!found_settings) { + saveSettings(); + } + else { + while (infile.next()) { + size_t entry = getConfigEntry(infile.key); + if (entry != config.size()) { + Parse::tryParseValue(*config[entry].type, infile.val, config[entry].storage); + } } - else saveSettings(); - } - - while (infile.next()) { - size_t entry = getConfigEntry(infile.key); - if (entry != config.size()) { - Parse::tryParseValue(*config[entry].type, infile.val, config[entry].storage); - } - } - infile.close(); + infile.close(); + } loadMobileDefaults(); + + // Force using the software renderer if safe mode is enabled + if (safe_video) { + render_device_name = "sdl"; + } } /** @@ -185,8 +202,8 @@ * Load all default settings, except video settings. */ void Settings::loadDefaults() { - // HACK init defaults except video - for (size_t i = 3; i < config.size(); i++) { + // HACK init defaults except video and one-time flags + for (size_t i = 4; i < config.size(); i++) { Parse::tryParseValue(*config[i].type, config[i].default_val, config[i].storage); } diff --git a/src/Settings.h b/src/Settings.h index 6904f48..734e4bd 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -43,6 +43,17 @@ MINIMAP_HIDDEN = 2 }; + enum { + LHP_WARN_NONE = 0, + LHP_WARN_ALL = 1, + LHP_WARN_TEXT_CURSOR = 2, + LHP_WARN_TEXT_SOUND = 3, + LHP_WARN_CURSOR_SOUND = 4, + LHP_WARN_TEXT = 5, + LHP_WARN_CURSOR = 6, + LHP_WARN_SOUND = 7 + }; + Settings(); void loadSettings(); void saveSettings(); @@ -86,15 +97,21 @@ bool dev_hud; int loot_tooltips; bool statbar_labels; + bool statbar_autohide; bool auto_equip; bool subtitles; int minimap_mode; + bool entity_markers; + int low_hp_warning_type; + int low_hp_threshold; + bool item_compare_tips; // Language Settings std::string language; // Misc int prev_save_slot; + bool move_type_dimissed; /** * NOTE Everything below is not part of the user's settings.txt, but somehow ended up here @@ -129,6 +146,8 @@ bool soft_reset; + bool safe_video; + private: class ConfigEntry { public: diff --git a/src/SharedGameResources.cpp b/src/SharedGameResources.cpp index 07f0f58..ed6e9b5 100644 --- a/src/SharedGameResources.cpp +++ b/src/SharedGameResources.cpp @@ -19,10 +19,12 @@ #include "Avatar.h" #include "CampaignManager.h" #include "EnemyGroupManager.h" +#include "EntityManager.h" #include "HazardManager.h" #include "LootManager.h" #include "MenuActionBar.h" #include "MenuPowers.h" +#include "NPCManager.h" #include "PowerManager.h" #include "SharedGameResources.h" @@ -30,11 +32,12 @@ MenuManager *menu = NULL; CampaignManager *camp = NULL; EnemyGroupManager *enemyg = NULL; -EnemyManager *enemym = NULL; +EntityManager *entitym = NULL; HazardManager *hazards = NULL; ItemManager *items = NULL; LootManager *loot = NULL; MapRenderer *mapr = NULL; MenuActionBar *menu_act= NULL; MenuPowers *menu_powers = NULL; +NPCManager *npcs = NULL; PowerManager *powers = NULL; diff --git a/src/SharedGameResources.h b/src/SharedGameResources.h index bbfabe0..1ca8c4c 100644 --- a/src/SharedGameResources.h +++ b/src/SharedGameResources.h @@ -22,7 +22,7 @@ class Avatar; class CampaignManager; class EnemyGroupManager; -class EnemyManager; +class EntityManager; class HazardManager; class ItemManager; class LootManager; @@ -30,6 +30,7 @@ class MenuActionBar; class MenuManager; class MenuPowers; +class NPCManager; class PowerManager; /* These objects are created in the GameStatePlay constructor and deleted in the GameStatePlay destructor @@ -38,7 +39,7 @@ extern Avatar *pc; extern CampaignManager *camp; extern EnemyGroupManager *enemyg; -extern EnemyManager *enemym; +extern EntityManager *entitym; extern HazardManager *hazards; extern ItemManager *items; extern LootManager *loot; @@ -46,6 +47,7 @@ extern MenuActionBar *menu_act; extern MenuManager *menu; extern MenuPowers *menu_powers; +extern NPCManager *npcs; extern PowerManager *powers; #endif // SHAREDGAMEOBJECTS_H diff --git a/src/SoundManager.h b/src/SoundManager.h index 125bf1c..a13aca9 100644 --- a/src/SoundManager.h +++ b/src/SoundManager.h @@ -35,12 +35,14 @@ static const std::string DEFAULT_CHANNEL; static const FPoint NO_POS; static const bool LOOP = true; + static const bool CLEANUP = true; virtual ~SoundManager() {}; virtual SoundID load(const std::string& filename, const std::string& errormessage) = 0; virtual void unload(SoundID) = 0; - virtual void play(SoundID, const std::string& channel, const FPoint& pos, bool loop) = 0; + virtual void play(SoundID, const std::string& channel, const FPoint& pos, bool loop, bool cleanup = true) = 0; + virtual void pauseChannel(const std::string& channel) = 0; virtual void pauseAll() = 0; virtual void resumeAll() = 0; virtual void setVolumeSFX(int value) = 0; @@ -72,7 +74,8 @@ , location(FPoint()) , loop(false) , paused(false) - , finished(false) { + , finished(false) + , cleanup(true) { } SoundID sid; @@ -81,6 +84,7 @@ bool loop; bool paused; bool finished; + bool cleanup; }; #endif diff --git a/src/StatBlock.cpp b/src/StatBlock.cpp index 23d7f05..d1feecb 100644 --- a/src/StatBlock.cpp +++ b/src/StatBlock.cpp @@ -28,8 +28,8 @@ #include "Avatar.h" #include "CampaignManager.h" #include "CombatText.h" -#include "Enemy.h" -#include "EnemyManager.h" +#include "Entity.h" +#include "EntityManager.h" #include "EngineSettings.h" #include "FileParser.h" #include "Hazard.h" @@ -47,6 +47,15 @@ #include "UtilsParsing.h" #include <limits> + +#include <math.h> +#ifndef M_SQRT2 +#define M_SQRT2 sqrt(2.0) +#endif + +const float StatBlock::DIRECTION_DELTA_X[8] = {-1, -1, -1, 0, 1, 1, 1, 0}; +const float StatBlock::DIRECTION_DELTA_Y[8] = { 1, 0, -1, -1, -1, 0, 1, 1}; +const float StatBlock::SPEED_MULTIPLIER[8] = { static_cast<float>(1.0/M_SQRT2), 1.0f, static_cast<float>(1.0/M_SQRT2), 1.0f, static_cast<float>(1.0/M_SQRT2), 1.0f, static_cast<float>(1.0/M_SQRT2), 1.0f}; StatBlock::StatBlock() : statsLoaded(false) @@ -115,7 +124,7 @@ , direction(0) , cooldown_hit() , cooldown_hit_enabled(false) - , cur_state(0) + , cur_state(ENTITY_STANCE) , state_timer() , hold_state(false) , prevent_interrupt(false) @@ -167,6 +176,8 @@ , sfx_critdie() , sfx_block() , sfx_levelup("") + , sfx_lowhp("") + , sfx_lowhp_loop(false) , max_spendable_stat_points(0) , max_points_per_stat(0) , prev_maxhp(0) @@ -175,7 +186,7 @@ , prev_mp(0) , summons() , summoner(NULL) - , bleed_source_type(-1) + , abort_npc_interact(false) { primary.resize(eset->primary_stats.list.size(), 0); primary_starting.resize(eset->primary_stats.list.size(), 0); @@ -185,6 +196,14 @@ for (size_t i = 0; i < per_primary.size(); ++i) { per_primary[i].resize(Stats::COUNT + eset->damage_types.count, 0); } + + cooldown.reset(Timer::END); +} + +StatBlock::~StatBlock() { + removeFromSummons(); + if (loot) + loot->removeFromEnemiesDroppingLoot(this); } bool StatBlock::loadCoreStat(FileParser *infile) { @@ -299,9 +318,23 @@ // @ATTR power_filter|list(power_id)|Only these powers are allowed to hit this entity. std::string power_id = Parse::popFirstString(infile->val); while (!power_id.empty()) { - power_filter.push_back(Parse::toInt(power_id)); + power_filter.push_back(Parse::toPowerID(power_id)); power_id = Parse::popFirstString(infile->val); } + return true; + } + else if (infile->key == "categories") { + // @ATTR categories|list(string)|Categories that this entity belongs to. + categories.clear(); + std::string cat; + while ((cat = Parse::popFirstString(infile->val)) != "") { + categories.push_back(cat); + } + return true; + } + else if (infile->key == "melee_range") { + // @ATTR melee_range|float|Determines the distance from the caster that some powers will be placed. For AI entities, it also means the minimum distance from target required to use melee powers. + melee_range = Parse::toFloat(infile->val); return true; } @@ -374,11 +407,40 @@ // @ATTR sfx_levelup|filename|Filename of sound effect for leveling up. sfx_levelup = infile->val; } + else if (infile->key == "sfx_lowhp") { + // @ATTR sfx_lowhp|filename, bool: Sound file, loop|Filename of sound effect for low health warning. Optionally, it can be looped. + sfx_lowhp = Parse::popFirstString(infile->val); + if (infile->val != "") sfx_lowhp_loop = Parse::toBool(infile->val); + } else { return false; } return true; +} + +bool StatBlock::isNPCStat(FileParser *infile) { + if (infile->section == "npc") return true; + else if (infile->section == "dialog") return true; + + if (infile->key == "gfx") { + infile->error("StatBlock: Warning! 'gfx' is deprecated. Use 'animations' instead."); + animations = infile->val; + return true; + } + else if (infile->key == "direction") return true; + else if (infile->key == "talker") return true; + else if (infile->key == "portrait") return true; + else if (infile->key == "vendor") return true; + else if (infile->key == "vendor_requires_status") return true; + else if (infile->key == "vendor_requires_not_status") return true; + else if (infile->key == "constant_stock") return true; + else if (infile->key == "status_stock") return true; + else if (infile->key == "random_stock") return true; + else if (infile->key == "random_stock_count") return true; + else if (infile->key == "vox_intro") return true; + + return false; } /** @@ -401,7 +463,7 @@ int num = Parse::toInt(infile.val); float fnum = Parse::toFloat(infile.val); - bool valid = loadCoreStat(&infile) || loadSfxStat(&infile); + bool valid = loadCoreStat(&infile) || loadSfxStat(&infile) || isNPCStat(&infile); // @ATTR name|string|Name if (infile.key == "name") name = msg->get(infile.val); @@ -446,12 +508,12 @@ // @ATTR convert_status|string|Campaign status to set upon being converted to a player ally. else if (infile.key == "convert_status") convert_status = camp->registerStatus(infile.val); // @ATTR first_defeat_loot|item_id|Drops this item upon first death. - else if (infile.key == "first_defeat_loot") first_defeat_loot = num; + else if (infile.key == "first_defeat_loot") first_defeat_loot = Parse::toItemID(infile.val); // @ATTR quest_loot|string, string, item_id : Required status, Required not status, Item|Drops this item when campaign status is met. else if (infile.key == "quest_loot") { quest_loot_requires_status = camp->registerStatus(Parse::popFirstString(infile.val)); quest_loot_requires_not_status = camp->registerStatus(Parse::popFirstString(infile.val)); - quest_loot_id = Parse::popFirstInt(infile.val); + quest_loot_id = Parse::toItemID(Parse::popFirstString(infile.val)); } // behavior stats @@ -478,7 +540,7 @@ std::string ai_type = Parse::popFirstString(infile.val); - ai_power.id = powers->verifyID(Parse::popFirstInt(infile.val), &infile, !PowerManager::ALLOW_ZERO_ID); + ai_power.id = powers->verifyID(Parse::toPowerID(Parse::popFirstString(infile.val)), &infile, !PowerManager::ALLOW_ZERO_ID); if (ai_power.id == 0) continue; // verifyID() will print our error message @@ -508,11 +570,11 @@ powers_passive.clear(); std::string p = Parse::popFirstString(infile.val); while (p != "") { - powers_passive.push_back(Parse::toInt(p)); + powers_passive.push_back(Parse::toPowerID(p)); p = Parse::popFirstString(infile.val); // if a passive power has a post power, add it to the AI power list so we can track its cooldown - int post_power = powers->powers[powers_passive.back()].post_power; + PowerID post_power = powers->powers[powers_passive.back()].post_power; if (post_power > 0) { AIPower passive_post_power; passive_post_power.type = AI_POWER_PASSIVE_POST; @@ -523,8 +585,6 @@ } } - // @ATTR melee_range|float|Minimum distance from target required to use melee powers. - else if (infile.key == "melee_range") melee_range = fnum; // @ATTR threat_range|float, float: Engage distance, Stop distance|The first value is the radius of the area this creature will be able to start chasing the hero. The second, optional, value is the radius at which this creature will stop pursuing their target and defaults to double the first value. else if (infile.key == "threat_range") { threat_range = Parse::toFloat(Parse::popFirstString(infile.val)); @@ -554,15 +614,6 @@ // @ATTR suppress_hp|bool|Hides the enemy HP bar for this creature. else if (infile.key == "suppress_hp") suppress_hp = Parse::toBool(infile.val); - else if (infile.key == "categories") { - // @ATTR categories|list(string)|Categories that this enemy belongs to. - categories.clear(); - std::string cat; - while ((cat = Parse::popFirstString(infile.val)) != "") { - categories.push_back(cat); - } - } - // @ATTR flee_duration|duration|The minimum amount of time that this creature will flee. They may flee longer than the specified time. else if (infile.key == "flee_duration") flee_timer.setDuration(Parse::toDuration(infile.val)); // @ATTR flee_cooldown|duration|The amount of time this creature must wait before they can start fleeing again. @@ -590,10 +641,62 @@ /** * Reduce temphp first, then hp */ -void StatBlock::takeDamage(int dmg) { +void StatBlock::takeDamage(int dmg, bool crit, int source_type) { hp -= effects.damageShields(dmg); if (hp <= 0) { hp = 0; + + effects.triggered_death = true; + // TODO should effects.clearEffects() be here as well? + // what about other things that happen in the "dead" entity states? + + if (hero) { + cur_state = StatBlock::ENTITY_DEAD; + } + else { + // enemy died; do rewards + if (!hero_ally || converted) { + // some creatures create special loot if we're on a quest + if (quest_loot_requires_status != 0) { + // the loot manager will check quest_loot_id + // if set (not zero), the loot manager will 100% generate that loot. + if (!(camp->checkStatus(quest_loot_requires_status) && !camp->checkStatus(quest_loot_requires_not_status))) { + quest_loot_id = 0; + } + } + + // some creatures drop special loot the first time they are defeated + // this must be done in conjunction with defeat status + if (first_defeat_loot > 0) { + if (!camp->checkStatus(defeat_status)) { + quest_loot_id = first_defeat_loot; + } + } + + // defeating some creatures (e.g. bosses) affects the story + if (defeat_status != 0) { + camp->setStatus(defeat_status); + } + + // reward XP; adjust for party exp if necessary + float xp_multiplier = 1; + if (source_type == Power::SOURCE_TYPE_ALLY) + xp_multiplier = static_cast<float>(eset->misc.party_exp_percentage) / 100.0f; + + camp->rewardXP(static_cast<int>((static_cast<float>(xp) * xp_multiplier)), !CampaignManager::XP_SHOW_MSG); + + // drop loot + loot->addEnemyLoot(this); + } + + if (crit) + cur_state = StatBlock::ENTITY_CRITDEAD; + else + cur_state = StatBlock::ENTITY_DEAD; + + mapr->collider.unblock(pos.x, pos.y); + } + } } @@ -632,13 +735,22 @@ */ void StatBlock::calcBase() { // bonuses are skipped for the default level 1 of a stat - int lev0 = std::max(level - 1, 0); - - for (size_t i = 0; i < Stats::COUNT + eset->damage_types.count; ++i) { - base[i] = starting[i]; - base[i] += lev0 * per_level[i]; + const int lev0 = std::max(level - 1, 0); + + if (per_primary.empty()) { + for (size_t i = 0; i < Stats::COUNT + eset->damage_types.count; ++i) { + base[i] = starting[i] + (lev0 * per_level[i]); + } + } + else { for (size_t j = 0; j < per_primary.size(); ++j) { - base[i] += std::max(get_primary(j) - 1, 0) * per_primary[j][i]; + const int current_primary = std::max(get_primary(j) - 1, 0); + const std::vector<int>& per_primary_vec = per_primary[j]; + for (size_t i = 0; i < Stats::COUNT + eset->damage_types.count; ++i) { + if (j==0) + base[i] = starting[i] + (lev0 * per_level[i]); + base[i] += (current_primary * per_primary_vec[i]); + } } } @@ -661,7 +773,6 @@ * Recalc derived stats from base stats + effect bonuses */ void StatBlock::applyEffects() { - // preserve hp/mp states // max HP and MP can't drop below 1 prev_maxhp = std::max(get(Stats::HP_MAX), 1); @@ -680,11 +791,11 @@ calcBase(); - for (size_t i=0; i<Stats::COUNT + eset->damage_types.count; i++) { + for (size_t i = 0; i < Stats::COUNT + eset->damage_types.count; ++i) { current[i] = base[i] + effects.bonus[i]; } - for (unsigned i=0; i<effects.bonus_resist.size(); i++) { + for (size_t i = 0; i < effects.bonus_resist.size(); ++i) { vulnerable[i] = vulnerable_base[i] - effects.bonus_resist[i]; } @@ -708,18 +819,19 @@ alive = !(hp <= 0 && !effects.triggered_death && !effects.revive); // handle party buffs - if (enemym && powers) { + if (entitym && powers) { while (!party_buffs.empty()) { - int power_index = party_buffs.front(); + PowerID power_index = party_buffs.front(); party_buffs.pop(); Power *buff_power = &powers->powers[power_index]; - for (size_t i=0; i < enemym->enemies.size(); ++i) { - if(enemym->enemies[i]->stats.hp > 0 && - ((enemym->enemies[i]->stats.hero_ally && hero) || (enemym->enemies[i]->stats.enemy_ally && enemym->enemies[i]->stats.summoner == this)) && - (buff_power->buff_party_power_id == 0 || buff_power->buff_party_power_id == enemym->enemies[i]->stats.summoned_power_index) + for (size_t i=0; i < entitym->entities.size(); ++i) { + Entity* party_member = entitym->entities[i]; + if(party_member->stats.hp > 0 && + ((party_member->stats.hero_ally && hero) || (party_member->stats.enemy_ally && party_member->stats.summoner == this)) && + (buff_power->buff_party_power_id == 0 || buff_power->buff_party_power_id == party_member->stats.summoned_power_index) ) { - powers->effect(&enemym->enemies[i]->stats, this, power_index, (hero ? Power::SOURCE_TYPE_HERO : Power::SOURCE_TYPE_ENEMY)); + powers->effect(&(party_member->stats), this, power_index, (hero ? Power::SOURCE_TYPE_HERO : Power::SOURCE_TYPE_ENEMY)); } } } @@ -778,17 +890,17 @@ // apply bleed if (effects.damage > 0 && hp > 0) { - takeDamage(effects.damage); + takeDamage(effects.damage, !StatBlock::TAKE_DMG_CRIT, effects.getDamageSourceType(Effect::DAMAGE)); comb->addInt(effects.damage, pos, CombatText::MSG_TAKEDMG); } if (effects.damage_percent > 0 && hp > 0) { int damage = (get(Stats::HP_MAX)*effects.damage_percent)/100; - takeDamage(damage); + takeDamage(damage, !StatBlock::TAKE_DMG_CRIT, effects.getDamageSourceType(Effect::DAMAGE_PERCENT)); comb->addInt(damage, pos, CombatText::MSG_TAKEDMG); } if(effects.death_sentence) - hp = 0; + takeDamage(get(Stats::HP_MAX), !StatBlock::TAKE_DMG_CRIT, Power::SOURCE_TYPE_NEUTRAL); cooldown_hit.tick(); @@ -843,9 +955,9 @@ mapr->collider.block(pos.x, pos.y, hero_ally); } else if (charge_speed != 0.0f) { - float tmp_speed = charge_speed * speedMultiplyer[direction]; - float dx = tmp_speed * static_cast<float>(directionDeltaX[direction]); - float dy = tmp_speed * static_cast<float>(directionDeltaY[direction]); + float tmp_speed = charge_speed * SPEED_MULTIPLIER[direction]; + float dx = tmp_speed * DIRECTION_DELTA_X[direction]; + float dy = tmp_speed * DIRECTION_DELTA_Y[direction]; mapr->collider.unblock(pos.x, pos.y); mapr->collider.move(pos.x, pos.y, dx, dy, movement_type, mapr->collider.getCollideType(hero)); @@ -869,34 +981,20 @@ hp = get(Stats::HP_MAX); alive = true; corpse = false; - if (hero) - cur_state = AVATAR_STANCE; - else - cur_state = ENEMY_STANCE; - } - - // check for bleeding to death - if (hp <= 0 && !hero && cur_state != ENEMY_DEAD && cur_state != ENEMY_CRITDEAD) { - for (size_t i = 0; i < effects.effect_list.size(); ++i) { - if (effects.effect_list[i].type == Effect::DAMAGE || effects.effect_list[i].type == Effect::DAMAGE_PERCENT) { - bleed_source_type = effects.effect_list[i].source_type; - break; - } - } - effects.triggered_death = true; - cur_state = ENEMY_DEAD; - } - else if (hp <= 0 && hero && cur_state != AVATAR_DEAD) { - effects.triggered_death = true; - cur_state = AVATAR_DEAD; - } -} - -StatBlock::~StatBlock() { - removeFromSummons(); -} - -bool StatBlock::canUsePower(int powerid, bool allow_passive) const { + cur_state = ENTITY_STANCE; + } + + // non-hero entities can have their disposition reversed + if (!hero && effects.convert != converted) { + converted = !converted; + hero_ally = !hero_ally; + if (convert_status != 0) { + camp->setStatus(convert_status); + } + } +} + +bool StatBlock::canUsePower(PowerID powerid, bool allow_passive) const { const Power& power = powers->powers[powerid]; if (!alive) { @@ -918,17 +1016,14 @@ && !power.meta_power && (!effects.stun || (allow_passive && power.passive)) && (power.sacrifice || hp > power.requires_hp) - && (power.requires_max_hp == -1 || (power.requires_max_hp >= 0 && hp >= (current[Stats::HP_MAX] * power.requires_max_hp) / 100)) - && (power.requires_not_max_hp == -1 || (power.requires_not_max_hp >= 0 && hp < (current[Stats::HP_MAX] * power.requires_not_max_hp) / 100)) - && (power.requires_max_mp == -1 || (power.requires_max_mp >= 0 && mp >= (current[Stats::MP_MAX] * power.requires_max_mp) / 100)) - && (power.requires_not_max_mp == -1 || (power.requires_not_max_mp >= 0 && mp < (current[Stats::MP_MAX]) * power.requires_not_max_mp / 100)) + && powers->checkRequiredMaxHPMP(power, this) && (!power.requires_corpse || (target_corpse && !target_corpse->corpse_timer.isEnd()) || (target_nearest_corpse && powers->checkNearestTargeting(power, this, true) && !target_nearest_corpse->corpse_timer.isEnd())) && (checkRequiredSpawns(power.requires_spawns)) && (menu_powers && menu_powers->meetsUsageStats(powerid)) && (power.type == Power::TYPE_SPAWN ? !summonLimitReached(powerid) : true) && !(power.spawn_type == "untransform" && !transformed) && std::includes(equip_flags.begin(), equip_flags.end(), power.requires_flags.begin(), power.requires_flags.end()) - && (!power.buff_party || (power.buff_party && enemym && enemym->checkPartyMembers())) + && (!power.buff_party || (power.buff_party && entitym && entitym->checkPartyMembers())) && powers->checkRequiredItems(power, this) ); } @@ -993,13 +1088,7 @@ */ void StatBlock::removeSummons() { for (std::vector<StatBlock*>::iterator it = summons.begin(); it != summons.end(); ++it) { - (*it)->hp = 0; - (*it)->effects.triggered_death = true; - (*it)->effects.clearEffects(); - if (!(*it)->hero && !(*it)->corpse) { - (*it)->cur_state = ENEMY_DEAD; - (*it)->corpse_timer.reset(Timer::BEGIN); - } + (*it)->takeDamage((*it)->get(Stats::HP_MAX), !StatBlock::TAKE_DMG_CRIT, Power::SOURCE_TYPE_NEUTRAL); (*it)->removeSummons(); (*it)->summoner = NULL; } @@ -1021,7 +1110,7 @@ removeSummons(); } -bool StatBlock::summonLimitReached(int power_id) const { +bool StatBlock::summonLimitReached(PowerID power_id) const { //find the limit Power *spawn_power = &powers->powers[power_id]; @@ -1052,9 +1141,9 @@ for (unsigned int i=0; i < summons.size(); i++) { if(!summons[i]->corpse && summons[i]->summoned_power_index == power_id - && summons[i]->cur_state != ENEMY_SPAWN - && summons[i]->cur_state != ENEMY_DEAD - && summons[i]->cur_state != ENEMY_CRITDEAD) { + && summons[i]->cur_state != ENTITY_SPAWN + && summons[i]->cur_state != ENTITY_DEAD + && summons[i]->cur_state != ENTITY_CRITDEAD) { qty_summons++; } } @@ -1148,7 +1237,7 @@ return true; } -int StatBlock::getPowerCooldown(int power_id) { +int StatBlock::getPowerCooldown(PowerID power_id) { if (hero) { return pc->power_cooldown_timers[power_id].getDuration(); } @@ -1162,7 +1251,7 @@ return 0; } -void StatBlock::setPowerCooldown(int power_id, int power_cooldown) { +void StatBlock::setPowerCooldown(PowerID power_id, int power_cooldown) { if (hero) { pc->power_cooldown_timers[power_id].setDuration(power_cooldown); } diff --git a/src/StatBlock.h b/src/StatBlock.h index a3d1517..71d051e 100644 --- a/src/StatBlock.h +++ b/src/StatBlock.h @@ -38,6 +38,7 @@ private: bool loadCoreStat(FileParser *infile); bool loadSfxStat(FileParser *infile); + bool isNPCStat(FileParser *infile); void loadHeroStats(); bool checkRequiredSpawns(int req_amount) const; bool statsLoaded; @@ -55,24 +56,15 @@ AI_POWER_PASSIVE_POST = 8 }; - enum AvatarState { - AVATAR_STANCE = 0, - AVATAR_RUN = 1, - AVATAR_BLOCK = 2, - AVATAR_HIT = 3, - AVATAR_DEAD = 4, - AVATAR_ATTACK = 5 - }; - - enum EnemyState { - ENEMY_STANCE = 0, - ENEMY_MOVE = 1, - ENEMY_POWER = 2, - ENEMY_SPAWN = 3, - ENEMY_BLOCK = 4, - ENEMY_HIT = 5, - ENEMY_DEAD = 6, - ENEMY_CRITDEAD = 7 + enum EntityState { + ENTITY_STANCE = 0, + ENTITY_MOVE = 1, + ENTITY_POWER = 2, + ENTITY_SPAWN = 3, + ENTITY_BLOCK = 4, + ENTITY_HIT = 5, + ENTITY_DEAD = 6, + ENTITY_CRITDEAD = 7 }; enum CombatStyle { @@ -84,7 +76,7 @@ class AIPower { public: int type; - int id; + PowerID id; int chance; Timer cooldown; @@ -97,27 +89,32 @@ }; static const bool CAN_USE_PASSIVE = true; + static const bool TAKE_DMG_CRIT = true; + + static const float DIRECTION_DELTA_X[8]; + static const float DIRECTION_DELTA_Y[8]; + static const float SPEED_MULTIPLIER[8]; StatBlock(); ~StatBlock(); void load(const std::string& filename); - void takeDamage(int dmg); + void takeDamage(int dmg, bool crit, int source_type); void recalc(); void applyEffects(); void calcBase(); void logic(); void removeSummons(); void removeFromSummons(); - bool summonLimitReached(int power_id) const; + bool summonLimitReached(PowerID power_id) const; void setWanderArea(int r); void loadHeroSFX(); std::string getShortClass(); std::string getLongClass(); void addXP(int amount); AIPower* getAIPower(int ai_type); - int getPowerCooldown(int power_id); - void setPowerCooldown(int power_id, int power_cooldown); + int getPowerCooldown(PowerID power_id); + void setPowerCooldown(PowerID power_id, int power_cooldown); bool alive; bool corpse; // creature is dead and done animating @@ -132,14 +129,14 @@ bool refresh_stats; bool converted; bool summoned; - int summoned_power_index; + PowerID summoned_power_index; bool encountered; // enemy only StatBlock* target_corpse; StatBlock* target_nearest; StatBlock* target_nearest_corpse; float target_nearest_dist; float target_nearest_corpse_dist; - int block_power; + PowerID block_power; int movement_type; bool flying; @@ -168,13 +165,13 @@ std::vector<int> per_level; // value increases each level after level 1 std::vector< std::vector<int> > per_primary; - int get(Stats::STAT stat) { + int get(Stats::STAT stat) const { return current[stat]; } - int getDamageMin(size_t dmg_type) { + int getDamageMin(size_t dmg_type) const { return current[Stats::COUNT + (dmg_type * 2)]; } - int getDamageMax(size_t dmg_type) { + int getDamageMax(size_t dmg_type) const { return current[Stats::COUNT + (dmg_type * 2) + 1]; } @@ -250,12 +247,12 @@ int chance_pursue; int chance_flee; - std::vector<int> powers_list; - std::vector<int> powers_list_items; - std::vector<int> powers_passive; + std::vector<PowerID> powers_list; + std::vector<PowerID> powers_list_items; + std::vector<PowerID> powers_passive; std::vector<AIPower> powers_ai; - bool canUsePower(int powerid, bool allow_passive) const; + bool canUsePower(PowerID powerid, bool allow_passive) const; float melee_range; float threat_range; @@ -292,8 +289,8 @@ StatusID convert_status; StatusID quest_loot_requires_status; StatusID quest_loot_requires_not_status; - int quest_loot_id; - int first_defeat_loot; + ItemID quest_loot_id; + ItemID first_defeat_loot; // player look options std::string gfx_base; // folder in /images/avatar @@ -311,6 +308,8 @@ std::vector<std::string> sfx_critdie; std::vector<std::string> sfx_block; std::string sfx_levelup; + std::string sfx_lowhp; + bool sfx_lowhp_loop; // formula numbers int max_spendable_stat_points; @@ -325,14 +324,14 @@ // links to summoned creatures and the entity which summoned this std::vector<StatBlock*> summons; StatBlock* summoner; - std::queue<int> party_buffs; - - std::vector<int> power_filter; - - int bleed_source_type; + std::queue<PowerID> party_buffs; + + std::vector<PowerID> power_filter; std::vector<StatusID> invincible_requires_status; std::vector<StatusID> invincible_requires_not_status; + + bool abort_npc_interact; }; #endif diff --git a/src/Subtitles.cpp b/src/Subtitles.cpp index 7c2b092..908c135 100644 --- a/src/Subtitles.cpp +++ b/src/Subtitles.cpp @@ -121,9 +121,6 @@ } void Subtitles::logic(unsigned long id) { - if (!settings->subtitles) - return; - setTextByID(id); visible_timer.tick(); @@ -140,7 +137,7 @@ } void Subtitles::render() { - if (!visible) + if (!visible || !settings->subtitles) return; if (background) { diff --git a/src/TooltipManager.cpp b/src/TooltipManager.cpp index bd8b69f..fade332 100644 --- a/src/TooltipManager.cpp +++ b/src/TooltipManager.cpp @@ -23,30 +23,47 @@ #include "WidgetTooltip.h" TooltipManager::TooltipManager() - : tip(new WidgetTooltip()) - , style(TooltipData::STYLE_FLOAT) - , context(CONTEXT_NONE) -{} + : context(CONTEXT_NONE) +{ + for (size_t i = 0; i < TOOLTIP_COUNT; ++i) { + tip[i] = new WidgetTooltip(); + if (i > 0) { + tip[i]->parent = tip[i-1]; + } + + tip_data[i] = TooltipData(); + pos[i] = Point(); + style[i] = 0; + } +} TooltipManager::~TooltipManager() { - delete tip; + for (size_t i = 0; i < TOOLTIP_COUNT; ++i) { + delete tip[i]; + } } void TooltipManager::clear() { - tip_data.clear(); + for (size_t i = 0; i < TOOLTIP_COUNT; ++i) { + tip_data[i].clear(); + } } bool TooltipManager::isEmpty() { - return tip_data.isEmpty(); + for (size_t i = 0; i < TOOLTIP_COUNT; ++i) { + if (!tip_data[i].isEmpty()) + return false; + } + return true; } -void TooltipManager::push(const TooltipData& _tip_data, const Point& _pos, uint8_t _style) { - if (_tip_data.isEmpty()) +void TooltipManager::push(const TooltipData& _tip_data, const Point& _pos, uint8_t _style, size_t tip_index) { + if (_tip_data.isEmpty() || tip_index >= TOOLTIP_COUNT) return; - tip_data = _tip_data; - pos = _pos; - style = _style; + tip_data[tip_index] = _tip_data; + pos[tip_index] = _pos; + style[tip_index] = _style; } void TooltipManager::render() { @@ -57,5 +74,7 @@ context = CONTEXT_NONE; } - tip->render(tip_data, pos, style); + for (size_t i = 0; i < TOOLTIP_COUNT; ++i) { + tip[i]->render(tip_data[i], pos[i], style[i]); + } } diff --git a/src/TooltipManager.h b/src/TooltipManager.h index fbd0fe7..92b03d5 100644 --- a/src/TooltipManager.h +++ b/src/TooltipManager.h @@ -28,13 +28,8 @@ class WidgetTooltip; class TooltipManager { -private: - WidgetTooltip *tip; - TooltipData tip_data; - Point pos; - uint8_t style; - public: + static const size_t TOOLTIP_COUNT = 3; enum { CONTEXT_NONE = 0, CONTEXT_MENU = 1, @@ -47,10 +42,17 @@ void clear(); bool isEmpty(); - void push(const TooltipData& _tip_data, const Point& _pos, uint8_t _style); + void push(const TooltipData& _tip_data, const Point& _pos, uint8_t _style, size_t tip_index=0); void render(); uint8_t context; + +private: + WidgetTooltip* tip[TOOLTIP_COUNT]; + TooltipData tip_data[TOOLTIP_COUNT]; + Point pos[TOOLTIP_COUNT]; + uint8_t style[TOOLTIP_COUNT]; + }; #endif diff --git a/src/Utils.cpp b/src/Utils.cpp index ed1efe9..2a0c8fb 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -156,6 +156,21 @@ return !((*this) == other); } +uint32_t Color::encodeRGBA() { + uint32_t result = static_cast<uint32_t>(a); + result |= static_cast<uint32_t>(r) << 24; + result |= static_cast<uint32_t>(g) << 16; + result |= static_cast<uint32_t>(b) << 8; + return result; +} + +void Color::decodeRGBA(const uint32_t encoded) { + a = static_cast<uint8_t>(encoded); + r = static_cast<uint8_t>(encoded >> 24); + g = static_cast<uint8_t>(encoded >> 16); + b = static_cast<uint8_t>(encoded >> 8); +} + Timer::Timer(unsigned _duration) : current(0) , duration(_duration) @@ -203,6 +218,10 @@ current = 0; else if (type == Timer::BEGIN) current = duration; +} + +bool Timer::isWholeSecond() { + return current % settings->max_frames_per_sec == 0; } FPoint Utils::screenToMap(int x, int y, float camx, float camy) { @@ -382,6 +401,42 @@ r->x = (settings->view_w - r->w) + r->x; r->y = (settings->view_h - r->h) + r->y; } + else if (alignment == ALIGN_FRAME_TOPLEFT) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + r->y; + } + else if (alignment == ALIGN_FRAME_TOP) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + (eset->resolutions.frame_w/2 - r->w/2) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + r->y; + } + else if (alignment == ALIGN_FRAME_TOPRIGHT) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + (eset->resolutions.frame_w - r->w) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + r->y; + } + else if (alignment == ALIGN_FRAME_LEFT) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + (eset->resolutions.frame_h/2 - r->h/2) + r->y; + } + else if (alignment == ALIGN_FRAME_CENTER) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + (eset->resolutions.frame_w/2 - r->w/2) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + (eset->resolutions.frame_h/2 - r->h/2) + r->y; + } + else if (alignment == ALIGN_FRAME_RIGHT) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + (eset->resolutions.frame_w - r->w) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + (eset->resolutions.frame_h/2 - r->h/2) + r->y; + } + else if (alignment == ALIGN_FRAME_BOTTOMLEFT) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + (eset->resolutions.frame_h - r->h) + r->y; + } + else if (alignment == ALIGN_FRAME_BOTTOM) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + (eset->resolutions.frame_w/2 - r->w/2) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + (eset->resolutions.frame_h - r->h) + r->y; + } + else if (alignment == ALIGN_FRAME_BOTTOMRIGHT) { + r->x = ((settings->view_w - eset->resolutions.frame_w)/2) + (eset->resolutions.frame_w - r->w) + r->x; + r->y = ((settings->view_h - eset->resolutions.frame_h)/2) + (eset->resolutions.frame_h - r->h) + r->y; + } else { // do nothing } @@ -504,10 +559,10 @@ std::stringstream ss; ss << settings->path_user << "saves/" << eset->misc.save_prefix << "/"; - Filesystem::createDir(Filesystem::path(&ss)); + Filesystem::createDir(ss.str()); ss << slot; - Filesystem::createDir(Filesystem::path(&ss)); + Filesystem::createDir(ss.str()); } void Utils::removeSaveDir(int slot) { @@ -517,8 +572,8 @@ std::stringstream ss; ss << settings->path_user << "saves/" << eset->misc.save_prefix << "/" << slot; - if (Filesystem::isDirectory(Filesystem::path(&ss))) { - Filesystem::removeDirRecursive(Filesystem::path(&ss)); + if (Filesystem::isDirectory(ss.str())) { + Filesystem::removeDirRecursive(ss.str()); } } @@ -712,7 +767,7 @@ if (!platform.has_lock_file) return; - std::string lock_file_path = settings->path_conf + "flare_lock"; + std::string lock_file_path = Filesystem::convertSlashes(settings->path_conf + "flare_lock"); std::ifstream infile; infile.open(lock_file_path.c_str(), std::ios::in); @@ -771,12 +826,13 @@ { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT|SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 0, "Quit" }, { 0, 1, "Continue" }, { 0, 2, "Reset" }, + { 0, 3, "Safe Video" }, }; const SDL_MessageBoxData messageboxdata = { SDL_MESSAGEBOX_INFORMATION, NULL, "Flare", - "Flare appears to already be running.\n\nYou may either:\n- 'Quit' Flare (safe, recommended)\n- 'Continue' to launch another copy of Flare.\n- 'Reset' the counter which tracks the number of copies of Flare that are currently running.\n If this dialog is shown every time you launch Flare, this option should fix it.", + "Flare is unable to launch properly. This may be because it did not exit properly, or because there is another instance running.\n\nIf Flare crashed, it is recommended to try 'Safe Video' mode. This will try launching Flare with the minimum video settings.\n\nIf Flare is already running, you may:\n- 'Quit' Flare (safe, recommended)\n- 'Continue' to launch another copy of Flare.\n- 'Reset' the counter which tracks the number of copies of Flare that are currently running.\n If this dialog is shown every time you launch Flare, this option should fix it.", static_cast<int>(SDL_arraysize(buttons)), buttons, NULL @@ -790,6 +846,10 @@ else if (buttonid == 2) { LOCK_INDEX = 0; } + else if (buttonid == 3) { + LOCK_INDEX = 0; + settings->safe_video = true; + } } lockFileWrite(1); diff --git a/src/Utils.h b/src/Utils.h index e7a3f9c..53b8a2e 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -36,6 +36,10 @@ typedef unsigned long SoundID; typedef unsigned long StatusID; +typedef size_t ItemID; +typedef size_t ItemSetID; +typedef size_t PowerID; + class Avatar; class FPoint; // needed for Point -> FPoint constructor @@ -73,6 +77,8 @@ operator SDL_Color() const; bool operator ==(const Color &other); bool operator !=(const Color &other); + uint32_t encodeRGBA(); + void decodeRGBA(const uint32_t encoded); }; class Timer { @@ -94,10 +100,11 @@ bool isEnd(); bool isBegin(); void reset(int type); + bool isWholeSecond(); }; namespace Utils { - // Alignment: For aligning objects relative to the screen + // Alignment: For aligning objects. 0-8 are screen-relative, 9-17 are menu frame relative. enum { ALIGN_TOPLEFT = 0, ALIGN_TOP = 1, @@ -107,7 +114,16 @@ ALIGN_RIGHT = 5, ALIGN_BOTTOMLEFT = 6, ALIGN_BOTTOM = 7, - ALIGN_BOTTOMRIGHT = 8 + ALIGN_BOTTOMRIGHT = 8, + ALIGN_FRAME_TOPLEFT = 9, + ALIGN_FRAME_TOP = 10, + ALIGN_FRAME_TOPRIGHT = 11, + ALIGN_FRAME_LEFT = 12, + ALIGN_FRAME_CENTER = 13, + ALIGN_FRAME_RIGHT = 14, + ALIGN_FRAME_BOTTOMLEFT = 15, + ALIGN_FRAME_BOTTOM = 16, + ALIGN_FRAME_BOTTOMRIGHT = 17 }; extern int LOCK_INDEX; diff --git a/src/UtilsFileSystem.cpp b/src/UtilsFileSystem.cpp index 6691d76..f06b147 100644 --- a/src/UtilsFileSystem.cpp +++ b/src/UtilsFileSystem.cpp @@ -37,7 +37,7 @@ */ bool Filesystem::pathExists(const std::string &path) { struct stat st; - return (stat(path.c_str(), &st) == 0); + return (stat(convertSlashes(path).c_str(), &st) == 0); } /** @@ -48,7 +48,7 @@ if (isDirectory(path, false)) return; - platform.dirCreate(path); + platform.dirCreate(convertSlashes(path)); } /** @@ -56,9 +56,10 @@ * The filename parameter should include the entire path to this file */ bool Filesystem::fileExists(const std::string &filename) { - if (isDirectory(filename, false)) return false; - - std::ifstream infile(filename.c_str()); + if (isDirectory(filename, false)) + return false; + + std::ifstream infile(convertSlashes(filename).c_str()); bool exists = infile.is_open(); if (exists) infile.close(); @@ -69,11 +70,10 @@ * Returns a vector containing all filenames in a given folder with the given extension */ int Filesystem::getFileList(const std::string &dir, const std::string &ext, std::vector<std::string> &files) { - DIR *dp; struct dirent *dirp; - if((dp = opendir(dir.c_str())) == NULL) + if((dp = opendir(convertSlashes(dir).c_str())) == NULL) return errno; size_t extlen = ext.length(); @@ -81,7 +81,7 @@ std::string filename = std::string(dirp->d_name); if (filename.length() > extlen) if(filename.substr(filename.length() - extlen,extlen) == ext) - files.push_back(dir + "/" + filename); + files.push_back(convertSlashes(dir + "/" + filename)); } closedir(dp); return 0; @@ -103,7 +103,7 @@ while ((dirp = readdir(dp)) != NULL) { // do not use dirp->d_type, it's not portable std::string directory = std::string(dirp->d_name); - std::string mod_dir = dir + "/" + directory; + std::string mod_dir = convertSlashes(dir + "/" + directory); if ((stat(mod_dir.c_str(), &st) != -1) && S_ISDIR(st.st_mode) && directory != "." @@ -117,10 +117,11 @@ } bool Filesystem::isDirectory(const std::string &path, bool show_error) { + std::string clean_path = convertSlashes(path); struct stat st; - if (stat(path.c_str(), &st) == -1) { + if (stat(clean_path.c_str(), &st) == -1) { if (show_error) { - std::string error_msg = "Filesystem::isDirectory (" + path + ")"; + std::string error_msg = "Filesystem::isDirectory (" + clean_path + ")"; perror(error_msg.c_str()); } return false; @@ -131,8 +132,9 @@ } bool Filesystem::removeFile(const std::string &file) { - if (remove(file.c_str()) != 0) { - std::string error_msg = "Filesystem::removeFile (" + file + ")"; + std::string clean_path = convertSlashes(file); + if (remove(clean_path.c_str()) != 0) { + std::string error_msg = "Filesystem::removeFile (" + clean_path + ")"; perror(error_msg.c_str()); return false; } @@ -143,7 +145,7 @@ if (!isDirectory(dir)) return false; - return platform.dirRemove(dir); + return platform.dirRemove(convertSlashes(dir)); } bool Filesystem::removeDirRecursive(const std::string &dir) { @@ -168,39 +170,52 @@ } /** - * Convert from stringstream to filesystem path string in an os-independent fashion - */ -std::string Filesystem::path(const std::stringstream* ss) { - std::string path = ss->str(); - - bool is_windows_path = false; - - size_t len = path.length(); - // fix mixed '\' and '/' on windows - for (size_t i = 0; i < len; i++) { - if (path[i] == '\\') { - is_windows_path = true; + * Convert from string to filesystem path string in an os-independent fashion + */ +std::string Filesystem::convertSlashes(const std::string _path) { + std::string path = _path; + +#ifdef _WIN32 + char good_sep = '\\'; + char bad_sep = '/'; +#else + char good_sep = '/'; + char bad_sep = '\\'; +#endif + + for (size_t i = 0; i < path.length(); i++) { + if (path[i] == bad_sep) { + path[i] = good_sep; } - if (is_windows_path && path[i] == '/') { - // isDirectory does not like trailing '\', so terminate string if last char - if (i == len - 1) { - path[i] = 0; - } - else { - path[i] = '\\'; - } - } - } - - return path; -} - -bool Filesystem::renameFile(const std::string &oldfile, const std::string &newfile) { + } + + return removeTrailingSlash(path); +} + +bool Filesystem::renameFile(const std::string &_oldfile, const std::string &_newfile) { + std::string oldfile = convertSlashes(_oldfile); + std::string newfile = convertSlashes(_newfile); + if (rename(oldfile.c_str(), newfile.c_str()) != 0) { std::string error_msg = "Filesystem::renameFile (" + oldfile + " -> " + newfile + ")"; perror(error_msg.c_str()); return false; } + return true; } +std::string Filesystem::removeTrailingSlash(const std::string& path) { + // windows + if (!path.empty() && path.at(path.length()-1) == '\\') + return path.substr(0, path.length()-1); + + // everything else + // allow for *nix root / + else if (path.length() > 1 && path.at(path.length()-1) == '/') + return path.substr(0, path.length()-1); + + // no trailing slash found + else + return path; +} diff --git a/src/UtilsFileSystem.h b/src/UtilsFileSystem.h index 9232576..741c1c6 100644 --- a/src/UtilsFileSystem.h +++ b/src/UtilsFileSystem.h @@ -40,9 +40,11 @@ bool removeDir(const std::string &dir); bool removeDirRecursive(const std::string &dir); - std::string path(const std::stringstream* ss); + std::string convertSlashes(const std::string _path); - bool renameFile(const std::string &oldfile, const std::string &newfile); + bool renameFile(const std::string &_oldfile, const std::string &_newfile); + + std::string removeTrailingSlash(const std::string& path); } diff --git a/src/UtilsMath.h b/src/UtilsMath.h index 4e454bd..2382684 100644 --- a/src/UtilsMath.h +++ b/src/UtilsMath.h @@ -22,7 +22,11 @@ #include <cstdlib> #include <algorithm> // for std::min()/std::max() -#include "math.h" +#include <math.h> + +#ifdef _MSC_VER +#define _USE_MATH_DEFINES +#endif #ifndef M_PI #define M_PI 3.1415926535898f @@ -45,6 +49,11 @@ return minVal + (rand() % (d + signum(d))); } + inline float randBetweenF(float minVal, float maxVal) { + if (minVal == maxVal) return minVal; + return minVal + ((static_cast<float>(rand()) / static_cast<float>(RAND_MAX)) * (maxVal - minVal)); + } + /** * Returns true with random percent chance. */ diff --git a/src/UtilsParsing.cpp b/src/UtilsParsing.cpp index 649026d..4099eb1 100644 --- a/src/UtilsParsing.cpp +++ b/src/UtilsParsing.cpp @@ -20,6 +20,7 @@ #include "CommonIncludes.h" #include "FontEngine.h" +#include "ItemManager.h" #include "Settings.h" #include "SharedResources.h" #include "UtilsParsing.h" @@ -170,6 +171,21 @@ if (!(std::stringstream(s) >> result)) result = default_value; return result; +} + +size_t Parse::toSizeT(const std::string& s, size_t default_value) { + size_t result; + if (!(std::stringstream(s) >> result)) + result = default_value; + return result; +} + +ItemID Parse::toItemID(const std::string& s, ItemID default_value) { + return Parse::toSizeT(s, default_value); +} + +PowerID Parse::toPowerID(const std::string& s, PowerID default_value) { + return Parse::toSizeT(s, default_value); } bool Parse::toBool(std::string value) { @@ -277,8 +293,8 @@ return dir; } -int Parse::toAlignment(const std::string &s) { - int align = Utils::ALIGN_TOPLEFT; +int Parse::toAlignment(const std::string &s, int default_value) { + int align = default_value; if (s == "topleft") align = Utils::ALIGN_TOPLEFT; @@ -298,6 +314,24 @@ align = Utils::ALIGN_BOTTOM; else if (s == "bottomright") align = Utils::ALIGN_BOTTOMRIGHT; + else if (s == "frame_topleft") + align = Utils::ALIGN_FRAME_TOPLEFT; + else if (s == "frame_top") + align = Utils::ALIGN_FRAME_TOP; + else if (s == "frame_topright") + align = Utils::ALIGN_FRAME_TOPRIGHT; + else if (s == "frame_left") + align = Utils::ALIGN_FRAME_LEFT; + else if (s == "frame_center") + align = Utils::ALIGN_FRAME_CENTER; + else if (s == "frame_right") + align = Utils::ALIGN_FRAME_RIGHT; + else if (s == "frame_bottomleft") + align = Utils::ALIGN_FRAME_BOTTOMLEFT; + else if (s == "frame_bottom") + align = Utils::ALIGN_FRAME_BOTTOM; + else if (s == "frame_bottomright") + align = Utils::ALIGN_FRAME_BOTTOMRIGHT; return align; } @@ -369,3 +403,20 @@ return info; } +ItemStack Parse::toItemQuantityPair(std::string value, bool* check_pair) { + ItemStack r; + + if (check_pair) { + *check_pair = (value.find_first_of(':') != std::string::npos); + } + + value += ':'; + r.item = toItemID(popFirstString(value, ':')); + r.quantity = popFirstInt(value, ':'); + + // quantity is always >= 1 + if (r.quantity == 0) + r.quantity = 1; + + return r; +} diff --git a/src/UtilsParsing.h b/src/UtilsParsing.h index d8af0de..30e620c 100644 --- a/src/UtilsParsing.h +++ b/src/UtilsParsing.h @@ -25,6 +25,7 @@ #include <string> #include <typeinfo> +class ItemStack; class LabelInfo; namespace Parse { @@ -40,6 +41,9 @@ int toInt(const std::string& s, int default_value = 0); float toFloat(const std::string &s, float default_value = 0.0); unsigned long toUnsignedLong(const std::string& s, unsigned long default_value = 0); + size_t toSizeT(const std::string& s, size_t default_value = 0); + ItemID toItemID(const std::string& s, ItemID default_value = 0); + PowerID toPowerID(const std::string& s, PowerID default_value = 0); bool toBool(std::string value); Point toPoint(std::string value); @@ -49,11 +53,13 @@ int toDuration(const std::string& s); int toDirection(const std::string& s); - int toAlignment(const std::string& s); + int toAlignment(const std::string& s, int default_value = Utils::ALIGN_TOPLEFT); int popFirstInt(std::string& s, char separator = 0); std::string popFirstString(std::string& s, char separator = 0); LabelInfo popLabelInfo(std::string val); + + ItemStack toItemQuantityPair(std::string value, bool* check_pair = NULL); } #endif diff --git a/src/Version.cpp b/src/Version.cpp index 8ebefb3..076e6a8 100644 --- a/src/Version.cpp +++ b/src/Version.cpp @@ -30,7 +30,7 @@ #include <SDL.h> -Version VersionInfo::ENGINE(1, 9, 1); +Version VersionInfo::ENGINE(1, 11, 89); Version VersionInfo::MIN(0, 0, 0); Version VersionInfo::MAX(USHRT_MAX, USHRT_MAX, USHRT_MAX); @@ -148,8 +148,5 @@ std::string VersionInfo::createVersionStringFull() { // example output: Flare 1.0 (Linux) - std::stringstream ss; - ss << NAME << ' ' << ENGINE.getString(); - ss << " (" << SDL_GetPlatform() << ")"; - return ss.str(); + return NAME + " " + ENGINE.getString() + " (" + std::string(SDL_GetPlatform()) + ")"; } diff --git a/src/Widget.cpp b/src/Widget.cpp index ec0cf6a..9923f7e 100644 --- a/src/Widget.cpp +++ b/src/Widget.cpp @@ -26,6 +26,7 @@ : in_focus(false) , focusable(false) , enable_tablist_nav(true) + , tablist_nav_right(false) , scroll_type(SCROLL_TWO_DIRECTIONS) , alignment(Utils::ALIGN_TOPLEFT) { } @@ -163,8 +164,16 @@ } Widget* TabList::getNext(bool inner, uint8_t dir) { - if (widgets.empty()) + if (widgets.empty()) { + if (next_tablist) { + // WARNING: Could result in infinite loop if all tablists are empty + defocus(); + locked = true; + next_tablist->unlock(); + return next_tablist->getNext(!GET_INNER, WIDGET_SELECT_AUTO); + } return NULL; + } if (current_is_valid()) { if (inner && widgets.at(current)->getNext()) @@ -206,8 +215,16 @@ } Widget* TabList::getPrev(bool inner, uint8_t dir) { - if (widgets.empty()) + if (widgets.empty()) { + if (prev_tablist) { + // WARNING: Could result in infinite loop if all tablists are empty + defocus(); + locked = true; + prev_tablist->unlock(); + return prev_tablist->getPrev(!GET_INNER, WIDGET_SELECT_AUTO); + } return NULL; + } if (current_is_valid()) { if (inner && widgets.at(current)->getPrev()) @@ -266,8 +283,13 @@ if (!widgets.at(i)->enable_tablist_nav) continue; - FPoint p1(static_cast<float>(widgets.at(current)->pos.x), static_cast<float>(widgets.at(current)->pos.y)); - FPoint p2(static_cast<float>(widgets.at(i)->pos.x), static_cast<float>(widgets.at(i)->pos.y)); + Rect& c_pos = widgets.at(current)->pos; + Rect& i_pos = widgets.at(i)->pos; + + int w_div = widgets.at(i)->tablist_nav_right ? 1 : 2; + + FPoint p1(static_cast<float>(c_pos.x + c_pos.w / w_div), static_cast<float>(c_pos.y + c_pos.h / 2)); + FPoint p2(static_cast<float>(i_pos.x + i_pos.w / w_div), static_cast<float>(i_pos.y + i_pos.h / 2)); if (dir == WIDGET_SELECT_LEFT && p1.x <= p2.x) continue; @@ -392,7 +414,7 @@ // Also defocus if we start using the mouse // we need to disable this for touchscreen devices so that item tooltips will work - if (!settings->touchscreen && current != -1 && inpt->usingMouse()) { + if (!settings->touchscreen && current != -1 && inpt->usingMouse() && !ignore_no_mouse) { defocus(); } } diff --git a/src/Widget.h b/src/Widget.h index 15eb65b..9b3cb56 100644 --- a/src/Widget.h +++ b/src/Widget.h @@ -49,6 +49,7 @@ bool in_focus; bool focusable; bool enable_tablist_nav; // when disabled, this widget will be skipped during tablist navigation + bool tablist_nav_right; // uses the center-right point for tablist nav instead of the center. Primarily for MenuConfig widgets uint8_t scroll_type; Rect pos; // This is the position of the button within the screen Rect local_frame; // Local reference frame is this is a daughter widget diff --git a/src/WidgetButton.cpp b/src/WidgetButton.cpp index 8534d0c..57c769f 100644 --- a/src/WidgetButton.cpp +++ b/src/WidgetButton.cpp @@ -224,7 +224,8 @@ if (inpt->usingMouse() && Utils::isWithinRect(pos, mouse) && tooltip != "") { TooltipData tip_data; tip_data.addText(tooltip); - tooltipm->push(tip_data, mouse, TooltipData::STYLE_FLOAT); + Point new_mouse(mouse.x + local_frame.x - local_offset.x, mouse.y + local_frame.y - local_offset.y); + tooltipm->push(tip_data, new_mouse, TooltipData::STYLE_FLOAT); } } diff --git a/src/WidgetCheckBox.cpp b/src/WidgetCheckBox.cpp index dba02c5..492d83d 100644 --- a/src/WidgetCheckBox.cpp +++ b/src/WidgetCheckBox.cpp @@ -155,7 +155,9 @@ tip_data.addText(tooltip); } - if (!tip_data.isEmpty()) - tooltipm->push(tip_data, mouse, TooltipData::STYLE_FLOAT); + if (!tip_data.isEmpty()) { + Point new_mouse(mouse.x + local_frame.x - local_offset.x, mouse.y + local_frame.y - local_offset.y); + tooltipm->push(tip_data, new_mouse, TooltipData::STYLE_FLOAT); + } } diff --git a/src/WidgetHorizontalList.cpp b/src/WidgetHorizontalList.cpp new file mode 100644 index 0000000..d5f8528 --- /dev/null +++ b/src/WidgetHorizontalList.cpp @@ -0,0 +1,251 @@ +/* +Copyright © 2018 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/** + * class WidgetHorizontalList + */ + +#include "EngineSettings.h" +#include "FontEngine.h" +#include "InputState.h" +#include "RenderDevice.h" +#include "SharedResources.h" +#include "TooltipManager.h" +#include "WidgetButton.h" +#include "WidgetHorizontalList.h" + +const std::string WidgetHorizontalList::DEFAULT_FILE_LEFT = "images/menus/buttons/left.png"; +const std::string WidgetHorizontalList::DEFAULT_FILE_RIGHT = "images/menus/buttons/right.png"; + +WidgetHorizontalList::WidgetHorizontalList() + : Widget() + , button_left(new WidgetButton(DEFAULT_FILE_LEFT)) + , button_right(new WidgetButton(DEFAULT_FILE_RIGHT)) + , cursor(0) + , changed_without_mouse(false) + , enabled(true) +{ + focusable = true; + scroll_type = SCROLL_HORIZONTAL; + refresh(); +} + +// void WidgetHorizontalList::activate() { +// } + +void WidgetHorizontalList::setPos(int offset_x, int offset_y) { + Widget::setPos(offset_x, offset_y); + refresh(); +} + +bool WidgetHorizontalList::checkClick() { + return checkClickAt(inpt->mouse.x,inpt->mouse.y); +} + +bool WidgetHorizontalList::checkClickAt(int x, int y) { + // enable_tablist_nav = enabled; + + Point mouse(x,y); + + checkTooltip(mouse); + + if (button_left->checkClickAt(mouse.x, mouse.y)) { + scrollLeft(); + return true; + } + else if (button_right->checkClickAt(mouse.x, mouse.y)) { + scrollRight(); + return true; + } + else if (changed_without_mouse) { + // getNext() or getPrev() was used to change the slider, so treat it as a "click" + changed_without_mouse = false; + return true; + } + + + return false; +} + +void WidgetHorizontalList::render() { + button_left->local_frame = local_frame; + button_left->local_offset = local_offset; + + button_right->local_frame = local_frame; + button_right->local_offset = local_offset; + + button_left->render(); + button_right->render(); + + // render label + label.local_frame = local_frame; + label.local_offset = local_offset; + label.render(); + + if (in_focus) { + Point topLeft; + Point bottomRight; + + topLeft.x = pos.x + local_frame.x - local_offset.x; + topLeft.y = pos.y + local_frame.y - local_offset.y; + bottomRight.x = topLeft.x + pos.w; + bottomRight.y = topLeft.y + pos.h; + + // Only draw rectangle if it fits in local frame + bool draw = true; + if (local_frame.w && + (topLeft.x<local_frame.x || bottomRight.x>(local_frame.x+local_frame.w))) { + draw = false; + } + if (local_frame.h && + (topLeft.y<local_frame.y || bottomRight.y>(local_frame.y+local_frame.h))) { + draw = false; + } + if (draw || 1) { + render_device->drawRectangle(topLeft, bottomRight, eset->widgets.selection_rect_color); + } + } +} + +void WidgetHorizontalList::refresh() { + const int text_width = eset->widgets.horizontal_list_text_width; + bool is_enabled = !isEmpty() && enabled; + + label.setText(getValue()); + label.setPos(pos.x + button_left->pos.w + text_width/2, pos.y + button_left->pos.h / 2); + label.setMaxWidth(text_width); + label.setJustify(FontEngine::JUSTIFY_CENTER); + label.setVAlign(LabelInfo::VALIGN_CENTER); + label.setColor(is_enabled ? font->getColor(FontEngine::COLOR_WIDGET_NORMAL) : font->getColor(FontEngine::COLOR_WIDGET_DISABLED)); + + button_left->setPos(pos.x, pos.y); + button_right->setPos(pos.x + button_left->pos.w + text_width, pos.y); + + button_left->enabled = is_enabled; + button_right->enabled = is_enabled; + + pos.w = button_left->pos.w + button_right->pos.w + text_width; + pos.h = std::max(button_left->pos.h, label.getBounds()->h); + + tooltip_area.x = pos.x + button_left->pos.w; + tooltip_area.y = std::min(pos.y, label.getBounds()->y); + tooltip_area.w = text_width; + tooltip_area.h = std::max(button_left->pos.h, label.getBounds()->h); +} + +void WidgetHorizontalList::checkTooltip(const Point& mouse) { + if (isEmpty()) + return; + + if (inpt->usingMouse() && Utils::isWithinRect(tooltip_area, mouse) && !list_items[cursor].tooltip.empty()) { + TooltipData tip_data; + tip_data.addText(list_items[cursor].tooltip); + Point new_mouse(mouse.x + local_frame.x - local_offset.x, mouse.y + local_frame.y - local_offset.y); + tooltipm->push(tip_data, new_mouse, TooltipData::STYLE_FLOAT); + } +} + +void WidgetHorizontalList::append(const std::string& value, const std::string& tooltip) { + HListItem hli; + hli.value = value; + hli.tooltip = tooltip; + + list_items.push_back(hli); +} + +void WidgetHorizontalList::clear() { + list_items.clear(); +} + +std::string WidgetHorizontalList::getValue() { + if (cursor < getSize()) { + return list_items[cursor].value; + } + + return ""; +} + +unsigned WidgetHorizontalList::getSelected() { + if (cursor < getSize()) + return cursor; + else + return getSize(); +} + +unsigned WidgetHorizontalList::getSize() { + return static_cast<unsigned>(list_items.size()); +} + +bool WidgetHorizontalList::isEmpty() { + return list_items.empty(); +} + +void WidgetHorizontalList::scrollLeft() { + if (isEmpty()) + return; + + if (cursor == 0) + cursor = getSize() - 1; + else + cursor--; + + refresh(); +} + +void WidgetHorizontalList::select(unsigned index) { + if (isEmpty()) + return; + + if (index < getSize()) + cursor = index; + + refresh(); +} + +void WidgetHorizontalList::scrollRight() { + if (isEmpty()) + return; + + if (cursor+1 >= getSize()) + cursor = 0; + else + cursor++; + + refresh(); +} + +bool WidgetHorizontalList::getPrev() { + if (!isEmpty() && enabled) { + scrollLeft(); + changed_without_mouse = true; + } + return true; +} + +bool WidgetHorizontalList::getNext() { + if (!isEmpty() && enabled) { + scrollRight(); + changed_without_mouse = true; + } + return true; +} + +WidgetHorizontalList::~WidgetHorizontalList() { + delete button_left; + delete button_right; +} + diff --git a/src/WidgetHorizontalList.h b/src/WidgetHorizontalList.h new file mode 100644 index 0000000..c2c11e8 --- /dev/null +++ b/src/WidgetHorizontalList.h @@ -0,0 +1,84 @@ +/* +Copyright © 2018 Justin Jacobs + +This file is part of FLARE. + +FLARE is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later version. + +FLARE is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +FLARE. If not, see http://www.gnu.org/licenses/ +*/ + +/** + * class WidgetHorizontalList + */ + +#ifndef WIDGET_HORIZONTALLIST_H +#define WIDGET_HORIZONTALLIST_H + +#include "CommonIncludes.h" +#include "Widget.h" +#include "WidgetLabel.h" + +class WidgetButton; + +class WidgetHorizontalList : public Widget { +private: + static const std::string DEFAULT_FILE_LEFT; + static const std::string DEFAULT_FILE_RIGHT; + + class HListItem { + public: + HListItem() {} + ~HListItem() {} + + std::string value; + std::string tooltip; + }; + + void checkTooltip(const Point& mouse); + + WidgetLabel label; + WidgetButton *button_left; + WidgetButton *button_right; + + unsigned cursor; + bool changed_without_mouse; + std::vector<HListItem> list_items; + Rect tooltip_area; + +public: + explicit WidgetHorizontalList(); + ~WidgetHorizontalList(); + + void setPos(int offset_x, int offset_y); + + bool checkClick(); + bool checkClickAt(int x, int y); + void render(); + void refresh(); + + void append(const std::string& value, const std::string& tooltip); + void clear(); + std::string getValue(); + unsigned getSelected(); + unsigned getSize(); + bool isEmpty(); + + void select(unsigned index); + void scrollLeft(); + void scrollRight(); + + bool getPrev(); + bool getNext(); + + bool enabled; +}; + +#endif diff --git a/src/WidgetInput.cpp b/src/WidgetInput.cpp index 3b410d9..05d21e5 100644 --- a/src/WidgetInput.cpp +++ b/src/WidgetInput.cpp @@ -46,6 +46,7 @@ void WidgetInput::setPos(int offset_x, int offset_y) { pos.x = pos_base.x + offset_x + local_frame.x - local_offset.x; pos.y = pos_base.y + offset_y + local_frame.y - local_offset.y; + Utils::alignToScreenEdge(alignment, &pos); font->setFont("font_regular"); font_pos.x = pos.x + (font->getFontHeight()/2); diff --git a/src/WidgetLabel.cpp b/src/WidgetLabel.cpp index bff2c13..b9ae470 100644 --- a/src/WidgetLabel.cpp +++ b/src/WidgetLabel.cpp @@ -48,6 +48,7 @@ , update_flag(UPDATE_NONE) , hidden(false) , window_resize_flag(false) + , alpha(255) , label(NULL) , text("") , font_style(DEFAULT_FONT) @@ -55,6 +56,7 @@ { bounds.x = bounds.y = 0; bounds.w = bounds.h = 0; + enable_tablist_nav = false; } void WidgetLabel::setMaxWidth(int width) { @@ -109,6 +111,13 @@ if (font_style != _font) { font_style = _font; setUpdateFlag(UPDATE_RECACHE); + } +} + +void WidgetLabel::setAlpha(uint8_t _alpha) { + if (_alpha != alpha) { + alpha = _alpha; + setUpdateFlag(UPDATE_POS); } } @@ -165,6 +174,7 @@ if (label) { label->setDestFromRect(bounds); + label->alpha_mod = alpha; } } @@ -180,8 +190,11 @@ label = NULL; } - if (text.empty()) + if (text.empty()) { + bounds.w = 0; + bounds.h = 0; return; + } std::string temp_text = text; diff --git a/src/WidgetLabel.h b/src/WidgetLabel.h index fe7fc30..9288006 100644 --- a/src/WidgetLabel.h +++ b/src/WidgetLabel.h @@ -67,6 +67,7 @@ int update_flag; bool hidden; bool window_resize_flag; + uint8_t alpha; Sprite *label; std::string text; @@ -89,6 +90,7 @@ void setText(const std::string& _text); void setColor(const Color& _color); void setFont(const std::string& _font); + void setAlpha(uint8_t _alpha); void setFromLabelInfo(const LabelInfo& label_info); std::string getText(); diff --git a/src/WidgetListBox.cpp b/src/WidgetListBox.cpp index ad4c12d..0e7e519 100644 --- a/src/WidgetListBox.cpp +++ b/src/WidgetListBox.cpp @@ -187,8 +187,10 @@ } } - if (!tip_data.isEmpty()) - tooltipm->push(tip_data, mouse, TooltipData::STYLE_FLOAT); + if (!tip_data.isEmpty()) { + Point new_mouse(mouse.x + local_frame.x - local_offset.x, mouse.y + local_frame.y - local_offset.y); + tooltipm->push(tip_data, new_mouse, TooltipData::STYLE_FLOAT); + } } /** diff --git a/src/WidgetLog.cpp b/src/WidgetLog.cpp index c71ca97..edc50d3 100644 --- a/src/WidgetLog.cpp +++ b/src/WidgetLog.cpp @@ -101,10 +101,7 @@ Image* render_target = scroll_box->contents->getGraphics(); if (!separators.empty() && separators[i-1]) { - for (int j=padding; j<padding+content_width; ++j) { - render_target->drawPixel(j, y2, font->getColor(FontEngine::COLOR_WIDGET_DISABLED)); - } - + render_target->drawLine(padding, y2, padding + content_width - 1, y2, font->getColor(FontEngine::COLOR_WIDGET_DISABLED)); y2 += paragraph_spacing; } font->renderShadowed(messages[i-1], padding, y2, FontEngine::JUSTIFY_LEFT, render_target, content_width, colors[i-1]); diff --git a/src/WidgetScrollBar.cpp b/src/WidgetScrollBar.cpp index c2f5700..687f3bf 100644 --- a/src/WidgetScrollBar.cpp +++ b/src/WidgetScrollBar.cpp @@ -136,6 +136,16 @@ int WidgetScrollBar::getValue() { return value; +} + +Rect WidgetScrollBar::getBounds() { + Rect r; + r.x = pos_up.x; + r.y = pos_up.y; + r.w = pos_up.w; + r.h = (pos_up.h * 2) + bar_height; + + return r; } void WidgetScrollBar::render() { diff --git a/src/WidgetScrollBar.h b/src/WidgetScrollBar.h index 5e7ee78..95d5896 100644 --- a/src/WidgetScrollBar.h +++ b/src/WidgetScrollBar.h @@ -50,6 +50,7 @@ int checkClickAt(int x, int y); void set(); int getValue(); + Rect getBounds(); void render(); void refresh(int x, int y, int h, int val, int max); diff --git a/src/WidgetScrollBox.cpp b/src/WidgetScrollBox.cpp index a28e438..bfda0a1 100644 --- a/src/WidgetScrollBox.cpp +++ b/src/WidgetScrollBox.cpp @@ -40,7 +40,7 @@ update = true; resize(width, height); tablist = TabList(); - tablist.setScrollType(SCROLL_VERTICAL); + tablist.setScrollType(SCROLL_TWO_DIRECTIONS); scroll_type = SCROLL_VERTICAL; } @@ -77,6 +77,7 @@ void WidgetScrollBox::clearChildWidgets() { currentChild = -1; children.clear(); + tablist.clear(); } void WidgetScrollBox::scroll(int amount) { @@ -102,13 +103,17 @@ } void WidgetScrollBox::scrollDown() { - int contents_height = (contents ? contents->getGraphicsHeight() : 0); - scroll((contents_height * 5) / 100); + int amount = pos.h / 4; + scroll(amount); } void WidgetScrollBox::scrollUp() { - int contents_height = (contents ? contents->getGraphicsHeight() : 0); - scroll(-((contents_height * 5) / 100)); + int amount = pos.h / 4; + scroll(-amount); +} + +void WidgetScrollBox::scrollToTop() { + scrollTo(0); } Point WidgetScrollBox::input_assist(const Point& mouse) { @@ -127,7 +132,14 @@ void WidgetScrollBox::logic() { logic(inpt->mouse.x,inpt->mouse.y); if (in_focus) { + if (currentChild == -1 && !children.empty()) + getNext(); tablist.logic(); + } + else { + // TODO don't run every frame + tablist.defocus(); + currentChild = -1; } } @@ -246,14 +258,15 @@ } update = false; - if (in_focus) { + if (in_focus && children.empty()) { Point topLeft; Point bottomRight; - - topLeft.x = dest.x + local_frame.x - local_offset.x; - topLeft.y = dest.y + local_frame.y - local_offset.y; - bottomRight.x = topLeft.x + dest.w; - bottomRight.y = topLeft.y + dest.h; + Rect sb_rect = scrollbar->getBounds(); + + topLeft.x = sb_rect.x + local_frame.x - local_offset.x; + topLeft.y = sb_rect.y + local_frame.y - local_offset.y; + bottomRight.x = topLeft.x + sb_rect.w; + bottomRight.y = topLeft.y + sb_rect.h; // Only draw rectangle if it fits in local frame bool draw = true; @@ -273,47 +286,77 @@ bool WidgetScrollBox::getNext() { if (children.empty()) { + int prev_cursor = cursor; + int bottom = contents ? contents->getGraphicsHeight() - pos.h : 0; + scrollDown(); + + if (cursor == bottom && prev_cursor == bottom) + return false; + return true; } - if (currentChild != -1) + if (currentChild != -1) { children[currentChild]->in_focus = false; - currentChild+=1; - currentChild = (static_cast<unsigned>(currentChild) == children.size()) ? 0 : currentChild; - - if (children[currentChild]->pos.y > (cursor + pos.h) || - (children[currentChild]->pos.y + children[currentChild]->pos.h) > (cursor + pos.h)) { - scrollTo(children[currentChild]->pos.y+children[currentChild]->pos.h-pos.h); - } - if (children[currentChild]->pos.y < cursor || - (children[currentChild]->pos.y + children[currentChild]->pos.h) < cursor) { + currentChild = tablist.getNextRelativeIndex(TabList::WIDGET_SELECT_DOWN); + tablist.setCurrent(children[currentChild]); + } + else { + // TODO neaten this up? + currentChild = 0; + tablist.setCurrent(children[currentChild]); + currentChild = tablist.getNextRelativeIndex(TabList::WIDGET_SELECT_DOWN); + tablist.setCurrent(children[currentChild]); + currentChild = tablist.getNextRelativeIndex(TabList::WIDGET_SELECT_UP); + tablist.setCurrent(children[currentChild]); + } + + if (currentChild != -1) { + children[currentChild]->in_focus = true; scrollTo(children[currentChild]->pos.y); } - children[currentChild]->in_focus = true; + else { + return false; + } + return true; } bool WidgetScrollBox::getPrev() { if (children.empty()) { + int prev_cursor = cursor; + scrollUp(); + + if (cursor == 0 && prev_cursor == 0) + return false; + return true; } - if (currentChild != -1) + if (currentChild != -1) { children[currentChild]->in_focus = false; - currentChild-=1; - currentChild = (currentChild < 0) ? static_cast<int>(children.size()) - 1 : currentChild; - - if (children[currentChild]->pos.y > (cursor + pos.h) || - (children[currentChild]->pos.y + children[currentChild]->pos.h) > (cursor + pos.h)) { - scrollTo(children[currentChild]->pos.y+children[currentChild]->pos.h-pos.h); - } - if (children[currentChild]->pos.y < cursor || - (children[currentChild]->pos.y + children[currentChild]->pos.h) < cursor) { + currentChild = tablist.getNextRelativeIndex(TabList::WIDGET_SELECT_UP); + tablist.setCurrent(children[currentChild]); + } + else { + currentChild = 0; + tablist.setCurrent(children[currentChild]); + currentChild = tablist.getNextRelativeIndex(TabList::WIDGET_SELECT_DOWN); + tablist.setCurrent(children[currentChild]); + currentChild = tablist.getNextRelativeIndex(TabList::WIDGET_SELECT_UP); + tablist.setCurrent(children[currentChild]); + } + + if (currentChild != -1) { + children[currentChild]->in_focus = true; scrollTo(children[currentChild]->pos.y); } - children[currentChild]->in_focus = true; + else { + return false; + } + return true; } diff --git a/src/WidgetScrollBox.h b/src/WidgetScrollBox.h index 064c70b..90c536b 100644 --- a/src/WidgetScrollBox.h +++ b/src/WidgetScrollBox.h @@ -56,6 +56,7 @@ int getCursor() { return cursor; } + void scrollToTop(); private: void scroll(int amount); diff --git a/src/WidgetSlider.cpp b/src/WidgetSlider.cpp index 11c5d52..c76def3 100644 --- a/src/WidgetSlider.cpp +++ b/src/WidgetSlider.cpp @@ -207,7 +207,10 @@ TooltipData tip_data; tip_data.addText(ss.str()); - tooltipm->push(tip_data, Point(pos_knob.x + pos_knob.w*2, pos_knob.y + (pos_knob.h/2)), TooltipData::STYLE_TOPLABEL); + Point new_mouse; + new_mouse.x = pos_knob.x + (pos_knob.w * 2) + local_frame.x - local_offset.x; + new_mouse.y = pos_knob.y + (pos_knob.h / 2) + local_frame.y - local_offset.y; + tooltipm->push(tip_data, new_mouse, TooltipData::STYLE_TOPLABEL); } } diff --git a/src/WidgetSlot.cpp b/src/WidgetSlot.cpp index 91e2793..8354942 100644 --- a/src/WidgetSlot.cpp +++ b/src/WidgetSlot.cpp @@ -31,17 +31,19 @@ #include "SharedResources.h" #include "WidgetSlot.h" -WidgetSlot::WidgetSlot(int _icon_id, int _ACTIVATE, int _size) +WidgetSlot::WidgetSlot(int _icon_id, int _ACTIVATE) : Widget() , slot_selected(NULL) , slot_checked(NULL) - , label_bg(NULL) + , label_amount_bg(NULL) + , label_hotkey_bg(NULL) , icon_id(_icon_id) , overlay_id(NO_ICON) , amount(1) , max_amount(1) , amount_str("") , activate_key(_ACTIVATE) + , hotkey(-1) , enabled(true) , checked(false) , pressed(false) @@ -49,6 +51,13 @@ { focusable = true; label_amount.setFromLabelInfo(eset->widgets.slot_quantity_label); + label_amount.setColor(eset->widgets.slot_quantity_color); + label_hotkey.setFromLabelInfo(eset->widgets.slot_hotkey_label); + label_hotkey.setColor(eset->widgets.slot_hotkey_color); + + // in case the hotkey string is long (we only have a fixed set of short keynames), keep the label width to the icon size + // TODO should this be done for the quantity as well? + label_hotkey.setMaxWidth(eset->resolutions.icon_size); pos.x = pos.y = 0; @@ -58,24 +67,12 @@ std::string selected_filename; std::string checked_filename; - if (_size == SIZE_SMALL) { - // SIZE_SMALL slots are half the size of SIZE_NORMAL slots - pos.w = eset->resolutions.icon_size / 2; - pos.h = eset->resolutions.icon_size / 2; - src.w = src.h = eset->resolutions.icon_size / 2; - - selected_filename = "images/menus/slot_selected_small.png"; - checked_filename = "images/menus/slot_checked_small.png"; - } - else { - // SIZE_NORMAL - pos.w = eset->resolutions.icon_size; - pos.h = eset->resolutions.icon_size; - src.w = src.h = eset->resolutions.icon_size; - - selected_filename = "images/menus/slot_selected.png"; - checked_filename = "images/menus/slot_checked.png"; - } + pos.w = eset->resolutions.icon_size; + pos.h = eset->resolutions.icon_size; + src.w = src.h = eset->resolutions.icon_size; + + selected_filename = "images/menus/slot_selected.png"; + checked_filename = "images/menus/slot_checked.png"; Image *graphics; graphics = render_device->loadImage(selected_filename, RenderDevice::ERROR_NORMAL); @@ -97,10 +94,16 @@ Widget::setPos(offset_x, offset_y); label_amount.setPos(pos.x + icons->text_offset.x, pos.y + icons->text_offset.y); - - if (label_bg) { + label_hotkey.setPos(pos.x + icons->text_offset.x, pos.y + icons->text_offset.y); + + if (label_amount_bg) { Rect *r = label_amount.getBounds(); - label_bg->setDest(r->x, r->y); + label_amount_bg->setDest(r->x, r->y); + } + + if (label_hotkey_bg) { + Rect *r = label_hotkey.getBounds(); + label_hotkey_bg->setDest(r->x, r->y); } } @@ -209,30 +212,62 @@ amount_str = Utils::abbreviateKilo(amount); - if (amount > 1 || max_amount > 1) { + if ((amount > 1 || max_amount > 1) && !eset->widgets.slot_quantity_label.hidden) { label_amount.setPos(pos.x + icons->text_offset.x, pos.y + icons->text_offset.y); label_amount.setText(amount_str); label_amount.local_frame = local_frame; label_amount.local_offset = local_offset; Rect* r = label_amount.getBounds(); - if (!label_bg || label_bg->getGraphicsWidth() != r->w || label_bg->getGraphicsHeight() != r->h) { - if (label_bg) { - delete label_bg; - label_bg = NULL; + if (!label_amount_bg || label_amount_bg->getGraphicsWidth() != r->w || label_amount_bg->getGraphicsHeight() != r->h) { + if (label_amount_bg) { + delete label_amount_bg; + label_amount_bg = NULL; } if (eset->widgets.slot_quantity_bg_color.a != 0) { Image *temp = render_device->createImage(r->w, r->h); if (temp) { temp->fillWithColor(eset->widgets.slot_quantity_bg_color); - label_bg = temp->createSprite(); + label_amount_bg = temp->createSprite(); temp->unref(); } } - if (label_bg) { - label_bg->setDest(r->x, r->y); + if (label_amount_bg) { + label_amount_bg->setDest(r->x, r->y); + } + } + } +} + +void WidgetSlot::setHotkey(int key) { + hotkey = key; + + if (hotkey != -1 && !eset->widgets.slot_hotkey_label.hidden) { + label_hotkey.setPos(pos.x + icons->text_offset.x, pos.y + icons->text_offset.y); + label_hotkey.setText(inpt->getBindingString(hotkey, InputState::BINDING_DEFAULT, InputState::GET_SHORT_STRING)); + label_hotkey.local_frame = local_frame; + label_hotkey.local_offset = local_offset; + + Rect* r = label_hotkey.getBounds(); + if (!label_hotkey_bg || label_hotkey_bg->getGraphicsWidth() != r->w || label_hotkey_bg->getGraphicsHeight() != r->h) { + if (label_hotkey_bg) { + delete label_hotkey_bg; + label_hotkey_bg = NULL; + } + + if (eset->widgets.slot_hotkey_bg_color.a != 0) { + Image *temp = render_device->createImage(r->w, r->h); + if (temp) { + temp->fillWithColor(eset->widgets.slot_hotkey_bg_color); + label_hotkey_bg = temp->createSprite(); + temp->unref(); + } + } + + if (label_hotkey_bg) { + label_hotkey_bg->setDest(r->x, r->y); } } } @@ -251,9 +286,19 @@ } if (amount > 1 || max_amount > 1) { - render_device->render(label_bg); + if (label_amount_bg) + render_device->render(label_amount_bg); label_amount.render(); } + } + if (hotkey != -1) { + // reload the hotkey label if keybindings have changed + if (inpt->refresh_hotkeys) + setHotkey(hotkey); + + if (label_hotkey_bg) + render_device->render(label_hotkey_bg); + label_hotkey.render(); } renderSelection(); } @@ -281,5 +326,6 @@ WidgetSlot::~WidgetSlot() { delete slot_selected; delete slot_checked; - delete label_bg; -} + delete label_amount_bg; + delete label_hotkey_bg; +} diff --git a/src/WidgetSlot.h b/src/WidgetSlot.h index 80cbae1..999781f 100644 --- a/src/WidgetSlot.h +++ b/src/WidgetSlot.h @@ -34,15 +34,18 @@ private: Sprite *slot_selected; Sprite *slot_checked; - Sprite *label_bg; + Sprite *label_amount_bg; + Sprite *label_hotkey_bg; WidgetLabel label_amount; + WidgetLabel label_hotkey; int icon_id; // current slot id int overlay_id; // icon id for the overlay image int amount; // entries amount in slot int max_amount; // if > 1 always display amount std::string amount_str; // formatted display of amount int activate_key; + int hotkey; // for display in label_hotkey only public: enum CLICK_TYPE { @@ -51,15 +54,10 @@ ACTIVATED = 2 }; - enum { - SIZE_NORMAL = 0, - SIZE_SMALL = 1 - }; - static const int NO_ICON = -1; static const int NO_OVERLAY = -1; - WidgetSlot(int _icon_id, int _activate_key, int _size); + WidgetSlot(int _icon_id, int _activate_key); ~WidgetSlot(); void setPos(int offset_x, int offset_y); @@ -75,6 +73,7 @@ int getIcon(); void setIcon(int _icon_id, int _overlay_id); void setAmount(int _amount, int _max_amount); + void setHotkey(int key); void render(); void renderSelection(); diff --git a/src/WidgetTabControl.cpp b/src/WidgetTabControl.cpp index e3b559a..f3406bd 100644 --- a/src/WidgetTabControl.cpp +++ b/src/WidgetTabControl.cpp @@ -56,9 +56,11 @@ tabs.resize(index+1); active_labels.resize(index+1); inactive_labels.resize(index+1); + enabled.resize(index+1); } titles[index] = title; + enabled[index] = true; } /** @@ -75,11 +77,26 @@ */ void WidgetTabControl::setActiveTab(unsigned tab) { if (tab > tabs.size()) - active_tab = 0; + tab = 0; else if (tab == tabs.size()) - active_tab = static_cast<unsigned>(tabs.size())-1; - else - active_tab = tab; + tab = static_cast<unsigned>(tabs.size()-1); + + // Set the tab. If the specified tab is not enabled, get the first enabled tab. + for (unsigned i = tab; tab < tabs.size(); ++i) { + if (enabled[i]) { + active_tab = i; + return; + } + } + for (unsigned i = 0; i < tab; ++i) { + if (enabled[i]) { + active_tab = i; + return; + } + } + + // no enabled tabs, just return what we started with + active_tab = tab; } /** @@ -96,13 +113,14 @@ tabs_area.w = 0; tabs_area.h = getTabHeight(); + int x_offset = tabs_area.x; + // update individual tabs for (unsigned i=0; i<tabs.size(); i++) { tabs[i].y = tabs_area.y; tabs[i].h = tabs_area.h; - if (i==0) tabs[i].x = tabs_area.x; - else tabs[i].x = tabs[i-1].x + tabs[i-1].w; + tabs[i].x = x_offset; active_labels[i].setPos(tabs[i].x + eset->widgets.tab_padding.x, tabs[i].y + tabs[i].h/2 + eset->widgets.tab_padding.y); active_labels[i].setVAlign(LabelInfo::VALIGN_CENTER); @@ -114,9 +132,15 @@ inactive_labels[i].setText(titles[i]); inactive_labels[i].setColor(font->getColor(FontEngine::COLOR_WIDGET_DISABLED)); - tabs[i].w = active_labels[i].getBounds()->w + (eset->widgets.tab_padding.x * 2); - tabs_area.w += tabs[i].w; - } + if (enabled[i]) { + tabs[i].w = active_labels[i].getBounds()->w + (eset->widgets.tab_padding.x * 2); + tabs_area.w += tabs[i].w; + x_offset += tabs[i].w; + } + } + + if (!enabled[active_tab]) + getNext(); } /** @@ -152,7 +176,7 @@ if(Utils::isWithinRect(tabs_area, mouse) && inpt->pressing[Input::MAIN1]) { // Mark the clicked tab as active_tab. for (unsigned i=0; i<tabs.size(); i++) { - if(Utils::isWithinRect(tabs[i], mouse)) { + if(Utils::isWithinRect(tabs[i], mouse) && enabled[i]) { active_tab = i; return; } @@ -188,6 +212,9 @@ * Renders the given tab on the widget header. */ void WidgetTabControl::renderTab(unsigned number) { + if (!enabled[number]) + return; + unsigned i = number; Rect src; Rect dest; @@ -265,15 +292,38 @@ } bool WidgetTabControl::getNext() { - setActiveTab(++active_tab); + setActiveTab(getNextEnabledTab(active_tab)); return true; } bool WidgetTabControl::getPrev() { - setActiveTab(--active_tab); + setActiveTab(getPrevEnabledTab(active_tab)); return true; +} + +unsigned WidgetTabControl::getNextEnabledTab(unsigned tab) { + for (unsigned i = tab+1; i < tabs.size(); ++i) { + if (enabled[i]) + return i; + } + return tab; +} + +unsigned WidgetTabControl::getPrevEnabledTab(unsigned tab) { + for (unsigned i = tab-1; i < tabs.size(); i--) { + if (enabled[i]) + return i; + } + return tab; } int WidgetTabControl::getTabHeight() { return (active_tab_surface ? active_tab_surface->getGraphicsHeight() : 0); } + +void WidgetTabControl::setEnabled(unsigned index, bool val) { + if (index >= enabled.size()) + return; + + enabled[index] = val; +} diff --git a/src/WidgetTabControl.h b/src/WidgetTabControl.h index c792814..fa70c95 100644 --- a/src/WidgetTabControl.h +++ b/src/WidgetTabControl.h @@ -29,6 +29,9 @@ void loadGraphics(); void renderTab(unsigned number); + unsigned getNextEnabledTab(unsigned tab); + unsigned getPrevEnabledTab(unsigned tab); + Sprite *active_tab_surface; Sprite *inactive_tab_surface; @@ -36,6 +39,7 @@ std::vector<Rect> tabs; // Rectangles for each tab title on the tab header. std::vector<WidgetLabel> active_labels; std::vector<WidgetLabel> inactive_labels; + std::vector<bool> enabled; unsigned active_tab; // Index of the currently active tab. @@ -54,6 +58,8 @@ int getTabHeight(); + void setEnabled(unsigned index, bool val); + void logic(); void logic(int x, int y); void render(); diff --git a/src/WidgetTooltip.cpp b/src/WidgetTooltip.cpp index 07e65f5..5a66682 100644 --- a/src/WidgetTooltip.cpp +++ b/src/WidgetTooltip.cpp @@ -31,9 +31,11 @@ #include "Utils.h" #include "WidgetTooltip.h" -WidgetTooltip::WidgetTooltip() { - background = render_device->loadImage("images/menus/tooltips.png", RenderDevice::ERROR_NONE); - sprite_buf = NULL; +WidgetTooltip::WidgetTooltip() + : parent(NULL) + , background(render_device->loadImage("images/menus/tooltips.png", RenderDevice::ERROR_NONE)) + , sprite_buf(NULL) +{ } WidgetTooltip::~WidgetTooltip() { @@ -48,7 +50,6 @@ * calculate the starting position of the background and text */ Point WidgetTooltip::calcPosition(uint8_t style, const Point& pos, const Point& size) { - Point tip_pos; // TopLabel style is fixed and centered over the origin @@ -62,32 +63,56 @@ else if (style == TooltipData::STYLE_FLOAT) { // upper left if (pos.x < settings->view_w_half && pos.y < settings->view_h_half) { - tip_pos.x = pos.x + eset->tooltips.offset; + if (parent) + tip_pos.x = parent->bounds.x + parent->bounds.w; + else + tip_pos.x = pos.x + eset->tooltips.offset; + tip_pos.y = pos.y + eset->tooltips.offset; } // upper right else if (pos.x >= settings->view_w_half && pos.y < settings->view_h_half) { - tip_pos.x = pos.x - eset->tooltips.offset - size.x; + if (parent) + tip_pos.x = parent->bounds.x - size.x; + else + tip_pos.x = pos.x - eset->tooltips.offset - size.x; + tip_pos.y = pos.y + eset->tooltips.offset; } // lower left else if (pos.x < settings->view_w_half && pos.y >= settings->view_h_half) { - tip_pos.x = pos.x + eset->tooltips.offset; + if (parent) + tip_pos.x = parent->bounds.x + parent->bounds.w; + else + tip_pos.x = pos.x + eset->tooltips.offset; + tip_pos.y = pos.y - eset->tooltips.offset - size.y; } // lower right else if (pos.x >= settings->view_w_half && pos.y >= settings->view_h_half) { - tip_pos.x = pos.x - eset->tooltips.offset - size.x; + if (parent) + tip_pos.x = parent->bounds.x - size.x; + else + tip_pos.x = pos.x - eset->tooltips.offset - size.x; + tip_pos.y = pos.y - eset->tooltips.offset - size.y; } // very large tooltips might still be off screen at this point // so we try to constrain them to the screen bounds // we give priority to being able to read the top-left of the tooltip over the bottom-right - if (tip_pos.x + size.x > settings->view_w) tip_pos.x = settings->view_w - size.x; - if (tip_pos.y + size.y > settings->view_h) tip_pos.y = settings->view_h - size.y; - if (tip_pos.x < 0) tip_pos.x = 0; - if (tip_pos.y < 0) tip_pos.y = 0; + // EXCEPTION: If the tooltip is a child of another, we don't constrain the x-axis + if (tip_pos.x + size.x > settings->view_w && !parent) + tip_pos.x = settings->view_w - size.x; + + if (tip_pos.y + size.y > settings->view_h) + tip_pos.y = settings->view_h - size.y; + + if (tip_pos.x < 0 && !parent) + tip_pos.x = 0; + + if (tip_pos.y < 0) + tip_pos.y = 0; } return tip_pos; diff --git a/src/WidgetTooltip.h b/src/WidgetTooltip.h index 0b0be24..0bdc0da 100644 --- a/src/WidgetTooltip.h +++ b/src/WidgetTooltip.h @@ -39,6 +39,7 @@ bool createBuffer(TooltipData &tip); Rect bounds; + WidgetTooltip *parent; private: Image *background; diff --git a/src/api/MapSaver.cpp b/src/api/MapSaver.cpp index e6a5e48..74882d1 100644 --- a/src/api/MapSaver.cpp +++ b/src/api/MapSaver.cpp @@ -15,49 +15,54 @@ FLARE. If not, see http://www.gnu.org/licenses/ */ +#ifdef FLARE_MAP_SAVER + #include "MapSaver.h" #include "Settings.h" MapSaver::MapSaver(Map *_map) : map(_map) { - EVENT_COMPONENT_NAME[EC_TOOLTIP] = "tooltip"; - EVENT_COMPONENT_NAME[EC_POWER_PATH] = "power_path"; - EVENT_COMPONENT_NAME[EC_POWER_DAMAGE] = "power_damage"; - EVENT_COMPONENT_NAME[EC_INTERMAP] = "intermap"; - EVENT_COMPONENT_NAME[EC_INTRAMAP] = "intramap"; - EVENT_COMPONENT_NAME[EC_MAPMOD] = "mapmod"; - EVENT_COMPONENT_NAME[EC_SOUNDFX] = "soundfx"; - EVENT_COMPONENT_NAME[EC_LOOT] = "loot"; // HALF-IMPLEMENTED - EVENT_COMPONENT_NAME[EC_LOOT_COUNT] = "loot_count"; // UNIMPLEMENTED - EVENT_COMPONENT_NAME[EC_MSG] = "msg"; - EVENT_COMPONENT_NAME[EC_SHAKYCAM] = "shakycam"; - EVENT_COMPONENT_NAME[EC_REQUIRES_STATUS] = "requires_status"; - EVENT_COMPONENT_NAME[EC_REQUIRES_NOT_STATUS] = "requires_not_status"; - EVENT_COMPONENT_NAME[EC_REQUIRES_LEVEL] = "requires_level"; - EVENT_COMPONENT_NAME[EC_REQUIRES_NOT_LEVEL] = "requires_not_level"; - EVENT_COMPONENT_NAME[EC_REQUIRES_CURRENCY] = "requires_currency"; - EVENT_COMPONENT_NAME[EC_REQUIRES_NOT_CURRENCY] = "requires_not_currency"; - EVENT_COMPONENT_NAME[EC_REQUIRES_ITEM] = "requires_item"; - EVENT_COMPONENT_NAME[EC_REQUIRES_NOT_ITEM] = "requires_not_item"; - EVENT_COMPONENT_NAME[EC_REQUIRES_CLASS] = "requires_class"; - EVENT_COMPONENT_NAME[EC_REQUIRES_NOT_CLASS] = "requires_not_class"; - EVENT_COMPONENT_NAME[EC_SET_STATUS] = "set_status"; - EVENT_COMPONENT_NAME[EC_UNSET_STATUS] = "unset_status"; - EVENT_COMPONENT_NAME[EC_REMOVE_CURRENCY] = "remove_currency"; - EVENT_COMPONENT_NAME[EC_REMOVE_ITEM] = "remove_item"; - EVENT_COMPONENT_NAME[EC_REWARD_XP] = "reward_xp"; - EVENT_COMPONENT_NAME[EC_REWARD_CURRENCY] = "reward_currency"; - EVENT_COMPONENT_NAME[EC_REWARD_ITEM] = "reward_item"; - EVENT_COMPONENT_NAME[EC_RESTORE] = "restore"; - EVENT_COMPONENT_NAME[EC_POWER] = "power"; - EVENT_COMPONENT_NAME[EC_SPAWN] = "spawn"; - EVENT_COMPONENT_NAME[EC_STASH] = "stash"; - EVENT_COMPONENT_NAME[EC_NPC] = "npc"; - EVENT_COMPONENT_NAME[EC_MUSIC] = "music"; - EVENT_COMPONENT_NAME[EC_CUTSCENE] = "cutscene"; - EVENT_COMPONENT_NAME[EC_REPEAT] = "repeat"; - EVENT_COMPONENT_NAME[EC_SAVE_GAME] = "save_game"; - EVENT_COMPONENT_NAME[EC_BOOK] = "book"; + EVENT_COMPONENT_NAME[EC::TOOLTIP] = "tooltip"; + EVENT_COMPONENT_NAME[EC::POWER_PATH] = "power_path"; + EVENT_COMPONENT_NAME[EC::POWER_DAMAGE] = "power_damage"; + EVENT_COMPONENT_NAME[EC::INTERMAP] = "intermap"; + EVENT_COMPONENT_NAME[EC::INTRAMAP] = "intramap"; + EVENT_COMPONENT_NAME[EC::MAPMOD] = "mapmod"; + EVENT_COMPONENT_NAME[EC::SOUNDFX] = "soundfx"; + EVENT_COMPONENT_NAME[EC::LOOT] = "loot"; // HALF-IMPLEMENTED + EVENT_COMPONENT_NAME[EC::LOOT_COUNT] = "loot_count"; // UNIMPLEMENTED + EVENT_COMPONENT_NAME[EC::MSG] = "msg"; + EVENT_COMPONENT_NAME[EC::SHAKYCAM] = "shakycam"; + EVENT_COMPONENT_NAME[EC::REQUIRES_STATUS] = "requires_status"; + EVENT_COMPONENT_NAME[EC::REQUIRES_NOT_STATUS] = "requires_not_status"; + EVENT_COMPONENT_NAME[EC::REQUIRES_LEVEL] = "requires_level"; + EVENT_COMPONENT_NAME[EC::REQUIRES_NOT_LEVEL] = "requires_not_level"; + EVENT_COMPONENT_NAME[EC::REQUIRES_CURRENCY] = "requires_currency"; + EVENT_COMPONENT_NAME[EC::REQUIRES_NOT_CURRENCY] = "requires_not_currency"; + EVENT_COMPONENT_NAME[EC::REQUIRES_ITEM] = "requires_item"; + EVENT_COMPONENT_NAME[EC::REQUIRES_NOT_ITEM] = "requires_not_item"; + EVENT_COMPONENT_NAME[EC::REQUIRES_CLASS] = "requires_class"; + EVENT_COMPONENT_NAME[EC::REQUIRES_NOT_CLASS] = "requires_not_class"; + EVENT_COMPONENT_NAME[EC::SET_STATUS] = "set_status"; + EVENT_COMPONENT_NAME[EC::UNSET_STATUS] = "unset_status"; + EVENT_COMPONENT_NAME[EC::REMOVE_CURRENCY] = "remove_currency"; + EVENT_COMPONENT_NAME[EC::REMOVE_ITEM] = "remove_item"; + EVENT_COMPONENT_NAME[EC::REWARD_XP] = "reward_xp"; + EVENT_COMPONENT_NAME[EC::REWARD_CURRENCY] = "reward_currency"; + EVENT_COMPONENT_NAME[EC::REWARD_ITEM] = "reward_item"; + EVENT_COMPONENT_NAME[EC::RESTORE] = "restore"; + EVENT_COMPONENT_NAME[EC::POWER] = "power"; + EVENT_COMPONENT_NAME[EC::SPAWN] = "spawn"; + EVENT_COMPONENT_NAME[EC::STASH] = "stash"; + EVENT_COMPONENT_NAME[EC::NPC] = "npc"; + EVENT_COMPONENT_NAME[EC::MUSIC] = "music"; + EVENT_COMPONENT_NAME[EC::CUTSCENE] = "cutscene"; + EVENT_COMPONENT_NAME[EC::REPEAT] = "repeat"; + EVENT_COMPONENT_NAME[EC::SAVE_GAME] = "save_game"; + EVENT_COMPONENT_NAME[EC::BOOK] = "book"; + EVENT_COMPONENT_NAME[EC::SCRIPT] = "script"; + EVENT_COMPONENT_NAME[EC::CHANCE_EXEC] = "chance_exec"; + EVENT_COMPONENT_NAME[EC::RESPEC] = "respec"; dest_file = map->getFilename(); } @@ -361,7 +366,7 @@ { Event_Component e = components[i]; - if (e.type > 0 && e.type < 39) + if (e.type > 0 && e.type < EC_COUNT) { map_file << EVENT_COMPONENT_NAME[e.type] << "="; } @@ -370,10 +375,10 @@ continue; } - if (e.type == EC_TOOLTIP) { - map_file << e.s << std::endl; - } - else if (e.type == EC_POWER_PATH) { + if (e.type == EC::TOOLTIP) { + map_file << e.s << std::endl; + } + else if (e.type == EC::POWER_PATH) { map_file << e.x << "," << e.y << ","; if (e.s == "hero") { @@ -384,19 +389,19 @@ map_file << e.a << "," << e.b << std::endl; } } - else if (e.type == EC_POWER_DAMAGE) { + else if (e.type == EC::POWER_DAMAGE) { map_file << e.a << "," << e.b << std::endl; } - else if (e.type == EC_INTERMAP) { + else if (e.type == EC::INTERMAP) { map_file << e.s << "," << e.x << "," << e.y << std::endl; } - else if (e.type == EC_INTRAMAP) { + else if (e.type == EC::INTRAMAP) { map_file << e.x << "," << e.y << std::endl; } - else if (e.type == EC_MAPMOD) { + else if (e.type == EC::MAPMOD) { map_file << e.s << "," << e.x << "," << e.y << "," << e.z; - while (i+1 < components.size() && components[i+1].type == EC_MAPMOD) + while (i+1 < components.size() && components[i+1].type == EC::MAPMOD) { i++; e = components[i]; @@ -404,7 +409,7 @@ } map_file << std::endl; } - else if (e.type == EC_SOUNDFX) { + else if (e.type == EC::SOUNDFX) { map_file << e.s; if (e.x != -1 && e.y != -1) { @@ -412,7 +417,7 @@ } map_file << std::endl; } - else if (e.type == EC_LOOT) { + else if (e.type == EC::LOOT) { std::stringstream chance; @@ -423,7 +428,7 @@ map_file << e.s << "," << chance.str() << "," << e.a << "," << e.b; - while (i+1 < components.size() && components[i+1].type == EC_LOOT) + while (i+1 < components.size() && components[i+1].type == EC::LOOT) { i++; e = components[i]; @@ -439,15 +444,15 @@ // UNIMPLEMENTED // Loot tables not supported } - else if (e.type == EC_LOOT_COUNT) { + else if (e.type == EC::LOOT_COUNT) { // UNIMPLEMENTED // Loot count not supported map_file << std::endl; } - else if (e.type == EC_MSG) { - map_file << e.s << std::endl; - } - else if (e.type == EC_SHAKYCAM) { + else if (e.type == EC::MSG) { + map_file << e.s << std::endl; + } + else if (e.type == EC::SHAKYCAM) { std::string suffix = "ms"; int value = static_cast<int>(1000.f * e.x / MAX_FRAMES_PER_SEC); if (value % 1000 == 0) @@ -457,10 +462,10 @@ } map_file << value << suffix << std::endl; } - else if (e.type == EC_REQUIRES_STATUS) { + else if (e.type == EC::REQUIRES_STATUS) { map_file << e.s; - while (i+1 < components.size() && components[i+1].type == EC_REQUIRES_STATUS) + while (i+1 < components.size() && components[i+1].type == EC::REQUIRES_STATUS) { i++; e = components[i]; @@ -468,10 +473,10 @@ } map_file << std::endl; } - else if (e.type == EC_REQUIRES_NOT_STATUS) { + else if (e.type == EC::REQUIRES_NOT_STATUS) { map_file << e.s; - while (i+1 < components.size() && components[i+1].type == EC_REQUIRES_NOT_STATUS) + while (i+1 < components.size() && components[i+1].type == EC::REQUIRES_NOT_STATUS) { i++; e = components[i]; @@ -479,22 +484,22 @@ } map_file << std::endl; } - else if (e.type == EC_REQUIRES_LEVEL) { - map_file << e.x << std::endl; - } - else if (e.type == EC_REQUIRES_NOT_LEVEL) { - map_file << e.x << std::endl; - } - else if (e.type == EC_REQUIRES_CURRENCY) { - map_file << e.x << std::endl; - } - else if (e.type == EC_REQUIRES_NOT_CURRENCY) { - map_file << e.x << std::endl; - } - else if (e.type == EC_REQUIRES_ITEM) { + else if (e.type == EC::REQUIRES_LEVEL) { + map_file << e.x << std::endl; + } + else if (e.type == EC::REQUIRES_NOT_LEVEL) { + map_file << e.x << std::endl; + } + else if (e.type == EC::REQUIRES_CURRENCY) { + map_file << e.x << std::endl; + } + else if (e.type == EC::REQUIRES_NOT_CURRENCY) { + map_file << e.x << std::endl; + } + else if (e.type == EC::REQUIRES_ITEM) { map_file << e.x; - while (i+1 < components.size() && components[i+1].type == EC_REQUIRES_ITEM) + while (i+1 < components.size() && components[i+1].type == EC::REQUIRES_ITEM) { i++; e = components[i]; @@ -502,10 +507,10 @@ } map_file << std::endl; } - else if (e.type == EC_REQUIRES_NOT_ITEM) { + else if (e.type == EC::REQUIRES_NOT_ITEM) { map_file << e.x; - while (i+1 < components.size() && components[i+1].type == EC_REQUIRES_NOT_ITEM) + while (i+1 < components.size() && components[i+1].type == EC::REQUIRES_NOT_ITEM) { i++; e = components[i]; @@ -513,16 +518,16 @@ } map_file << std::endl; } - else if (e.type == EC_REQUIRES_CLASS) { - map_file << e.s << std::endl; - } - else if (e.type == EC_REQUIRES_NOT_CLASS) { - map_file << e.s << std::endl; - } - else if (e.type == EC_SET_STATUS) { + else if (e.type == EC::REQUIRES_CLASS) { + map_file << e.s << std::endl; + } + else if (e.type == EC::REQUIRES_NOT_CLASS) { + map_file << e.s << std::endl; + } + else if (e.type == EC::SET_STATUS) { map_file << e.s; - while (i+1 < components.size() && components[i+1].type == EC_SET_STATUS) + while (i+1 < components.size() && components[i+1].type == EC::SET_STATUS) { i++; e = components[i]; @@ -530,10 +535,10 @@ } map_file << std::endl; } - else if (e.type == EC_UNSET_STATUS) { + else if (e.type == EC::UNSET_STATUS) { map_file << e.s; - while (i+1 < components.size() && components[i+1].type == EC_UNSET_STATUS) + while (i+1 < components.size() && components[i+1].type == EC::UNSET_STATUS) { i++; e = components[i]; @@ -541,13 +546,13 @@ } map_file << std::endl; } - else if (e.type == EC_REMOVE_CURRENCY) { - map_file << e.x << std::endl; - } - else if (e.type == EC_REMOVE_ITEM) { + else if (e.type == EC::REMOVE_CURRENCY) { + map_file << e.x << std::endl; + } + else if (e.type == EC::REMOVE_ITEM) { map_file << e.x; - while (i+1 < components.size() && components[i+1].type == EC_REMOVE_ITEM) + while (i+1 < components.size() && components[i+1].type == EC::REMOVE_ITEM) { i++; e = components[i]; @@ -555,26 +560,26 @@ } map_file << std::endl; } - else if (e.type == EC_REWARD_XP) { - map_file << e.x << std::endl; - } - else if (e.type == EC_REWARD_CURRENCY) { - map_file << e.x << std::endl; - } - else if (e.type == EC_REWARD_ITEM) { + else if (e.type == EC::REWARD_XP) { + map_file << e.x << std::endl; + } + else if (e.type == EC::REWARD_CURRENCY) { + map_file << e.x << std::endl; + } + else if (e.type == EC::REWARD_ITEM) { map_file << e.x << ","; map_file << e.y << std::endl; } - else if (e.type == EC_RESTORE) { - map_file << e.s << std::endl; - } - else if (e.type == EC_POWER) { - map_file << e.x << std::endl; - } - else if (e.type == EC_SPAWN) { + else if (e.type == EC::RESTORE) { + map_file << e.s << std::endl; + } + else if (e.type == EC::POWER) { + map_file << e.x << std::endl; + } + else if (e.type == EC::SPAWN) { map_file << e.s << "," << e.x << "," << e.y; - while (i+1 < components.size() && components[i+1].type == EC_SPAWN) + while (i+1 < components.size() && components[i+1].type == EC::SPAWN) { i++; e = components[i]; @@ -582,26 +587,44 @@ } map_file << std::endl; } - else if (e.type == EC_STASH) { - map_file << e.s << std::endl; - } - else if (e.type == EC_NPC) { - map_file << e.s << std::endl; - } - else if (e.type == EC_MUSIC) { - map_file << e.s << std::endl; - } - else if (e.type == EC_CUTSCENE) { - map_file << e.s << std::endl; - } - else if (e.type == EC_REPEAT) { - map_file << e.s << std::endl; - } - else if (e.type == EC_SAVE_GAME) { - map_file << e.s << std::endl; - } - else if (e.type == EC_BOOK) { - map_file << e.s << std::endl; - } + else if (e.type == EC::STASH) { + map_file << e.s << std::endl; + } + else if (e.type == EC::NPC) { + map_file << e.s << std::endl; + } + else if (e.type == EC::MUSIC) { + map_file << e.s << std::endl; + } + else if (e.type == EC::CUTSCENE) { + map_file << e.s << std::endl; + } + else if (e.type == EC::REPEAT) { + map_file << e.s << std::endl; + } + else if (e.type == EC::SAVE_GAME) { + map_file << e.s << std::endl; + } + else if (e.type == EC::BOOK) { + map_file << e.s << std::endl; + } + else if (e.type == EC::SCRIPT) { + map_file << e.s << std::endl; + } + else if (e.type == EC::CHANCE_EXEC) { + map_file << e.x << std::endl; + } + else if (e.type == EC::RESPEC) { + if (e.x == 3) + map_file << "xp"; + else if (e.x == 2) + map_file << "stats"; + else if (e.x == 1) + map_file << "powers"; + + map_file << "," << e.y << endl; } } + +#endif //FLARE_MAP_SAVER + diff --git a/src/api/MapSaver.h b/src/api/MapSaver.h index 88dc7da..9071a71 100644 --- a/src/api/MapSaver.h +++ b/src/api/MapSaver.h @@ -18,6 +18,8 @@ /* * class MapSaver */ + +#ifdef FLARE_MAP_SAVER #ifndef MAP_SAVER_H #define MAP_SAVER_H @@ -44,7 +46,86 @@ Map* map; std::string dest_file; - std::string EVENT_COMPONENT_NAME[39]; + static const int EC_COUNT = 43; + + std::string EVENT_COMPONENT_NAME[EC_COUNT]; + + class EC { + public: + enum { + NONE = 0, + TOOLTIP = 1, + POWER_PATH = 2, + POWER_DAMAGE = 3, + INTERMAP = 4, + INTRAMAP = 5, + MAPMOD = 6, + SOUNDFX = 7, + LOOT = 8, + LOOT_COUNT = 9, + MSG = 10, + SHAKYCAM = 11, + REQUIRES_STATUS = 12, + REQUIRES_NOT_STATUS = 13, + REQUIRES_LEVEL = 14, + REQUIRES_NOT_LEVEL = 15, + REQUIRES_CURRENCY = 16, + REQUIRES_NOT_CURRENCY = 17, + REQUIRES_ITEM = 18, + REQUIRES_NOT_ITEM = 19, + REQUIRES_CLASS = 20, + REQUIRES_NOT_CLASS = 21, + SET_STATUS = 22, + UNSET_STATUS = 23, + REMOVE_CURRENCY = 24, + REMOVE_ITEM = 25, + REWARD_XP = 26, + REWARD_CURRENCY = 27, + REWARD_ITEM = 28, + REWARD_LOOT = 29, + REWARD_LOOT_COUNT = 30, + RESTORE = 31, + POWER = 32, + SPAWN = 33, + STASH = 34, + NPC = 35, + MUSIC = 36, + CUTSCENE = 37, + REPEAT = 38, + SAVE_GAME = 39, + BOOK = 40, + SCRIPT = 41, + CHANCE_EXEC = 42, + RESPEC = 43, + }; + + int type; + std::string s; + StatusID status; + int x; + int y; + int z; + int a; + int b; + int c; + float f; + + EC() + : type(NONE) + , s("") + , status(0) + , x(0) + , y(0) + , z(0) + , a(0) + , b(0) + , c(0) + , f(0) { + } + }; + }; #endif //MAP_SAVER + +#endif //FLARE_MAP_SAVER diff --git a/src/main.cpp b/src/main.cpp index be16452..4091e82 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -89,6 +89,11 @@ Utils::createLogFile(); Utils::logInfo(VersionInfo::createVersionStringFull().c_str()); + // log common paths + Utils::logInfo("main: PATH_CONF = '%s'", settings->path_conf.c_str()); + Utils::logInfo("main: PATH_USER = '%s'", settings->path_user.c_str()); + Utils::logInfo("main: PATH_DATA = '%s'", settings->path_data.c_str()); + // SDL Inits if ( SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0 ) { Utils::logError("main: Could not initialize SDL: %s", SDL_GetError()); @@ -118,19 +123,23 @@ font = getFontEngine(); anim = new AnimationManager(); comb = new CombatText(); - inpt = getInputManager(); - icons = NULL; // Load miscellaneous settings eset = new EngineSettings(); eset->load(); + + inpt = getInputManager(); + icons = NULL; + Stats::init(); // platform-specific default screen size platform.setScreenSize(); // Create render Device and Rendering Context. - if (platform.default_renderer != "") + if (settings->safe_video) + render_device = getRenderDevice(settings->render_device_name); + else if (platform.default_renderer != "") render_device = getRenderDevice(platform.default_renderer); else if (cmd_line_args.render_device_name != "") render_device = getRenderDevice(cmd_line_args.render_device_name); @@ -358,11 +367,13 @@ settings->custom_path_data = std::string(getenv("HOME")) + "/" + path_end; } - if (!settings->custom_path_data.empty() && settings->custom_path_data.at(settings->custom_path_data.length()-1) != '/') - settings->custom_path_data += "/"; + if (!settings->custom_path_data.empty()) { + settings->custom_path_data = Filesystem::removeTrailingSlash(settings->custom_path_data); + } if (Filesystem::pathExists(settings->custom_path_data)) { Utils::logInfo("Custom data path: \"%s\"", settings->custom_path_data.c_str()); + settings->custom_path_data += "/"; } else { Utils::logError("Invalid custom data path: \"%s\"", settings->custom_path_data.c_str()); @@ -370,7 +381,7 @@ } } else if (arg == "version") { - printf("%s\n", VersionInfo::createVersionStringFull().c_str()); + Utils::logInfo("%s", VersionInfo::createVersionStringFull().c_str()); done = true; } else if (arg == "renderer") { @@ -391,8 +402,11 @@ else if (arg == "load-script") { settings->load_script = parseArgValue(arg_full); } + else if (arg == "safe-video") { + settings->safe_video = true; + } else if (arg == "help") { - printf("\ + Utils::logInfo("Command line options:\n\ --help Prints this message.\n\ --version Prints the release version.\n\ --data-path=<PATH> Specifies an exact path to look for mod data.\n\ @@ -403,7 +417,8 @@ --mods=<MOD>,... Starts the game with only these mods enabled.\n\ --load-slot=<SLOT> Loads a save slot by numerical index.\n\ --load-script=<SCRIPT> Execute's a script upon loading a saved game.\n\ - The script path is mod-relative.\n"); + The script path is mod-relative.\n\ +--safe-video Launches with the minimum video settings."); done = true; } else { @@ -416,7 +431,7 @@ srand(static_cast<unsigned int>(time(NULL))); #ifdef __EMSCRIPTEN__ platform.FSInit(); - emscripten_set_main_loop(EmscriptenMainLoop, 0, 1); + emscripten_set_main_loop(EmscriptenMainLoop, settings->max_frames_per_sec, 1); #else init(cmd_line_args); diff --git a/wiki.xslt b/wiki.xslt new file mode 100644 index 0000000..1ab5144 --- /dev/null +++ b/wiki.xslt @@ -0,0 +1,107 @@ +<?xml version="1.0"?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + +<xsl:template name="escape_underscore"> + <xsl:param name="text" /> + <xsl:choose> + <xsl:when test="contains($text, '_')"> + <xsl:value-of select="substring-before($text,'_')" /> + <xsl:value-of select="'\_'" /> + <xsl:call-template name="escape_underscore"> + <xsl:with-param name="text" select="substring-after($text,'_')" /> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$text" /> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="/classes"> +<xsl:for-each select="class"> +<xsl:text> </xsl:text> +<xsl:variable name="class-name"> +<xsl:call-template name="escape_underscore"> +<xsl:with-param name="text" select="@name" /> +</xsl:call-template> +</xsl:variable> +<xsl:variable name="class-desc"> +<xsl:call-template name="escape_underscore"> +<xsl:with-param name="text" select="description" /> +</xsl:call-template> +</xsl:variable> +<xsl:if test="attributes/attribute"> +*** +#### <xsl:value-of select="$class-name"/> +<xsl:text> </xsl:text> +<xsl:value-of select="$class-desc"/> +<xsl:text> </xsl:text> +</xsl:if> +<xsl:for-each select="attributes/attribute"> +<xsl:variable name="attr-name"> +<xsl:call-template name="escape_underscore"> +<xsl:with-param name="text" select="@name" /> +</xsl:call-template> +</xsl:variable> +<xsl:variable name="attr-type"> +<!-- Don't need to escape this because we put it in code tags --> +<xsl:value-of select="@type"/> +</xsl:variable> +<xsl:variable name="attr-vars"> +<!-- Don't need to escape this because we put it in code tags --> +<xsl:value-of select="@vars"/> +</xsl:variable> +<xsl:variable name="attr-desc"> +<xsl:call-template name="escape_underscore"> +<xsl:with-param name="text" select="." /> +</xsl:call-template> +</xsl:variable> +**<xsl:value-of select="$attr-name"/>** | `<xsl:value-of select="$attr-type"/><xsl:if test="$attr-vars != ''"> : <xsl:value-of select="$attr-vars"/></xsl:if>` | <xsl:value-of select="$attr-desc"/> +<xsl:text> </xsl:text> +</xsl:for-each> +<xsl:text> </xsl:text> +</xsl:for-each> +*** +### Predefined Strings +<xsl:text> </xsl:text> +Below are some strings that are used in various attributes. +<xsl:for-each select="class"> +<xsl:text> </xsl:text> +<xsl:variable name="class-name"> +<xsl:call-template name="escape_underscore"> +<xsl:with-param name="text" select="@name" /> +</xsl:call-template> +</xsl:variable> +<xsl:variable name="class-desc"> +<xsl:call-template name="escape_underscore"> +<xsl:with-param name="text" select="description" /> +</xsl:call-template> +</xsl:variable> +<xsl:if test="attributes/type"> +*** +#### <xsl:value-of select="$class-name"/> +<xsl:text> </xsl:text> +<xsl:value-of select="$class-desc"/> +<xsl:text> </xsl:text> +</xsl:if> +<xsl:for-each select="attributes/type"> +<xsl:variable name="type-name"> +<xsl:call-template name="escape_underscore"> +<xsl:with-param name="text" select="@name" /> +</xsl:call-template> +</xsl:variable> +<xsl:variable name="type-desc"> +<xsl:call-template name="escape_underscore"> +<xsl:with-param name="text" select="." /> +</xsl:call-template> +</xsl:variable> +**<xsl:value-of select="$type-name"/>** | <xsl:value-of select="$type-desc"/> +<xsl:text> </xsl:text> +</xsl:for-each> +<xsl:text> </xsl:text> +</xsl:for-each> +<xsl:text> </xsl:text> +</xsl:template> + +</xsl:stylesheet> +